)]}'
{
  "log": [
    {
      "commit": "36cc599dca99520d2a0df22d62c4a87fc5a536d1",
      "tree": "55b1d0b1a9cdc54db58ef77c47542c3519e5bbb7",
      "parents": [
        "6a32df5e54963ad5da82698787f1767de1aec8d8"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Fri Jul 10 08:39:31 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 10 08:39:31 2026"
      },
      "message": "siso: fix siso proxy for two phase caching\n\nBug: b/506882659\nChange-Id: I0da92c0ca5cd3b64d91315fbb4af6068bd973ae4\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8068359\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "6a32df5e54963ad5da82698787f1767de1aec8d8",
      "tree": "c56bcb14ddf17d5a6705d937aa8562271c1b7a67",
      "parents": [
        "45a768ad119d7ee3d424564348157a7f46fe44b8"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Fri Jul 10 07:48:37 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 10 07:48:37 2026"
      },
      "message": "siso: webui make lazy loading of CSS and templates thread-safe\n\nIntroduces sync.RWMutex locks for templates and CSS cache in WebuiServer\nto prevent data races and concurrent map write panics when serving\nrequests concurrently.\n\nTAG\u003dagy\nCONV\u003d36cf9a8b-a63e-4a56-828d-ab7ea19822ee\n\nBug: b/533258244\nChange-Id: I1cdd49a9979a39d4326b53a22090aff1d3b2401a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8069779\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\n"
    },
    {
      "commit": "45a768ad119d7ee3d424564348157a7f46fe44b8",
      "tree": "8a04716750c9ed6a437540d46c4089feb5288294",
      "parents": [
        "5916021bfb0b9b588c538bc4335df63df7832fba"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Fri Jul 10 07:36:49 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 10 07:36:49 2026"
      },
      "message": "siso: webui use private ServeMux to avoid exposing pprof\n\nRegistering handlers to http.DefaultServeMux causes pprof handlers\n(which are imported in main.go) to be exposed on the WebUI port.\nUse a private ServeMux instead to keep WebUI self-contained.\n\nTAG\u003dagy\nCONV\u003d36cf9a8b-a63e-4a56-828d-ab7ea19822ee\n\nBug: b/533258244\nChange-Id: Id61fa3bef98bd85a3a557b2219a4af7ab0ddc691\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8065582\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\n"
    },
    {
      "commit": "5916021bfb0b9b588c538bc4335df63df7832fba",
      "tree": "1eacf7219a002abd3b9717bb99373a14b4018743",
      "parents": [
        "c9a1522cb68ea5529681cf8b9f6e085d2a5372a4"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Fri Jul 10 06:04:06 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 10 06:04:06 2026"
      },
      "message": "siso: spawnhelper set up default log.Logger\n\ninstead of initializing new log.Logger in s.logger,\nsets up default log.Logger, so that Spawner could\nuse default log.Logger to log in the log file specified\nby -log_file\ne.g. siso_spawn_helper.\n\nChange-Id: I1c1d493ae695f371534de86eb85a19b081ad7c41\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8044846\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "c9a1522cb68ea5529681cf8b9f6e085d2a5372a4",
      "tree": "fe1be50fdab08299f7c9f9cdfab2326105619d18",
      "parents": [
        "b1aa6c314db5ec633c299d9b2207e16cde425b6b"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@chromium.org",
        "time": "Thu Jul 09 12:39:22 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 09 12:39:22 2026"
      },
      "message": "ninja: show expected output and cmdline on failure in quiet mode\n\nPreviously, when the --quiet flag was set, only the command\u0027s raw stdout\nand stderr were printed even when an action failed. This made it\ndifficult to identify which target failed or what command line was\nexecuted.\n\nWith this change, if an action fails (step.ExitCode() !\u003d 0), it prints\nthe full output result (step.OutputResult()), which includes the\nexpected output file and the command line along with stdout and stderr.\nThis is useful for debugging and rebuilding only the failed target when\nan error occurs.\n\nChange-Id: I6e8e3eefb5ed85c7712cbd6bb5ab8ee5c260e9bc\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8063605\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nAuto-Submit: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "b1aa6c314db5ec633c299d9b2207e16cde425b6b",
      "tree": "5b2efd4532880127c45c564d404a91a8bbffa1ca",
      "parents": [
        "a64823ea38f547bc2da1ad36b27447bd822bd999"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Thu Jul 09 07:43:24 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 09 07:43:24 2026"
      },
      "message": "siso: add execute/proto/tap.proto\n\ndefine proto message for tap result.\nexternal tap command is expected to generate it in protojson format.\nexternal spawn helper may set it in\nActionResult.execution_metadata.auxiliary_metadata.\n\ngo/cartfs-siso-helper\n\nBug: b/506882659\nChange-Id: Idd41967f4458a9d08e07bcc49e0e6e00564150ac\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8061380\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "a64823ea38f547bc2da1ad36b27447bd822bd999",
      "tree": "85e9387b96ebc7b1edfa2b79798ba733be8e1e2a",
      "parents": [
        "18311c4265ad12046ea4225297e88cebb1af181d"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Wed Jul 08 13:15:55 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 08 13:15:55 2026"
      },
      "message": "siso: keep out-of-workspace depfile paths uncleaned\n\npath.New resolves \"..\" by string editing alone, without following\nsymlinks. That breaks an absolute depfile path whose \"..\" crosses a\nsymlink: /lib/../x collapses to /x, but /lib points to /usr/lib, so the\nreal file is /usr/x. siso then stats the nonexistent /x on the next no-op\nbuild, finds it missing, and rebuilds.\n\nbuild.Path.FromRelativePath normalizes separators to \"/\" but does not\ncollapse \"..\", so out-of-workspace absolute paths reach the OS uncleaned\nand resolve correctly, including native Windows paths (C:\\...), which must\nstay absolute for HashFS lookups.\n\nChange-Id: I19366ced78c95fa85bc0e084ba22ec7f0c76a22a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8065144\nAuto-Submit: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "18311c4265ad12046ea4225297e88cebb1af181d",
      "tree": "8cda48660da31b2d50fdd2add88c90d48e9e03c4",
      "parents": [
        "a9209ef710b49de3c9a55825e4def8c8350b550f"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Tue Jul 07 08:23:57 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jul 07 08:23:57 2026"
      },
      "message": "siso: fix step stats line\n\n- split local to noexec + local\n- move optional stats for step (cache-write, retry, fallback) to\n  next line\n\ne.g.\n\nnoexec:1004 local:9573 remote:149 cache:85547 skip:53817\n  cache-write:0(err:0) fallback:0 retry:0\nChange-Id: Iae4cf168010bfd0f9b17b815102e0c4e45951e3d\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8050906\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "a9209ef710b49de3c9a55825e4def8c8350b550f",
      "tree": "6dadd21fc0a9c89ab091aafb09ca3b7ee66da32b",
      "parents": [
        "894ec327af5e058914420a39e96b1593db5e70ad"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Tue Jul 07 07:05:50 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jul 07 07:05:50 2026"
      },
      "message": "siso: update version string to v1.5.23\n\nv1.5.22 is rolled out as pinned version at\ngit_revision:894ec327af5e058914420a39e96b1593db5e70ad\nhttps://crrev.com/c/8051704\nhttp://ag/40829241\n\nBug: b/529533493\nChange-Id: Ic75e96be5a353543aa6c15cf7cf38102babc4e70\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8050967\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nAuto-Submit: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "894ec327af5e058914420a39e96b1593db5e70ad",
      "tree": "26b84a8bbcc80e420c5c0befd2c52b509961a90b",
      "parents": [
        "a40fd3f97d5a128487936f2214713133638b8f8b"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Mon Jul 06 11:47:25 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jul 06 11:47:25 2026"
      },
      "message": "localexec: reap the spawn helper so local CPU time is accounted\n\nSince the out-of-process spawn helper landed, non-console actions run as\nchildren of the helper instead of siso. The helper reaps each action, so\nall of their CPU time accumulates in the helper\u0027s rusage cutime. Nothing\never waited on the helper, so on siso exit it was orphaned to init and\nits cutime was discarded. getrusage(RUSAGE_CHILDREN) up the tree\ntherefore never saw the local build\u0027s CPU: A local offline build of base\nshows 49% CPU (16.7 core-s) before and 2998% CPU (991 core-s) after,\nwith identical wall time and step count.\n\nTo fix this, close the control socket on Siso shutdown so the helper\ndrains and exits, then wait for it to roll the helper\u0027s accumulated\nchild rusage up into siso.\n\nTested:\n- No-op on non-unix, where there is no helper.\n- Wall time is unchanged, so the extra wait adds no latency.\n- Single Ctrl-C interrupt cancels the build context and the function\n  returns normally, so StopHelper runs and the cancelled build\u0027s CPU is\n  still accounted (verified: a build stopped after 4s reports 97s user\n  CPU). A second Ctrl-C still hard-exits via os.Exit without waiting, on\n  purpose; the helper drains its own children on socket EOF, so nothing\n  is orphaned.\n- Added a regression test that runs a CPU-burning action through the\n  helper and asserts its CPU shows up in the process\u0027s RUSAGE_CHILDREN\n  after StopHelper. Without the wait the delta is zero.\n\nBug: 531402317\nChange-Id: I65bdcdacfb07bfb17da9e1304f10c1d48f05a483\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8045440\nAuto-Submit: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "a40fd3f97d5a128487936f2214713133638b8f8b",
      "tree": "d21363c32df7a9d6951b562ee6817c9b3bf2d439",
      "parents": [
        "ac04b00a7d7ae5af153a79531b784f0e3483a8c9"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Mon Jul 06 07:39:03 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jul 06 07:39:03 2026"
      },
      "message": "siso: factor out spawnhelper from localexec\n\nreusable for go/abfs-siso-helper\n\nChange-Id: I8e6de4f3859c36e30c83b1a03462c9c23a17cd19\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8043860\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "ac04b00a7d7ae5af153a79531b784f0e3483a8c9",
      "tree": "596577ba2b3f3e2a0e34c22e4f6b9ef5ec49a639",
      "parents": [
        "f64af4578de07031638d4af37705b8902ad6b7e3"
      ],
      "author": {
        "name": "Yuke Liao",
        "email": "liaoyuke@google.com",
        "time": "Mon Jul 06 04:37:48 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jul 06 04:37:48 2026"
      },
      "message": "siso: add directory mount support to nsjail executor\n\nEnables local action sandboxing under nsjail to mount directory inputs,\nby handling fi.IsDir() in nsjailutil.New and appending a directory\nbind-mount to the jail config.\n\nBug: b/493433937\nChange-Id: I1ed83cf0dcde4eb2b4a482f1752928121b6dc535\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8042918\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "f64af4578de07031638d4af37705b8902ad6b7e3",
      "tree": "e47bc12fab7eaa2a9a7d36a6a8a358a2dd4d78a9",
      "parents": [
        "75a9661e3d06aed835a250dd7d9a61f868bd86a5"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Mon Jul 06 02:18:17 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jul 06 02:18:17 2026"
      },
      "message": "siso: fix o11y, siso_metadata.json reported cpu cores for \u003e64 on windows\n\ncpuid doesn\u0027t account for processor groups on Windows (and neither does\nruntime.NumCPU fwiw)\n\nFurther testing found there might be a bug of similar nature on Linux,\nfollowup CL(s) will account for this.\n\nBug: b/527352649\nChange-Id: I70da02fd8591f459c6482829463dbf006a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8010146\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\n"
    },
    {
      "commit": "75a9661e3d06aed835a250dd7d9a61f868bd86a5",
      "tree": "ce6a753b409ccefa7bdc16e5ceb151deb69e2311",
      "parents": [
        "3259157eda4413b58b4832d7051338c6f4088894"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Mon Jul 06 02:09:39 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jul 06 02:09:39 2026"
      },
      "message": "siso: clarify intent of metadata CPUInfo struct\n\nWording suggested by philwo@ in\nhttps://chromium-review.git.corp.google.com/c/build/+/8010146/comment/e7c5d002_ec3454c0/\nhttps://chromium-review.git.corp.google.com/c/build/+/8010146/comment/bb46239b_43cdbbb4/\n\nBug: b/527352649\nChange-Id: I29d212cea5a377c1f5cac453dc655ec06a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037982\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "3259157eda4413b58b4832d7051338c6f4088894",
      "tree": "2c6e46c08a54049d1af27931ce38b69df2fce903",
      "parents": [
        "8bdd828a08e5eff752dc8a4b31477ffb43f464f6"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Mon Jul 06 01:41:51 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jul 06 01:41:51 2026"
      },
      "message": "siso: fix panic if external spawnhelper didn\u0027t set ExecutionMetadata\n\nif external spawnhelper didn\u0027t set ExecutionMetadata, siso panics\n  65 steps failed: panic: runtime error: invalid memory address or nil pointer dereference: goroutine 182072 [running]:\ngo.chromium.org/build/siso/build.(*Builder).Build.func4.2()\n        /usr/local/google/home/ukai/src/crbuild/build/siso/build/builder.go:810 +0x8a\npanic({0x17b48a0?, 0x2d1fc40?})\n        /usr/lib/go-1.26/src/runtime/panic.go:860 +0x13a\ngo.chromium.org/build/siso/build.(*Builder).runStep.func1(0x1f03bf580dd0)\n        /usr/local/google/home/ukai/src/crbuild/build/siso/build/run_step.go:73 +0xd9d\npanic({0x17b48a0?, 0x2d1fc40?})\n        /usr/lib/go-1.26/src/runtime/panic.go:860 +0x13a\ngo.chromium.org/build/siso/execute/localexec.LocalExec.Run({}, {0x1d51db8, 0x1f03bff8e090}, 0x1f03603d3808)\n        /usr/local/google/home/ukai/src/crbuild/build/siso/execute/localexec/localexec.go:69 +0x10d\n\nexternal spawnhelper should set ExecutonMetadata, but\nsiso should not panic with such response.\n\nChange-Id: Ie0e839758a4e0a13e6d85d380388187d0f5f469a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037663\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "8bdd828a08e5eff752dc8a4b31477ffb43f464f6",
      "tree": "b77d5639039d23624d23a066fbdeefabbaaae6e2",
      "parents": [
        "7baf99c95437ee5dbea4130229492e673e0573c8"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "message": "siso: avoid go vet unsafeptr warning in Windows mmap\n\nRead and Write turned the uintptr address from MapViewOfFile into a\n[]byte with unsafe.Slice((*byte)(unsafe.Pointer(addr)), n). go vet\u0027s\nunsafeptr check flags the uintptr-to-unsafe.Pointer conversion because\nit cannot tell the address is a valid pointer. `go vet ./...` was red on\nWindows as a result, while `go build`/`go test` stayed green because\nthey run a smaller high-confidence vet subset that omits unsafeptr.\n\nAdd a small bytePtr helper that writes the address into a *byte without\nthe flagged conversion. The address points at OS-mapped memory outside\nthe Go heap, so the garbage collector never needs to track it. This\nkeeps `go vet ./...` green on Windows without using the deprecated\nreflect.SliceHeader.\n\nChange-Id: I0969f75e44abe5ead49f6b2703633504e7e1c230\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8042874\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "7baf99c95437ee5dbea4130229492e673e0573c8",
      "tree": "197bbc0960294725ee5ded04306c31625a0f9db8",
      "parents": [
        "219e8d731bd181570cd074b163498d75271c9207"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "message": "siso: open the fs state journal with FILE_SHARE_DELETE on Windows\n\nos.Create omits FILE_SHARE_DELETE, so a leaked journal handle blocks\nremoving or replacing the file. Add osfs.Create with share-delete.\n\nFixes the flaky journal-recovery tests on Windows.\n\nChange-Id: I14d6ac511546fc9ec28e1d45c2a7553586663e6e\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8042873\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "219e8d731bd181570cd074b163498d75271c9207",
      "tree": "a6edd310af7453e4603ebc0c6dd078cafbfeba46",
      "parents": [
        "b40b5ddee4b81a7566db4a48a7c3bed80f46578f"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "message": "siso: use POSIX rename on Windows to replace open outputs\n\nFlush renames a tmp file over an output that an async digest read still\nholds open, where os.Rename (MoveFileEx) fails with ERROR_ACCESS_DENIED.\nUse SetFileInformationByHandle POSIX rename instead.\n\nFixes the TestWriteDataFlush Windows flake.\n\nChange-Id: I63b9392b0946688bdf27c526d6e0cf5bad0c8871\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8042872\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "b40b5ddee4b81a7566db4a48a7c3bed80f46578f",
      "tree": "8883bbe5608304dbfc56cbbbef4c4beefae54399",
      "parents": [
        "2d514c5af4ac6e4c7a1f73e67df61de7b2bca1ab"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 11:37:04 2026"
      },
      "message": "Bump and sync deps in all go.mod files\n\nAfter merging changes in hashigo, kajiya, and siso this ensures that all\nprojects are referring to each other at their latest versions.\n\nAlso bump \u0026 sync the other dependencies in their go.mod files.\n\nChange-Id: Ia39215b9399f5e99f18be964ab03bbbd98a9e369\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8042902\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "2d514c5af4ac6e4c7a1f73e67df61de7b2bca1ab",
      "tree": "f28200de2dfdac9f12abe4542bff559c230783ed",
      "parents": [
        "87702f999b9a5c33621bd55626bb8d14ea7613a4"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "siso: declare the ResultStore file HashType matching the digest function\n\nResultStore file records declare the HashType matching the digest\nfunction (SHA1/MD5/SHA256; unspecified otherwise, as the proto has\nno newer values).\n\nChange-Id: I72059edf4bf0beef4e8e976949d05331fe1065e5\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037940\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "87702f999b9a5c33621bd55626bb8d14ea7613a4",
      "tree": "7a4fe9fbfa921960a9fd50706c2fd54aed1a3bfa",
      "parents": [
        "175522c4d3b8e0a49f20416efe9a2d7f34f3ccb0"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "siso: handle digest functions in siso fetch and the auxiliary output log\n\n\"siso fetch\" accepts the resource-name format Client.FileURI emits\nfor functions that omit the {digest_function} segment, inferring\nthe function from the hash length unless the configured function\nalready matches it; an explicit segment always wins.\n\nThe failure/auxiliary output log\u0027s suggested \"siso fetch\" command\nincludes -reapi_digest_function for non-default builds.\n\nChange-Id: I7a2336eb86970e5c299c3198c4c8d50caf10c310\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035779\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "175522c4d3b8e0a49f20416efe9a2d7f34f3ccb0",
      "tree": "692c8e9b309ada457f884323fc582d68dfb731b8",
      "parents": [
        "61be5a989d1374b6700c509985482d5123cd5e88"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "siso: interpret persisted fs state under its recorded digest function\n\nRead-only consumers of persisted state (fs diff, fs status, query\ndeps, query ide_analysis, sandbox) interpret it via\nhashfs.StateDigestFunction, so states from non-sha256 builds are not\ndiscarded as mismatched.\n\n\"siso fs flush\" instead fails with an actionable error on mismatch,\nsince it must fetch the recorded blobs from CAS under the client\u0027s\nfunction.\n\nChange-Id: I9f5b238ae3c615e23021887856f5b312f9a7a520\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035778\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "61be5a989d1374b6700c509985482d5123cd5e88",
      "tree": "3fe4899583f30b0080402e3dfe014b980e533f40",
      "parents": [
        "bab2fdf642a4e92e837f53fd982d3dbf899a71ad"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "siso: record the digest function in persisted fs state\n\nPersisted digests are only valid for the function that produced them,\nand nothing downstream could catch a mixup: SHA-256 and BLAKE3 digests\nare both 64 hex chars.\n\nPersisted fs state now records the function\n(pb.State.digest_function) and is discarded on mismatch when loaded,\nforcing a cold rehash instead of trusting stale digests under the new\nfunction. This also means an offline rebuild of a non-SHA-256 out dir\nkeeps its fs state instead of discarding it under an implied SHA-256.\n\nThe journal starts with a \"digest_function\u003d\u003cname\u003e\" header line for the\nsame reason: a journal left behind by a crashed build under a\ndifferent function is discarded instead of being merged into a\nmatching-function base state. The header is a JSON string, which older\nreaders fail to parse as an entry and ignore; headerless legacy\njournals are treated as SHA-256.\n\nStateDigestFunction exposes the recorded function for read-only\nconsumers that must interpret a state as recorded rather than under\nthe currently configured function.\n\nChange-Id: I653d13630132eb1b7cef3a4c53d2f86e62992264\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035777\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "bab2fdf642a4e92e837f53fd982d3dbf899a71ad",
      "tree": "8bdb94361f943b1640287e9a07eebac074e40799",
      "parents": [
        "c5440494dd505511ddbbf80f4fe717ab1a10503c"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "siso: use hashigo for digests\n\nReplace siso/reapi/digest with the shared hashigo/digest module and\nadopt its instance-based multi-hash API. The blob store and data\nsources move to the new siso/blob package, and the fetch-timeout\nhelpers to siso/reapi/fetch.\n\nThe content digest function is resolved from the -reapi_digest_function\nflag - also for local-only and -offline builds - and threaded\nexplicitly:\n\n- reapi.Client, hashfs.HashFS and osfs.OSFS (via their Options),\n  merkletree.MerkleTree, importer.Importer, and resultstore.Uploader\n  carry a digest.Function.\n\n- The blob constructors and the remaining free functions\n  merkletree.Traverse, reapi.ParseTree, hashfs.StateMap,\n  execute.ResultFromEntries, and ninjabuild.NewStepConfig take it as a\n  parameter.\n\n- Client.Init validates the configured function against the server\u0027s\n  cache capabilities and, when remote execution is offered, its\n  execution capabilities.\n\n- \"siso isolate\" rejects mismatched -src_cas_digest_function /\n  -dst_cas_digest_function pairs, and build.New rejects a hashfs\n  whose digest function differs from the REAPI client\u0027s.\n\n- The xattr fast path only trusts google.digest.sha256 when the\n  active function is SHA-256.\n\n- Batch upload size accounting includes the encoded digest_function\n  request field, so a batch packed exactly to the byte limit stays\n  within it.\n\nChange-Id: Ib1f41efeb99397638ed17254adf7681b004da425\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8034486\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nSLSA-Policy-Verified: SLSA Policy Verification Service \u003cdevtools-gerritcodereview-exitgate@google.com\u003e\n"
    },
    {
      "commit": "c5440494dd505511ddbbf80f4fe717ab1a10503c",
      "tree": "14b398027e9c5cbf0442655495a7798c6a0e95a3",
      "parents": [
        "6525305d6fb21352a85fdaf7dd9c958674e0d147"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "kajiya: support multi-hash digest functions\n\nSupport all ten REAPI digest functions. The set of functions a server\nactually advertises and accepts is chosen with the new\n-digest_functions flag (default \"sha256\");\nserver.ParseDigestFunctions rejects unknown names, duplicates, and\nambiguous sets in which two functions that omit the ByteStream\n{digest_function} resource-name segment share a hash length (MD5 and\nMURMUR3, both 32 hex chars), so only one of those two can be enabled\nat a time.\n\nEvery request resolves its digest function once at the RPC boundary\nvia shared server.Config helpers (ResolveFunction plus per-digest\nResolveWith for batch requests, ResolveDigest,\nResolveResourceNameFunction): an explicit request enum or ByteStream\n{digest_function} segment must be in the advertised set, and omitted\nsegments and UNKNOWN enums are inferred from the hash length and the\nadvertised functions per the REAPI rules - unambiguous thanks to the\nstartup check, so MURMUR3 works over ByteStream when enabled. The\nrecommended gRPC receive limit is sized for the longest advertised\nhash, so a batch upload at the advertised byte limit fits even under\nSHA-512.\n\nChange-Id: Ia1deffacab97b48044091504a4991a84bbd7e709\nNo-Without-Go-Work: siso reapitest tracks the in-tree kajiya API; the kajiya pin bump follows right after this stack lands\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8034487\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "6525305d6fb21352a85fdaf7dd9c958674e0d147",
      "tree": "c28287fcde31bec3059a73e0086af4758bf3fc93",
      "parents": [
        "3473704676b55d2b01a82a0c65cedcfdd8c225e2"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "kajiya: namespace in-memory caches by digest function\n\nIn-memory caches keyed by bare hash could collide across digest\nfunctions once more than one is enabled: SHA256TREE agrees with\nSHA-256 on blobs up to 1024 bytes, and GITSHA-1 is SHA-1 over framed\ncontent. Namespace them by function: singleflight and execution-dedup\nkeys share one blobstore.DigestKey helper, and the materialized-tree\ncache and the FUSE sandbox\u0027s shared dir-inode cache include the\nfunction in their keys and paths.\n\nChange-Id: I75a26a667d2a15e95e3321a25b80a75f94005fa0\nNo-Without-Go-Work: siso reapitest tracks the in-tree kajiya API; the kajiya pin bump follows right after this stack lands\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037944\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "3473704676b55d2b01a82a0c65cedcfdd8c225e2",
      "tree": "370c4c0c0aeff9ca67e11d34ecebfa6c4f750083",
      "parents": [
        "d67de3189258a8cb925cec8d8ae995bf900fd4bc"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "kajiya: store each digest function\u0027s data under its own directory\n\nOn disk, every digest function\u0027s blobs and action results live under\ntheir own \u003cfunction\u003e/ subdirectory, so same-length hashes from\ndifferent functions can never collide. The CAS and action cache\nprovision, seed, and validate roots only for the configured set\n(blobstore.EnsureFunctionRoots, shared by both stores, also returns\nthe per-function root paths that Path uses instead of re-deriving\nthem per digest); data under other functions\u0027 roots is left\nuntouched, so narrowing the configured set later never invalidates or\nbreaks an existing store.\n\nLegacy caches, which stored SHA-256 entries at the data dir root (flat\nor in {00..ff} shard dirs), are migrated into sha256/ on startup:\nshard directories are renamed wholesale when possible, with a per-blob\nfallback that makes an interrupted migration resumable; renames\nreplace an existing destination explicitly (os.Rename cannot\noverwrite on Windows), and EnsureLayout then normalizes the\nflat/sharded layout inside the keyed root, probing the 256 possible\nshard dirs instead of listing the whole CAS root. A leftover legacy\nshard dir that cannot be removed is warned about rather than counted\nas migrated again on every startup.\n\nChange-Id: Ia7e71a2e647b7edf6f1a303f56ded98cddaf7f29\nNo-Without-Go-Work: siso reapitest tracks the in-tree kajiya API; the kajiya pin bump follows right after this stack lands\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037943\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "d67de3189258a8cb925cec8d8ae995bf900fd4bc",
      "tree": "11355636dfdf1353555a0636c5822ede06022573",
      "parents": [
        "36a2f9555b835f9ed9e032c0830778a969b571e6"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "committer": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 09:43:55 2026"
      },
      "message": "kajiya: adopt shared hashigo/digest\n\nReplace kajiya/digest with the shared hashigo/digest module and adopt\nits instance-based multi-hash API: all hashing is methods on a\ndigest.Function handle, and digests themselves stay pure {hash, size}\nvalues.\n\nThe function is threaded explicitly through the CAS, action cache, and\nexecution paths: the store methods, model.Action (via a new Fn field),\nmodel.LoadAction, the sandbox, and the FUSE filesystem all take or\ncarry a digest.Function, and MissingBlobsError records the function of\nits missing blobs. The RPC layer still accepts only SHA-256 and passes\ndigest.SHA256 at every boundary; behavior is unchanged.\n\nChange-Id: I6cc4c8624eed07d19489905e93ae718574e42ce0\nNo-Without-Go-Work: siso reapitest tracks the in-tree kajiya API; the kajiya pin bump follows right after this stack lands\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037942\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "36a2f9555b835f9ed9e032c0830778a969b571e6",
      "tree": "89f55b129f4bbcb02aa12985621880b59936ae0f",
      "parents": [
        "9351770cfa365941bdca54cf9dcf5f01946f3863"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 07:26:47 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 07:26:47 2026"
      },
      "message": "kajiya: fix actioncache validation of output directories\n\nvalidateAction flattened the action digest instead of an output\ndirectory\u0027s RootDirectoryDigest, which made startup validation fail\nfor any ActionResult with output directories.\n\nChange-Id: I057d9be8a92cd198374a601b1c078a96af5d8b37\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037941\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "9351770cfa365941bdca54cf9dcf5f01946f3863",
      "tree": "cbb27caf152b494728a95cc6a5347e04dcccb137",
      "parents": [
        "850dead2435a1e7a0db68a802c30741855b2d79e"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 07:26:32 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 07:26:32 2026"
      },
      "message": "siso: close the separate CAS connection in Client.Close\n\nWhen -reapi_cas_address points at a different backend, the separate CAS\nconnection was never closed on any path. Client.Close now closes it\nalongside the main connection, and Init\u0027s capabilities-error cleanup\ngoes through Close so it releases both connections too.\n\nChange-Id: I05c35005221dcca1cdf4c7492e315ff7df270115\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035776\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "850dead2435a1e7a0db68a802c30741855b2d79e",
      "tree": "a516880f60ec944a0cd66916f5a28bb517693e9f",
      "parents": [
        "381a568c0f87ef13cae6f749990dfbbf583597ff"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 02:23:23 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 02:23:23 2026"
      },
      "message": "siso: resolve trailing-slash dir targets to the bare-name hashfs entry\n\nA directory target is named with a trailing slash throughout the build\ngraph (\"gen/\"), but the hashfs directory-tree walkers treated the\ntrailing empty component as a descent step and always missed:\nlookupEntry returned not-found for a recorded entry, and storeEntry\nfailed with \"bad fname?\". A Stat(\"obj/extracted/\") therefore never hits\nthe fast path: it takes the slow path, Lstats the local disk, and tries\nto store the probe result under the cleaned bare name.\n\nFor a build-without-the-bytes directory output, that probe is what\ncrrev.com/c/8028129 defused: before diskMiss, the negative probe entry\nevicted the recorded directory (the destructive half of this same root\ncause), while with diskMiss the store is rejected and the caller gets\nthe kept entry, so slashed Stats are already answered correctly today.\nWhat remains is cost and layering: every trailing-slash stat of a\nCAS-only directory output misses the in-memory entry, pays a disk Lstat\nplus a rejected store, and leans on shouldKeep\u0027s eviction guard for a\ncorrect answer instead of on the lookup itself.\n\nTrim trailing slashes at the walkers, the chokepoint every hashfs\nlookup/store path goes through, so a slashed name reaches the same\nentry as the bare name on the fast path. mtimecheck already carries\nDirTargetPath workarounds at its call sites for the same mismatch;\nthose can be removed in a follow-up now that the chokepoint normalizes.\n\nChange-Id: I85dab7ec9d92304fa4487e715ce2b3208eef1ca5\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8037820\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "381a568c0f87ef13cae6f749990dfbbf583597ff",
      "tree": "665ce84fff11539c7165d7a2d6053d75c61b8de3",
      "parents": [
        "dd2dae5d3d086580e76a59f70950a78452c9f7e5"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 02:23:16 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 02:23:16 2026"
      },
      "message": "siso: drop the digest/remove serialization in flushRemove\n\ndigestLock/digestFnames made flushRemove wait for any in-flight digest\ncomputation of the same path before removing it, to avoid a Windows\nERROR_SHARING_VIOLATION between the digest\u0027s open read handle and the\nremoval. Since https://crrev.com/c/8030661, every local digest read goes\nthrough openRead, which shares FILE_SHARE_DELETE, so the removal is\naccepted while the read is open and the guard has nothing left to\nprevent.\n\ndigestLock was a global mutex taken twice per digest computation and\nheld across the Remove syscall, stalling every digest start while any\nfile was removed in flush, on all platforms, though it only ever\nserved Windows. We will not miss it.\n\nChange-Id: I9d50c8ade4d19f6c93c7318458161e541da3bd65\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8036621\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "dd2dae5d3d086580e76a59f70950a78452c9f7e5",
      "tree": "20c54b663d91c6aa784282b80c1b5673485b7e40",
      "parents": [
        "b22977ba0663335672d9b8ce0aeda9acab6965c2"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 02:23:01 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 02:23:01 2026"
      },
      "message": "siso: rely on Windows\u0027 default POSIX delete for stale outputs\n\nhashfs reads files with FILE_SHARE_DELETE (openRead), so removing a\nstale output while an in-flight digest read holds it open succeeds. For\nthe removal to be useful, the name must also leave the namespace\nimmediately so the path can be recreated as a different type (a\ndirectory output after ClearStaleFileForDirOutput, the flush\ntype-change transitions); a delete-pending name fails those with\nERROR_ACCESS_DENIED / ERROR_DIR_NOT_EMPTY.\n\nVerified on Windows 11 25H2: DeleteFile applies POSIX delete semantics\nby default on NTFS and ReFS, so plain os.Remove/os.RemoveAll already\nfree the name immediately while a FILE_SHARE_DELETE reader is open. On\nexFAT, FILE_DISPOSITION_POSIX_SEMANTICS is unsupported\n(ERROR_INVALID_PARAMETER), so setting it explicitly cannot help there\neither: the name stays pending until the last handle closes no matter\nhow it is deleted. An explicit disposition would thus only benefit\nWindows 10 1607-1809 on NTFS, which siso does not target, so rely on\nthe platform default rather than reimplementing it.\n\nRoute HashFS.RemoveAll through OSFS.RemoveAll so the\nClearStaleFileForDirOutput and dead-output cleanup paths get OSFS\u0027s\nmetrics and slow-operation logging, and add Windows regression tests\nthat fail if the immediate name reuse this relies on regresses.\n\nChange-Id: Iacb9e8d03730e68afa5e8f8d78feb9188393350f\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8036620\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "b22977ba0663335672d9b8ce0aeda9acab6965c2",
      "tree": "cf284ad5830b699195a6b8e0b8654f3fc4271eae",
      "parents": [
        "deca2a664b6e44242c4ca9b47937aa7d307da848"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 02:18:21 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 02:18:21 2026"
      },
      "message": "siso: open files for read with FILE_SHARE_DELETE on Windows\n\nhashfs reads a file\u0027s bytes to compute its digest, often asynchronously\n(lazyCompute schedules the read on a background digester goroutine). The\nread goes through FileSource.Open, which used os.Open. On Windows\nos.Open does not pass FILE_SHARE_DELETE, so while that read is in flight\nthe file cannot be removed: a concurrent os.RemoveAll of the same path\nfails with a sharing violation (\"being used by another process\").\n\nThat is exactly what raced ClearStaleFileForDirOutput: a Stat schedules\na digest, and the immediately-following removal of the stale file loses\nthe race against the still-open digest handle.\n\nAdd openRead: on Windows it opens via CreateFile with FILE_SHARE_READ |\nFILE_SHARE_WRITE | FILE_SHARE_DELETE (plus FILE_FLAG_BACKUP_SEMANTICS to\nmatch os.Open), so a removal is accepted while a read is open and the\ndelete completes once the last handle closes. Elsewhere openRead is\nplain os.Open. This mirrors POSIX semantics and removes the race\nregardless of digest timing.\n\nChange-Id: I98a21768d50515b51d5142d0d0ab100332f8f0ee\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8030661\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "deca2a664b6e44242c4ca9b47937aa7d307da848",
      "tree": "4f6f3db5864072a35f15e344a21fb75530e0467f",
      "parents": [
        "7c592218ffe44cc42769cf3081fefe5d170b2b63"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Sun Jul 05 02:09:21 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Jul 05 02:09:21 2026"
      },
      "message": "scandeps: normalize include paths in pathJoin\n\nfsview.pathJoin built the scanned dependency path with path.FromClean,\nwhich performs no normalization. The path text comes verbatim from an\n#include directive. On Windows it can contain backslashes and redundant\nslashes, because generated headers there are written with Python\u0027s\nos.path.join and string concatenation. For example:\n\n#include \"v8//third_party/inspector_protocol\\crdtp/error_support.h\"\n\nThe raw value flowed into the scan result set and from there into the\nremote (RBE) input tree. There the header was placed under a wrong\ndirectory component (\"inspector_protocol\\crdtp\", plus an empty component\nfrom the \"//\"). The on-disk existence check still passed, because\npath.JoinRoot normalizes on Windows for the stat, so siso started the\nremote compile. The remote clang-cl treats \"\\\" as a separator and\nresolved the include to \".../crdtp/error_support.h\". That file was not\nat this path in the input tree, so the compile failed with \"file not\nfound\". Only Windows hosts were affected: only headers generated on\nWindows contain backslashes. Linux builders emit forward slashes.\n\nThis regressed when path.Path was introduced. The previous code\nnormalized these paths with filepath.ToSlash(filepath.Join(...)) at the\nfilesystem-lookup boundary, and filepath treats \"\\\" as a separator on\nWindows.\n\nUse path.New (filepath.ToSlash + Clean), the documented constructor for\nuntrusted input, instead of path.FromClean. pathJoin now returns a clean\nforward-slash path.Path per the type invariant. path.New is\nallocation-free for the already-clean common case.\n\nAdd TestScanDeps_BackslashInclude (Windows-only). It covers a generated\nheader that includes another header via a path with a backslash and a\nredundant slash.\n\nChange-Id: I5ecce0c4d318aa5e149ec72e39a9a676ed85142c\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8040869\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nAuto-Submit: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "7c592218ffe44cc42769cf3081fefe5d170b2b63",
      "tree": "e64c84dd1903490b49833ad8107bc66ff17871d4",
      "parents": [
        "c94539da8d593529e8590a26beaf94f635a241c2"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jul 03 23:02:54 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 23:02:54 2026"
      },
      "message": "merkletree: document and pin the buildTree duplicate-node invariant\n\nThe no-duplicate-names invariant is enforced in buildTree (identical\nre-entries collapse, conflicting ones error), not in Set, which is\neasy to misread as a missing check. Document the division of labor\nand pin it with tests so removing the buildTree pass fails loudly.\nNo functional change.\n\nChange-Id: Ib7aeab9237f61976114f160ee994fad5e0612f95\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8038861\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "c94539da8d593529e8590a26beaf94f635a241c2",
      "tree": "7f2680c89ca5acbac8ee149edc2ea64213759073",
      "parents": [
        "521e37a4c1b35de67ff62d8516946769669aa8be"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jul 03 23:00:57 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 23:00:57 2026"
      },
      "message": "build: scope dedupInputs to Windows remote workers\n\nEvery cmd.Inputs producer guarantees case-sensitive uniqueness and\nmerkletree buildTree enforces it at finalization, so the per-step\nsweep re-checked an established invariant on every platform. Keep\nonly what nothing upstream provides: collapsing case-insensitive\nduplicates (Windows.h vs windows.h) for Windows remote workers.\n\nChange-Id: I76a56cd033968fb1005e962d24e7724931642bf6\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7775594\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "521e37a4c1b35de67ff62d8516946769669aa8be",
      "tree": "b7c82152b31eb8197f2c452c0af6b345f8bad654",
      "parents": [
        "ec7ec10b4cd6d7c429c398a1d6f9187f92306a83"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jul 03 22:58:51 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 22:58:51 2026"
      },
      "message": "path: cache JoinRoot results in sharded map to skip repeated joins\n\nJoinRoot runs ~90M times per chrome build against ~1M distinct\n(root, rel) pairs, allocating a joined string plus a Clean per call.\nMemoize the results in a 64-shard RWMutex-protected map, which also\ninterns repeated joins to a single string.\n\nBench (chrome cache-warm, branch tip vs origin/main, n\u003d3):\n  alloc_space 116.4 -\u003e 98.8 GB (-15%); join/concat churn\n  (bytealg.MakeNoZero) 15.6 -\u003e 0.65 GB; wall parity; peak RSS -0.8 to\n  -1.0 GB. Tip-level numbers; the Path type shares credit.\n\nChange-Id: Ifcfd314b5b02e3cea66a91bf8db55302b6c8b061\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776389\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "ec7ec10b4cd6d7c429c398a1d6f9187f92306a83",
      "tree": "a5bd3b947e9a8165db5b2e926cdcb7f03009f2ae",
      "parents": [
        "5d3ee9e1c0913e9cfad85665e55eddfdbe22f5bb"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jul 03 22:58:46 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 22:58:46 2026"
      },
      "message": "path: introduce path.Path type for normalized forward-slash paths\n\nBuild-relative paths were ad-hoc strings, re-normalized with\nfilepath.ToSlash/Join/Clean at every use. Path is a string type\nnormalized once at construction (forward slashes, cleaned, Windows\ndrive and UNC roots handled on every host, so parent walks terminate\nand relative results stay slash-form) and flows through hashfs,\nexecute.Cmd, and the deps pipeline; OS-native strings remain only at\nsyscall boundaries.\n\nChange-Id: I9723c2b426ec4f8bdaffcd956a540c6a8a7f6e4c\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7767209\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "5d3ee9e1c0913e9cfad85665e55eddfdbe22f5bb",
      "tree": "cecb0f4ec49e8a6b1875a8744a21e821ac500986",
      "parents": [
        "39aa1a49164575a30e6e53351dd713aa0e9f7e56"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 22:10:54 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 22:10:54 2026"
      },
      "message": "siso: surface RemoveAll\u0027s on-disk error instead of swallowing it\n\nHashFS.RemoveAll ran os.RemoveAll, then recorded a not-exist entry via\nhfs.directory.store and returned that store call\u0027s error. The store\nresult overwrote the os.RemoveAll error in the same variable, so a\nfailed on-disk removal was masked as success: the function returned\nnil even when the file was still there.\n\nThis is inconsequential on POSIX, where unlinking a file with an open\nhandle always succeeds. On Windows it is not: os.RemoveAll of a file\nthat another handle has open without FILE_SHARE_DELETE fails with a\nsharing violation, and callers were told the path was gone when it was\nnot. ClearStaleFileForDirOutput then believed it had cleared a stale\nfile for a directory output, and ninjabuild\u0027s dead-output cleanup\nbelieved it had removed a dead directory, when neither had happened.\n\nKeep the not-exist bookkeeping on the in-memory entry, but return the\nos.RemoveAll error to the caller (falling back to the store error only\non a successful removal). ClearStaleFileForDirOutput no longer needs\nits ErrNotExist special case: RemoveAll now returns nil on success.\n\nDead-output cleanup is best-effort, so CleanDead must not turn the now\nvisible error into an abort of the whole build before any step ran --\ne.g. on Windows when an antivirus scanner or a lingering child process\nholds a dead output open without FILE_SHARE_DELETE. CleanDead warns and\ncontinues, keeping the error surfaced for RemoveAll\u0027s other callers.\n\nChange-Id: I1531ea7433a638235de28670f7bb83ca2534b24e\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8030660\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "39aa1a49164575a30e6e53351dd713aa0e9f7e56",
      "tree": "e0d2c92bddf99fb12e404cf08ff39a5458caa904",
      "parents": [
        "ba4e47b4732c460b50b37c494dfe161f07d88b84"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:55:32 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:55:32 2026"
      },
      "message": "hashigo: add support for SHA256TREE\n\nSHA256TREE per the REAPI remote_execution.proto: a binary Merkle tree\nover 1024-byte leaves where blobs of one chunk or less hash as plain\nSHA-256, and interior nodes combine two subtree hashes with a single\nSHA-256 block-cipher invocation using the SHA-384 initial values and\nno Davies-Meyer feed-forward. The streaming hasher uses a BLAKE3-style\nchunk stack, so state stays logarithmic in the blob size. SHA256TREE\nshares its 64-hex length with SHA-256 and therefore always carries an\nexplicit \"sha256tree\" resource-name segment.\n\nKnown-answer vectors are the upstream REAPI test vectors.\n\nChange-Id: I814d20985ecc399f687842fdf670788b1a046cdd\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035775\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "ba4e47b4732c460b50b37c494dfe161f07d88b84",
      "tree": "020d2f83e522a87828d56b3dbf94860077806b88",
      "parents": [
        "89c33282347f8249935ad975f02b29e83ad4e777"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:50:05 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:50:05 2026"
      },
      "message": "hashigo: add support for VSO\n\nVSO-Hash (Microsoft BuildXL \"PagedHash\") as a streaming hash.Hash:\nSHA-256 per 64 KiB page, a block hash over each 2 MiB block\u0027s page\nhashes, and a rolling blob id folded per block, finalized as\nrollingId || algorithm-id byte (33 bytes, 66 hex). State is bounded to\none partial page plus one block\u0027s page-hash concatenation. VSO omits\nthe {digest_function} resource-name segment per the REAPI grammar.\n\nKnown-answer vectors are the authoritative values from BuildXL\u0027s\nVsoHashTests.BlobIdsDoNotChange, across page- and block-size\nboundaries.\n\nChange-Id: Ida9a235c2b1082aa89307649502c9b562e0e9297\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035774\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "89c33282347f8249935ad975f02b29e83ad4e777",
      "tree": "fc544d2806e8bcb9f0dee57d4a140439e4da5e46",
      "parents": [
        "8bf59f0d9fa7cac0979cfa1caeb1a73978f01939"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:49:56 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:49:56 2026"
      },
      "message": "hashigo: add support for MURMUR3\n\nUses github.com/twmb/murmur3 (MurmurHash3 x64_128, seed 0); the 16-byte\ndigest is the library\u0027s canonical serialization, h1 then h2, each\nbig-endian.\n\nPer REAPI spec, MURMUR3 must omit the {digest_function} resource-name\nsegment. Its 32-hex length collides with MD5, so InferOmitted must keep\nresolving 32 to MD5 - there\u0027s just no reliable way to infer whether a\nhash of that length in ByteStream URLs is an MD5 vs. a MURMUR3 digest.\n\nInferOmittedFrom (introduced with the multi-hash framework commit)\ninstead resolves an omitted segment against a server\u0027s advertised set.\nMURMUR3 adds the first hash-length collision among omitted-segment\nfunctions, making that inference load-bearing, so this commit adds the\ntest that exercises it.\n\nKnown-answer vectors are cross-checked against the C reference\nimplementation via the twmb/murmur3 test corpus.\n\nChange-Id: I6cd4cc13dfced4d83ee832e588641dc8ca93d2d6\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035773\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "8bf59f0d9fa7cac0979cfa1caeb1a73978f01939",
      "tree": "131d859a3730e0d51e22fd5f108dcdad3dad7749",
      "parents": [
        "dadd20ae73b5d956f8cd609625312fee44776b0f"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:49:49 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:49:49 2026"
      },
      "message": "hashigo: add support for SHA384 and SHA512\n\nPlain crypto/sha512 (which provides both), with the stack-based\none-shot Sum384/Sum512 for FromBytes. Both omit the {digest_function}\nresource-name segment per the REAPI grammar; their 96- and 128-hex\nlengths are unique among the omitted-segment functions.\n\nKnown-answer vectors are the FIPS 180-4 example vectors.\n\nChange-Id: I93235618f8f37cb08a6e1dcaff54370f371a5490\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035772\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "dadd20ae73b5d956f8cd609625312fee44776b0f",
      "tree": "72c3874933e8520a84082b641a6333cea26cb69f",
      "parents": [
        "dce52265c8dc0b391e1044ec790a77afcd797d3d"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:49:39 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:49:39 2026"
      },
      "message": "hashigo: add support for MD5\n\nPlain crypto/md5 with the stack-based md5.Sum one-shot for FromBytes.\nMD5 omits the {digest_function} resource-name segment per the REAPI\ngrammar.\n\nKnown-answer vectors are from the RFC 1321 test suite.\n\nChange-Id: I428a96705049b1be91c07b0e749b946e625da20d\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035771\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "dce52265c8dc0b391e1044ec790a77afcd797d3d",
      "tree": "e024b84dbda8223666514feb7867525d24361955",
      "parents": [
        "81a4862972d16480fb5adf328040cf882f4bfc9b"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:49:21 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:49:21 2026"
      },
      "message": "hashigo: add support for BLAKE3\n\nUses github.com/zeebo/blake3, which provides both a streaming hash.Hash\nand an allocation-free one-shot Sum256 for the FromBytes hot path. Per\nthe REAPI grammar BLAKE3 shares its 64-hex length with SHA-256, so its\nByteStream resource names always carry an explicit \"blake3\" segment.\n\nThe empty-input known-answer vector is the official BLAKE3 test vector.\n\nChange-Id: Iffd593c6d83c360bc44a55b3f3a846b74a92eff7\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8035770\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "81a4862972d16480fb5adf328040cf882f4bfc9b",
      "tree": "183f988a99c337256f8be3363365c436f6c95e6a",
      "parents": [
        "6c5fe8ce6814583f8aeb29e1430c6476d613d93b"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:36:06 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:36:06 2026"
      },
      "message": "hashigo: support multi-hash digest functions\n\nThe package serves all consumers through one instance-based API: a\nsmall comparable Function handle wraps a hasher registry entry and\ncarries all digest computation (FromBytes/FromReader/FromFile/\nFromMessage), validation (Validate/FromProto), per-function constants\n(Empty/EmptyTree/HexLen), and REAPI resource naming\n(ResourceNameSegment).\n\nThere is no process-global \"current function\" and no function field on\nDigest: callers hold the Function they need and thread it explicitly, so\nDigest stays a pure {hash, size} value that is safe as a map key, and\n\"unsupported digest function\" errors are confined to the constructors\n(Lookup, ParseFunction, FunctionByName).\n\nThis commit registers SHA-256, SHA-1, and GITSHA-1 (git blob framing,\nwhich is why the streaming APIs take the content size up front), with\nknown-answer tests cross-checked against git. Follow-up commits add\nBLAKE3, MD5, SHA-384, SHA-512, MURMUR3, VSO, and SHA256TREE.\n\nUNKNOWN handling follows the REAPI inference rules: Lookup\ncanonicalizes UNKNOWN to SHA-256, InferOmitted infers an omitted\ndigest function from the hash length alone (for clients parsing\nresource names), and InferOmittedFrom resolves it against a server\u0027s\nadvertised set.\n\nFunction accessors are cheap enough for per-digest hot paths such as\nstorage keys and resource-name segments: the lowercase name returned\nby String() is precomputed at registry construction, so no accessor\nallocates (guarded by BenchmarkFunctionString).\n\nChange-Id: I57aba2f8f494069ac7e98c18c26156b5e3f56f49\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8034485\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "6c5fe8ce6814583f8aeb29e1430c6476d613d93b",
      "tree": "1679479da7cabcd4be5822b5da4309d92e1a991a",
      "parents": [
        "b447bdcc4c2969195138b1ff91b1e57e70680604"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 10:34:39 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 10:34:39 2026"
      },
      "message": "hashigo: new module with digest package extracted from siso\n\nExtract the digest computation core of siso/reapi/digest as the new\ngo.chromium.org/build/hashigo module: the Digest type, the empty\ndigests, and the byte/reader/proto hashing primitives.\n\nBypass-Check-License: New files are copies of existing files in siso/\nChange-Id: If12d535eec9c7a7df903065554ebda76999533f8\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8034484\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "b447bdcc4c2969195138b1ff91b1e57e70680604",
      "tree": "5c75d6c0c3476809e582e2864c017221c17a40d6",
      "parents": [
        "9a5f10021cf89941d352ae17427f2a9828455a8b"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Fri Jul 03 03:27:54 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 03:27:54 2026"
      },
      "message": "siso: allow external spawn helper\n\nfor go/abfs-siso-helper\n\n- add -spawn_helper flag in `siso ninja`.\n  if given, it launches the command with -conn_fd, -log_file flags.\n  otherwise, it launches `siso spawn-helper` with same flags.\n- rename flag -conn-fd/-log-file to -conn_fd/-log_file\n\nChange-Id: Ifb47bb2020a426a74d57f962ab67d29f4611c247\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8034483\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "9a5f10021cf89941d352ae17427f2a9828455a8b",
      "tree": "c3b4cc67012dc33012652579b4aed4093da298d0",
      "parents": [
        "b2cd2461e4d506a03184e9143fa0cd0ef9d2b987"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 02:43:08 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 02:43:08 2026"
      },
      "message": "golangci: migrate gomodguard to gomodguard_v2\n\nThe gomodguard linter is deprecated since golangci-lint v2.12.0 in\nfavor of gomodguard_v2. Switch to the new linter to silence the\ndeprecation warning.\n\nChange-Id: Idd2704bac9f61827a58865de7f8a1e032f2bb17c\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028303\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "b2cd2461e4d506a03184e9143fa0cd0ef9d2b987",
      "tree": "af73f096c55638a598e0dd9aa276c2c468d4ad64",
      "parents": [
        "30f2b4d0cb233126d5bfe0ce6dab74f0f57cccd7"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Fri Jul 03 02:03:35 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 02:03:35 2026"
      },
      "message": "upgraded github.com/klauspost/compress v1.18.7 \u003d\u003e v1.19.0\n\nhttps://github.com/klauspost/compress/releases/tag/v1.19.0\n\nChange-Id: I72ebd5966e92ac92fbbdf6d39fe6a696a00e684b\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8033820\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "30f2b4d0cb233126d5bfe0ce6dab74f0f57cccd7",
      "tree": "588a88406d542b2166c661c5b44cdba914b19bab",
      "parents": [
        "31d5552e912dffa0950fc3936373ce0f4edb0197"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Fri Jul 03 00:10:41 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 03 00:10:41 2026"
      },
      "message": "siso: heal on-disk type mismatches when flushing\n\nFlush materializes a hashfs entry to local disk. When the type recorded\nin hashfs differs from what is already on disk (e.g. an incremental\nbuild where an output changed between a regular file, a symlink and a\ndirectory), the flush could fail to replace the stale entry:\n\n- flushRegularFile returned EISDIR when a directory was on disk, and\n  never removed it.\n- flushSymlink used os.Remove on the EEXIST retry, which fails ENOTEMPTY\n  for a non-empty directory.\n- flushDir called os.MkdirAll, which fails ENOTDIR/EEXIST when a file or\n  symlink was on disk.\n\nEach left the stale entry in place and failed the build with a confusing\nerror, even though hashfs authoritatively said the path is now a\ndifferent type.\n\nRemove the stale entry before writing in all three flush paths:\nflushRegularFile and flushDir RemoveAll a directory / non-directory\nrespectively and proceed as if the path were absent, and flushSymlink\nclears whatever occupies the path before creating the symlink. The\nsymlink path cannot key on fs.ErrExist alone: on Windows, creating a\nsymlink where a directory is already in the way fails with\nERROR_ACCESS_DENIED (fs.ErrPermission), not ERROR_ALREADY_EXISTS, so\nflushSymlink probes the path with Lstat and clears whatever is there\nrather than trusting the errno. The removal runs outside e.mu (matching\nflushDir and flushRegularFile) so concurrent readers of the entry are\nnot blocked behind a slow tree removal, and because the probe and the\ncreate are not atomic, a path created in between by an external writer\nis cleared and the Symlink retried once on ErrExist. This mirrors\nClearStaleFileForDirOutput, which already clears a stale non-directory\nbefore a directory output is created at schedule time -- a directory\noutput must exist before its action populates it, so that transition is\nstill handled eagerly there; hardening flushDir makes the flush layer\nself-consistent regardless. A path cannot authoritatively be both a\ndirectory with tracked children and a file/symlink in one hashfs state,\nso removing the stale tree is safe.\n\nAdd OSFS.RemoveAll and a hashfs regression test covering all six\ncross-type transitions (file/symlink/directory, in each direction);\nupdate the existing flush tests that asserted the old error behavior.\nThe dir-\u003esymlink transition in particular only failed on Windows, where\nthe symlink-over-directory errno differs from POSIX.\n\nChange-Id: I95f263558fa87b16ecc7ee2c51062ce7cd483703\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028582\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "31d5552e912dffa0950fc3936373ce0f4edb0197",
      "tree": "3b63c0dcaabe2351148c2cb9d6796b752777704c",
      "parents": [
        "87f656256ec370fa28c6f8a59b68d3e706e2ddfd"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Thu Jul 02 22:54:40 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 02 22:54:40 2026"
      },
      "message": "siso: stop a disk miss from evicting a remote output\n\nA directory output produced remotely with output_local\u003dfalse lives only\nin CAS, never on local disk (build-without-the-bytes). RecordOutputs\nrecords it by forgetting the prior subtree (ForgetOutputs deleteForces\nthe directory node) and then re-recording it via HashFS.Update. That\nopens a window where the directory node is briefly absent from hashfs.\n\nA concurrent stat in that window (e.g. a downstream local consumer\u0027s\ndepsExpandInputs, or another step\u0027s mtimecheck) takes the slow path,\nprobes the local disk, finds nothing, and stores a negative entry.\nshouldKeep then let that negative entry replace the recorded directory:\nthe \"carry children\" path only fires when the incoming entry has its own\ndirectory struct, so the negative clobbered the directory and orphaned\nits members. The recorded directory then vanished for the consumer: e.g.\na local mkzip step saw an empty obj/extracted/ and produced an empty\narchive, and a state reload no longer saw the directory and re-ran the\nconsumer.\n\nA local-disk miss is expected for a not-local output and must not evict\nit: its bytes are in CAS, not on disk. Mark negative entries created by\na local-disk probe (entry.init) with diskMiss, and have shouldKeep keep\nan existing recorded output against such a probe. This is not specific\nto directories: a not-local file output lives only in CAS just the same,\nand a symlink\u0027s target lives inline in the entry (symlinks are always\nrecorded local) yet may be absent from disk, so both are kept too.\nExplicit removals (Remove/RemoveAll) build their entry directly rather\nthan via init, so diskMiss stays false and they still evict.\n\nThis deterministically fixes the previously-failing\nTestBuild_DirOutput_RemoteProducedConsumedLocally and\nTestBuild_DirOutput_RemoteOutputLocalFalseReload (e2e tests, skipped in\nCI where a usable nsjail is absent). Adds a hashfs-level regression test\nthat runs unconditionally for the directory, file and symlink cases.\n\nChange-Id: I852dbeb2e3d0068951d41d46f4e6077c6c62c9a5\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028129\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nAuto-Submit: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "87f656256ec370fa28c6f8a59b68d3e706e2ddfd",
      "tree": "965ee5ce6522b1660dfa2c6f6329dc0d1d1b469a",
      "parents": [
        "af5c46ce17b5564055dcb44bf6c578ebbf60d8a7"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Wed Jul 01 05:59:18 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 05:59:18 2026"
      },
      "message": "siso: refactor two phase caching\n\nintroduce twoPhaseCaching interface to support\nreapi-based twoPhaseCaching and abfs-based twoPhaseCaching\n\nBug: b/506882659\nChange-Id: Ifff804a5e5fa545968143559cd633304f5e9c7ee\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8023462\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "af5c46ce17b5564055dcb44bf6c578ebbf60d8a7",
      "tree": "37b54ee326e7306b318dea998d11178ca7a88400",
      "parents": [
        "2177e8b781578af9c9cdf3bda1b161ae1dee99a7"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Wed Jul 01 02:10:42 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 02:10:42 2026"
      },
      "message": "siso: modernize backward loops with slices.Backward\n\nReplace manual reverse index loops with slices.Backward iteration,\nresolving all golangci-lint modernize/slicesbackward findings.\n\nChange-Id: I67c4b759c46c1bae1ad2a1be5e4fca21f371177a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028302\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "2177e8b781578af9c9cdf3bda1b161ae1dee99a7",
      "tree": "8011e96d5a5136bd09658e53f5c191463731be2d",
      "parents": [
        "e10c876e14d7e593a8c02817c42f45ddf0a6b76d"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Wed Jul 01 02:08:49 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 02:08:49 2026"
      },
      "message": "siso: fix execution metadata duration format\n\nlocal cache may not provide full execution metadata,\nso duration show strange like\n\n     wait  : -495104h23m26.426517042s since 2026-06-25 08:23:26.426517042 +0000 UTC\nor\n     (gap) : -495104h25m1.429480986s since 2026-06-25 08:25:01.429480986 +0000 UTC\n\ncheck unset timestamp and show like\n     wait  : unfinished       since 2026-06-25 08:23:26.426517042 +0000 UTC\n\nChange-Id: I5dbc0899b02682a17dbb4b477cf75c7cf5f7e3fc\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8022983\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "e10c876e14d7e593a8c02817c42f45ddf0a6b76d",
      "tree": "39658683862f1974c27719b66163c4bb3e3b3cb6",
      "parents": [
        "2df5f6fc827a866cb326feadfbf9ff0dd0f4b091"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Wed Jul 01 02:07:27 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 02:07:27 2026"
      },
      "message": "remote-apis: vendor as a regenerable upstream subset\n\ngo.chromium.org/build/remote-apis is upstream bazelbuild/remote-apis\nrestricted to the packages siso/kajiya import\n(build/bazel/remote/execution/v2 and build/bazel/semver), with:\n\n1. one local patch (patches/remote_apis/remote_execution.proto.patch):\n   the ActionCache AddActionLookup/ListActions extension, consumed by\n   siso/reapi/action_cache_map.go; and\n2. the Go module path renamed github.com/bazelbuild/remote-apis -\u003e\n   go.chromium.org/build/remote-apis so it doesn\u0027t collide with the\n   canonical module in the proto registry. Both paths are 33 bytes, so\n   the rename is a byte-safe sed even inside the protobuf rawDesc.\n\nThe .pb.go files come from upstream\u0027s own bazel codegen\n(go_proto/go_grpc_v2), so they match upstream except for the renamed\nsemver import. update.sh clones upstream, applies the patch,\nregenerates, and refreshes the vendored files; patched_proto_info.md\nrecords the pinned upstream commit and the details.\n\nChange-Id: I091b5a3b869cd51a2ff175521246381f2b06c6dd\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028301\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "2df5f6fc827a866cb326feadfbf9ff0dd0f4b091",
      "tree": "296157069d1487397c82eacb60e3bbe622e10d68",
      "parents": [
        "021c806a6d22fb544277dfd8f8c52e2031610d02"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Wed Jul 01 02:07:19 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 02:07:19 2026"
      },
      "message": "kajiya: default sandbox strategy to overlayfs\n\nThe previous default probed /dev/fuse and chose the fuse sandbox when\navailable, but that path is currently affected by a FUSE bug in Linux\nkernel 7.1 causing an uninterruptible hang on startup.\n\nDefault to overlayfs on Linux instead; fuse can still be selected\nexplicitly via -sandbox fuse.\n\nRemoving the init-time /dev/fuse probe also fixes a startup hang in\nother environments where opening /dev/fuse blocks.\n\nChange-Id: I679d66d3d92e6717aebf3c7bf43550536bee366a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028300\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "021c806a6d22fb544277dfd8f8c52e2031610d02",
      "tree": "22b128b65fc9ef0821bf8c2c5b33b4bff3eccb51",
      "parents": [
        "24a78c79336342ff5f300eafd5495004fac3b47b"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Wed Jul 01 00:30:44 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 00:30:44 2026"
      },
      "message": "upgraded github.com/klauspost/compress v1.18.6 \u003d\u003e v1.18.7\n\nhttps://github.com/klauspost/compress/releases/tag/v1.18.7\n\nChange-Id: I8946170432512bc340a0d592f5d891506a158c32\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028320\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Junji Watanabe \u003cjwata@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Junji Watanabe \u003cjwata@google.com\u003e\n"
    },
    {
      "commit": "24a78c79336342ff5f300eafd5495004fac3b47b",
      "tree": "d64b6aa3f4827fb6482f1e2823a3c54eb87df30c",
      "parents": [
        "6957b89ef9fed4a8f0d9771e95eeeb53048b859d"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Wed Jul 01 00:28:08 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 00:28:08 2026"
      },
      "message": "upgraded google.golang.org/grpc v1.81.1 \u003d\u003e v1.82.0\n\nhttps://github.com/grpc/grpc-go/releases/tag/v1.82.0\n\nChange-Id: Ifdf451994264a813f642bc020887ff5e412b8674\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8028130\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "6957b89ef9fed4a8f0d9771e95eeeb53048b859d",
      "tree": "b81984556a766a49dc16b0a070fbe091928b5245",
      "parents": [
        "0093660cfcda974bf176c9d223f73ac56c735005"
      ],
      "author": {
        "name": "Yuke Liao",
        "email": "liaoyuke@google.com",
        "time": "Tue Jun 30 02:27:51 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 30 02:27:51 2026"
      },
      "message": "siso: update version string to v1.5.22\n\nv1.5.21 is rolled out as pinned version at\ngit_revision:24b80aff540b202a88417f9f93b0dc86229eca7a\nhttps://crrev.com/c/8018305\nhttp://ag/40675237\n\nBug: b/526536138\nChange-Id: I8db0f25b547c29c9be17ba7ed22efa35fa3ab941\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8022163\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "0093660cfcda974bf176c9d223f73ac56c735005",
      "tree": "f1aa21c6c121ff5c9a3d7f8d7bd24e4b44b8a503",
      "parents": [
        "24b80aff540b202a88417f9f93b0dc86229eca7a"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Mon Jun 29 08:21:52 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 08:21:52 2026"
      },
      "message": "siso: log scandeps-run, exec-remote-cache-check spans to siso_metrics\n\nBug: b/520207778\nChange-Id: I6f985c636591bb3ad3a47b569738e96e6a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8009346\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\nReviewed-by: Junji Watanabe \u003cjwata@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\n"
    },
    {
      "commit": "24b80aff540b202a88417f9f93b0dc86229eca7a",
      "tree": "b86b68e09854da645343b9165a33e8e1323a26b1",
      "parents": [
        "f6b1e5ffe84165a2f85540856ed75d61c97c735d"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Mon Jun 29 06:50:54 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 06:50:54 2026"
      },
      "message": "siso: fix TestDo_AuthError\n\nwhen ctx is canceled due to 1 second timeout, it fails with\ncontext deadline exceeded error.\n\nrather than using 1 second timeout, make 3 retries causes\ncontext deadline exceeded error.\n(expect 2 retries for permision denied error)\n\nBug: b/529164009\nChange-Id: I0e688837536bdb7c0a093a333a16d54220409a20\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8016003\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "f6b1e5ffe84165a2f85540856ed75d61c97c735d",
      "tree": "4a952faa58811dcc55d507dc270c84e1fee727cb",
      "parents": [
        "780dd752c64c3ae6f2bd9cb92bb00bd18869349e"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 05:54:14 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 05:54:14 2026"
      },
      "message": "siso: reject build graphs that nest an output under a directory output\n\nA directory output like gen/ is owned as a whole tree by its producing\nstep, so any other output declared inside it, even by the same step, is\nrejected.\n\nChange-Id: Ie89c14f2db9b6af2443d02597038203e94450e9a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7962500\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "780dd752c64c3ae6f2bd9cb92bb00bd18869349e",
      "tree": "5b12b34d7129dd18c17b9547ef3b92e337b6c52c",
      "parents": [
        "b059c066d222592ca8a3e7c58170cf8704defefa"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 04:44:08 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 04:44:08 2026"
      },
      "message": "siso: add opt-in adaptive flush gate\n\nAdds an adaptive flush-admission gate as an opt-in alternative to the\nstatic hashfs.FlushSemaphore. A Gradient2 controller (adapted from\nNetflix\u0027s concurrency-limits library) resizes the cap once per window\nfrom the p50 time-to-first-byte of download RPCs: it grows while TTFB\nstays near a long-window EWMA baseline and shrinks proportionally when\nTTFB inflates. No phases, no probing, no hand-tuned thresholds.\n\nOff by default: enable with SISO_EXPERIMENTS\u003dadaptive-flush. When off,\nthe static FlushSemaphore path is unchanged and the controller\ngoroutine is never started. The static cap drastically slows cache-warm\nbuilds on hosts with fast RBE links (the flush queue is the bottleneck\nwhile the link still has headroom), but a static bump regresses slower\nlinks instead. The adaptive gate self-sizes to the link, so it ships as\nan experiment to validate across network regimes before becoming the\ndefault.\n\nBenchmarks (chrome cache-warm, 16-core JP-to-US, 150 ms RTT), adaptive\nvs static cap\u003d128:\n  native 2.5 GbE: 2:03.6 vs 6:31 (3.2x).\n  ifb 1 Gbit:     2:47 vs 6:25 (2.31x); fs-flush avg wait 1.61s vs 6.75s.\n  ifb 100 Mbit:   12:15 vs 12:34 (1.03x; link-bound).\nThe static cap\u003d128 is semaphore-throttled, so it barely moves with the\nlink (~6:25-6:31 at 1 Gbit and 2.5 GbE); the adaptive win grows with the\navailable headroom.\n\nChange-Id: Ib633956ff9d793ca6435b9ef235402411c9830bf\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7792540\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "b059c066d222592ca8a3e7c58170cf8704defefa",
      "tree": "e682004917c3f6640a7b81bbaffd8cbf4ae8da10",
      "parents": [
        "3582124aeceae0c26eda4e39b6ecf4fc9a8b667f"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 04:34:00 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 04:34:00 2026"
      },
      "message": "siso: nextToken fast path for unescaped depfile tokens\n\nParseDeps -\u003e nextToken built each token byte-by-byte via\nstrings.Builder.WriteByte (~84M allocs per cache-cold chrome build,\n6.8% of the alloc_objects profile, 3rd hottest). Most depfile tokens\nare escape-free paths: scan once for the delimiter and return s[:j] in\na single allocation. Tokens with \u0027\\\u0027 escapes (rare) fall through to\nnextTokenSlow with the unescaped prefix pre-seeded.\n\nnextTokenSlow grows its builder incrementally, not to len(s): String()\nreturns the buffer uncopied, so sizing it to the whole remaining\ndepfile would let an escaped token pin a len(s)-sized allocation\n(O(n^2) on depfiles full of backslash-escaped paths).\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  strings.Builder.WriteByte -3.4 GB alloc_space, net -64.4M\n  alloc_objects vs parent.\n\nChange-Id: Ic280c66a1bb51e99fc7163afdb34d95fe3736812\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776675\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "3582124aeceae0c26eda4e39b6ecf4fc9a8b667f",
      "tree": "070100a1d85e8e7a1a832b423d640eb195406bbe",
      "parents": [
        "e8a9cb71c0d57bd0e8550e43ef862663e052f40e"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 04:33:48 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 04:33:48 2026"
      },
      "message": "siso: skip digester queue in scheduler.mark source probe\n\nscheduler.mark stats every source file via HashFS.Stat, queuing a\ndigest that races scandeps\u0027 own inline-digest read of the same file\n(two reads per source). mark only needs existence + mtime + symlink\ntarget, never the digest. Route its probes through StatMtime; scandeps\u0027\ninline digest is then the single read that matters. compute-queue for\n.cc/.cpp/.cxx/.c drops ~1900 -\u003e 2; file-open 2x bucket 3261 -\u003e 1335.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  openat -47,898, newfstatat -36,844 vs parent.\n\nChange-Id: I40c97d29ff89e204b68e72f51d35e2103922b1d4\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776029\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "e8a9cb71c0d57bd0e8550e43ef862663e052f40e",
      "tree": "8f4c5a071fbe3592f3552574cae608a316ec4d6a",
      "parents": [
        "088d25211ba4aecb9f7733fbcd449a34854725bf"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 04:33:30 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 04:33:30 2026"
      },
      "message": "siso: skip digester queue in mtimecheck inputMtime\n\ninputMtime stats every input via FileSystem.Stat, queuing a digest for\neach new entry. A later Update with cmdhash/edgehash replaces the entry\nand journalEntry recomputes synchronously, so the file is read twice\n(worker + replacement). Add StatMtime (needCompute\u003dfalse) and route\ninputMtime through it; the digest is still computed when needed, via\nscandeps inline-digest or CAS upload.\n\nStatMtime skips the digest only in non-defer mode, where reload\u0027s\ntriggerDigestCalculation repairs missing digests. In -fs_defer_digest\nmode it queues the digest, so a digestless local input does not land in\nmissing_digests, keep IsClean false, and disable the fast-nop path.\n\nReproduced on origin/main (cache-warm, n\u003d3 median): openat -6,540 vs parent.\n\nChange-Id: I65188ca65ce85bf39ff759faa5388571942bccd9\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776028\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "088d25211ba4aecb9f7733fbcd449a34854725bf",
      "tree": "3fa6d24e203448c5a0ebc5609052f9c4f21fa651",
      "parents": [
        "1d72c891b488d68121a6e4fd3f5e09dbb25d9111"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 04:32:31 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 04:32:31 2026"
      },
      "message": "siso: compute ReadFile digest inline from the buffer just read\n\nHashFS.ReadFile on the local-disk branch returned the buffer and\nqueued a digester worker to open+read the same file again for sha256\n(~47k extra open+read pairs on a clean chrome build). Compute the\ndigest inline before lazyCompute; its \\!e.d.IsZero() gate then\nshort-circuits the worker. digester stays live for state load, Update,\nCopy. sha256 is multi-GB/s, so the inline cost is negligible vs the\nsaved open+read+schedule.\n\nOnly digest inline when a one-byte probe past e.size reads zero bytes\nat EOF (probeAtEOF). A byte returned, even with io.EOF (permitted by\nthe io.Reader contract), means the file grew past the stale e.size, so\nthe digest is left to lazyCompute, which reads the full file.\n\nMeasured (warm-RBE clean chrome, 55,743 steps):\n  openat 489,951 -\u003e 442,561 (-47k); close 527,236 -\u003e 479,853 (-47k)\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  openat -47,977, close -47,983, read_bytes -0.34 GB vs parent.\n\nBug: 505555536\nChange-Id: I1a3c6c1b61296c00a4fc05b5089368ab433cb4ee\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7775590\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "1d72c891b488d68121a6e4fd3f5e09dbb25d9111",
      "tree": "c655b71d9490a39cf20e3e8adb832d49c4c13c05",
      "parents": [
        "ab9d5003297b6ab1d735f79b09b9551ae24630ce"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 29 04:32:25 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 04:32:25 2026"
      },
      "message": "siso: LoadOrStore scanResult to coalesce racing file reads\n\nfilesystem.setFile used sync.Map.Store, so two fsviews racing to\nfirst-touch a shared header each allocated their own *scanResult and\neach read the file. Switch to LoadOrStore and return the winner; the\nloser adopts it and waits on the shared mutex for the cached result,\ncollapsing the duplicate read. Correctness fix; the race fires rarely\n(~tens of times per chrome build, measured).\n\nNegative (not-found) entries store a nil *scanResult; a real result\nCAS-replaces a stored nil so a regular-file scan never adopts a nil\nand derefs it. A scan canceled while waiting on CPPScanSema leaves the\nshared scanResult un-done so a live scan retries, instead of caching\nthe transient context error.\n\nBug: 505555536\nChange-Id: Ia7ef26f566ac7a7f2d9c22ee6764e01da73c2447\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7775591\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "ab9d5003297b6ab1d735f79b09b9551ae24630ce",
      "tree": "168985a39392b67b113e378e1f47c6a334b0cc86",
      "parents": [
        "c688f3dcfeac5e706259bd7c9ce6c2bc8a63e837"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Mon Jun 29 02:52:12 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 02:52:12 2026"
      },
      "message": "siso: fix reproxy regression\n\nWhen RBE_server_address is set, we assume reproxy is running\nand would be used with `use_remote_exec_wrapper`,\nso may be ok to use with `--remote_jobs`.\n\nBug: b/527956782\nChange-Id: I02adee385f73771bc0956fa75fc1b4712cf75420\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8017282\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "c688f3dcfeac5e706259bd7c9ce6c2bc8a63e837",
      "tree": "e8f1ee67e36e32ad1b4d7a51b924aa1600ac0470",
      "parents": [
        "8ef2b5abbc827468f6783b2f8b08a244460207d3"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Mon Jun 29 01:44:59 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 01:44:59 2026"
      },
      "message": "siso: fetch support action-list\n\nTo help debugging for two phase caching, add action-list\nin `siso fetch`.\n\ne.g.\n```\n% ~/go/bin/siso fetch -type action-list -project goma-foundry-experiments 4469a36b03059190bc90fcf71c3e18fbec798bdc707f5ef72ec445689bae6938/154\ncommand_digest:{hash:\"6929a14988a44bfa269f4d21158e3e239c6f7306147826f71bab17bbe0bc6078\" size_bytes:35886} input_root_digest:{hash:\"616f4a125f6d301c94dc3ea3dd97af436b8edf4d8ff3b353ed08b9c45d877eea\" size_bytes:247} timeout:{seconds:7200} salt:\"tpc.5\"\n\n```\n\nBug: b/506882659\nChange-Id: Ib9543a5fe7a5f2615e5a37cf06df76c0b78fdf6a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8010666\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "8ef2b5abbc827468f6783b2f8b08a244460207d3",
      "tree": "ac9d01c57735282d0f345fef2a20ef806c9e3983",
      "parents": [
        "f157cb0b35832afe8223d90f4c50c231a48ce1fb"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:25:21 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:25:21 2026"
      },
      "message": "siso: return ErrPrecomputedSubTree bare from merkletree.Set\n\nSet wrapped setDir\u0027s error with fmt.Errorf(\"set %s: %w\", ...), but\nsetDir only returns ErrPrecomputedSubTree, a benign sentinel every\ncaller errors.Is-checks and ignores. With precomputed subtrees reused\nat scale (chrome\u0027s shared sysroot/SDK trees) this fired per input,\nallocating an fname-interpolated string only to discard it. Return the\nsentinel bare; keep wrapping real errors.\n\nMeasured on origin/main (chrome cache-warm, n\u003d2):\n  merkletree.Set fmt.Errorf 9.7 -\u003e 0.18 GB alloc_space (-9.5 GB);\n  total -11.0 GB (-4.7%) vs parent.\n\nChange-Id: I1fe8a88fb6a603c902aa1d261ea611d98d39fdc0\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8003376\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "f157cb0b35832afe8223d90f4c50c231a48ce1fb",
      "tree": "eb21ccb4f9209082ff991af6b6762e24f661412b",
      "parents": [
        "773c1d6cd0cfedd66fb8e427f361186e446ae3c2"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:25:03 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:25:03 2026"
      },
      "message": "siso: pool ExpandedInputs dedup maps, pre-size inputs slice\n\nExpandedInputs allocated fresh seen/iseen scratch maps and grew the\ninputs slice from nil on every call (~60k calls per chrome cache-warm\nbuild). Share one sync.Pool between seen and iseen (clear() on Put)\nand pre-size inputs to 2*len(edge.Inputs()).\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  ninjabuild.ExpandedInputs -1.12 GB alloc_space vs parent.\n\nChange-Id: Iab0a7230685fa7d4d8730d7f6dea5daa575b3dec\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8002077\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "773c1d6cd0cfedd66fb8e427f361186e446ae3c2",
      "tree": "c5ab28d1d9f4dbe6e6c67c438e7cd1b02cd90e5c",
      "parents": [
        "603df59da793268b8cf9b2fb6bb1b0b18b787f3c"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:24:21 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:24:21 2026"
      },
      "message": "siso: pool bitmap.Bitmap entries in scanner.included\n\nscanner.find allocated a \u0026bitmap.Bitmap{} per unique include name per\nScan (~30M allocs per cache-cold chrome build, 2.7% of alloc objects).\nPool *bitmap.Bitmap; Clear keeps the underlying []uint64 so cap\nsurvives reuse, removing the per-name alloc on the steady-state path.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  scandeps.find -30.0M alloc_objects, -0.68 GB alloc_space vs parent.\n\nChange-Id: I180a71b5d2f27a88dd706b1557458a5c85ad5ca8\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776679\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "603df59da793268b8cf9b2fb6bb1b0b18b787f3c",
      "tree": "8e134a6b1ce0b80035ac16d75059ba916fd0b61f",
      "parents": [
        "daf5739bd425b77508d97e249e53ccc38d4e5ac6"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:24:15 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:24:15 2026"
      },
      "message": "siso: index \u0027:headers\u0027 inputDeps keys, drop string concat in addDir\n\naddDir built dir+\":headers\" per call to look up inputDeps (~17M concat\nallocs per cache-cold chrome build, the biggest non-runtime alloc in\naddDir). Pre-build a headersDirs set at ScanDeps.New (strip the\n\":headers\" suffix once, read-only after); addDir then checks\nfs.headersDirs[dir] with no allocation.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  scandeps.addDir -19.0M alloc_objects, -1.09 GB alloc_space vs parent.\n\nChange-Id: I2918e358f8133072f12478c49d379b96f3d5a392\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776678\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "daf5739bd425b77508d97e249e53ccc38d4e5ac6",
      "tree": "b36bc061690e13c750d87696203090b1d23c13bc",
      "parents": [
        "65ba167ffa36b06d5b5d9c2daab2376880ed3efd"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:24:09 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:24:09 2026"
      },
      "message": "siso: avoid string concat in Set lastDir prefix check\n\nSet\u0027s lastDir cache check did strings.CutPrefix(fname,\nm.lastDir.name+\"/\") per call; the +\"/\" concat allocated a string each\ntime (~18M allocs per cache-cold chrome build, the largest non-data\nalloc in Set). Inline the check by hand (length, separator byte,\nprefix) and slice the rest. Same semantics, no allocation.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  merkletree.Set -0.88 GB alloc_space vs parent.\n\nChange-Id: I3f58e65be9b3071cb9d4937f653042133dc830f6\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776677\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "65ba167ffa36b06d5b5d9c2daab2376880ed3efd",
      "tree": "94d3669e45634348ebb5a53710e4f3512dc7b0e0",
      "parents": [
        "f9db9ce5243dd176e60cf180543f94c941f68634"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:23:59 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:23:59 2026"
      },
      "message": "siso: avoid clone in markVisited fast path\n\nmarkVisited cloned its variadic visits slice via slices.Clone (~55M\nallocs per cache-cold chrome build, 4.4% of the alloc_objects profile)\nso it could append without mutating the caller\u0027s shared\nsr.symlinkTargets. Instead walk the input directly and only allocate a\npending stack when a visited node has inputDeps to chase; most inputs\ndon\u0027t, so most calls allocate nothing.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  -52.4M alloc_objects vs parent (the slices.Clone elimination).\n\nChange-Id: Ib11dae79efc61dd4ef59cf58ea3e42430ab8a653\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776676\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "f9db9ce5243dd176e60cf180543f94c941f68634",
      "tree": "3111776260284c0dd7d2cf96029ea7cc9afa872f",
      "parents": [
        "57572db9b69a8384a463d9010850ff06db6eafd4"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:23:17 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:23:17 2026"
      },
      "message": "siso: typed sharded map for intern/pathIntern, drop sync.Map\n\nintern/pathIntern used [256]/[4096]sync.Map. sync.Map boxes every\nstring key into an interface{} per access, and LoadOrStore allocates a\nmap entry on the write half even when the key is already present;\nintern also paid a strings.Clone per call. Together the two were ~104M\nallocs per cache-cold chrome build (8.4% of the alloc_objects profile,\n2nd hottest). Replace with a typed [256]/[4096]internShard\n(map[string]string + sync.RWMutex): hits take an RLock + typed lookup\nwith zero allocation; misses pay one Clone (intern) or none\n(pathIntern, stable Go strings) plus the insert.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  scandeps.pathIntern -110.8M alloc_objects vs parent.\n\nChange-Id: I3f3f99a5db6d9645f679f80165626edb5846e4b4\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776673\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "57572db9b69a8384a463d9010850ff06db6eafd4",
      "tree": "5c5dcd1b97338db570c2370bcb7a0f70a11ee186",
      "parents": [
        "7ff92612e67236cda9bc3768740f98e097eb4ddb"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:23:11 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:23:11 2026"
      },
      "message": "siso: pre-size the buildTree names dedup map\n\nbuildTree grew its names dedup map from empty under append, paying\nrepeated resize allocs per directory. Pre-size to\nlen(Files)+len(Symlinks)+len(Directories), the exact upper bound.\n\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  merkletree.buildTree -0.76 GB alloc_space vs parent.\n\nChange-Id: I9d059a60bf78a7cf68feae1cd6f30016040e6b09\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8002076\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "7ff92612e67236cda9bc3768740f98e097eb4ddb",
      "tree": "143d3b407443cc87287242bf32ceafe278ee509f",
      "parents": [
        "0c6e6c100bc1f70cd273a5d4af9b3bc0da5c8505"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:23:04 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:23:04 2026"
      },
      "message": "siso: skip digester queue for to-be-replaced entries in RetrieveUpdateEntriesFromLocal\n\nRetrieveUpdateEntriesFromLocal calls HashFS.Stat (needCompute\u003dtrue),\nqueuing a digest for the new entry. But the caller immediately passes\nthe entries to Update, whose shouldKeep REPLACES this entry\n(edgehash\u003dnil loses the edgechanged branch); the orphan\u0027s queued\ndigest then duplicates the read+compute Update\u0027s own commitEntry does.\nEvery local-step output (.o/.o.d) hit this on every compile. Call\nhfs.stat with statOpts{needCompute: false}; only the orphan pass goes.\n\nMeasured (clean chrome, 55,743 steps): file-open 3x bucket 166 -\u003e 2;\n  bytes read 20.27 -\u003e 17.84 GiB (-2.43 GiB).\nReproduced on origin/main (cache-warm, n\u003d3 median):\n  read_bytes -2.57 GB vs parent (claim -2.43 GiB).\n\nChange-Id: Ia5df57dc8e960867e190e47c7a7b67b5ffd52bc6\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7775592\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "0c6e6c100bc1f70cd273a5d4af9b3bc0da5c8505",
      "tree": "ba731fc55f15e72dbb95a7c8e779a6ab71995a86",
      "parents": [
        "b44535fe540cda4f770f3ce8fadc3adf00c9f6c4"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 26 03:22:58 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 26 03:22:58 2026"
      },
      "message": "siso: singleflight StepDef.DepInputs to avoid duplicate depfile parse\n\nDepInputs cached its result behind an unguarded\n\"if s.deps \u003d\u003d nil \u0026\u0026 s.deperr \u003d\u003d nil\", so two concurrent callers\n(mtimecheck.inputMtime and step.Inputs, which run concurrently per\nstep) could both parse the same depfile. Guard with sync.Once.\nConvert ExpandedCaseSensitives to a pointer receiver to avoid the\ncopylocks warning from embedding sync.Once.\n\nChange-Id: I657f742a8ed3a9df0efac5e4abaf043ff4f99e06\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7776027\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "b44535fe540cda4f770f3ce8fadc3adf00c9f6c4",
      "tree": "e07010bbca3918f306242faf12a63b28eeac70e9",
      "parents": [
        "61abfbaebc905214a004164bf04dd4c625750ec0"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Thu Jun 25 09:16:09 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jun 25 09:16:09 2026"
      },
      "message": "siso: fix panic when tree.root is nil\n\nwhile experimenting two phase caching, got panic\n\n 1 steps failed: panic: runtime error: invalid memory address or nil pointer dereference: goroutine 539567 [running]:\ngo.chromium.org/build/siso/build.(*Builder).Build.func4.2()\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/builder.go:806 +0x8a\npanic({0x17a54e0?, 0x2d01ba0?})\n\t/usr/lib/go-1.26/src/runtime/panic.go:860 +0x13a\ngo.chromium.org/build/siso/build.(*Builder).runStep.func1(0x16c00316e340)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/run_step.go:73 +0xba5\npanic({0x17a54e0?, 0x2d01ba0?})\n\t/usr/lib/go-1.26/src/runtime/panic.go:860 +0x13a\ngo.chromium.org/build/siso/reapi/merkletree.Traverse({0x1d3fd38, 0x16c09d7b2690}, {0x16c03b70ca00, 0x38}, 0x0, 0x16c003178948)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/reapi/merkletree/traverse.go:24 +0x4d\ngo.chromium.org/build/siso/execute.(*Cmd).expandDirOutputs(0x16bf9ba94608, {0x1d3fd38, 0x16c09d7b2690}, {0x7f70310b17f8, 0x16bf3c8fc7e0})\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/execute/cmd.go:1102 +0x78e\ngo.chromium.org/build/siso/execute.(*Cmd).RecordOutputs(0x16bf9ba94608, {0x1d3fd38, 0x16c09d7b2690}, {0x7f70310b17f8, 0x16bf3c8fc7e0}, {0x9b?, 0x7f7179731db0?, 0x2d47520?})\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/execute/cmd.go:1130 +0x65\ngo.chromium.org/build/siso/build.(*Cache).GetActionResult(0x16bf446f8cf0, {0x1d3fd38, 0x16c09d7b2660}, 0x16bf9ba94608)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/cache.go:105 +0x75b\ngo.chromium.org/build/siso/build.(*Builder).execRemoteCache.func1({0x1d3fd38, 0x16c09d7b2630})\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/exec_remote.go:192 +0x17c\ngo.chromium.org/build/siso/sync/semaphore.(*Semaphore).Do(0x1d3fd38?, {0x1d3fd38?, 0x16c09d7b25d0?}, 0x16c003179000)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/sync/semaphore/semaphore.go:163 +0x87\ngo.chromium.org/build/siso/build.(*Builder).execRemoteCache(0x16bfe0d46588, {0x1d3fd38?, 0x16c00314de90?}, 0x16bf56fb8008)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/exec_remote.go:187 +0x119\ngo.chromium.org/build/siso/build.(*Builder).checkTwoPhaseCaching-range1(0x16c03356fa40, {0x0?, 0x0?})\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/two_phase_caching.go:92 +0x647\ngo.chromium.org/build/siso/reapi.ActionCacheMap.List.func1(0x16c0031328c0)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/reapi/action_cache_map.go:58 +0x150\ngo.chromium.org/build/siso/build.(*Builder).checkTwoPhaseCaching(0x16bfe0d46588, {0x1d3fd38, 0x16c00314de90}, 0x16bf56fb8008, {0x16c0031678b0, 0x44})\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/two_phase_caching.go:61 +0x2f8\ngo.chromium.org/build/siso/build.(*Builder).twoPhaseCachingLookup.func1({0x1d3fd38, 0x16c00314de90})\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/two_phase_caching.go:37 +0x1a5\ngo.chromium.org/build/siso/sync/semaphore.(*Semaphore).Do(0x1d3fd38?, {0x1d3fd38?, 0x16c00314de30?}, 0x16c0031794c0)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/sync/semaphore/semaphore.go:163 +0x87\ngo.chromium.org/build/siso/build.(*Builder).twoPhaseCachingLookup(0x16bfe0d46588, {0x1d3fd38?, 0x16c00314de00?}, 0x16bf56fb8008)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/two_phase_caching.go:31 +0xc5\ngo.chromium.org/build/siso/build.(*Builder).execLocal(0x16bfe0d46588, {0x1d3fd38?, 0x16c00314dd40?}, 0x16bf56fb8008)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/exec_local.go:37 +0x1ec\ngo.chromium.org/build/siso/build.(*Builder).runLocal(0x16bfe0d46588, {0x1d3fd38, 0x16c00314dd40}, 0x16bf56fb8008)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/run_cmd.go:59 +0x4d\ngo.chromium.org/build/siso/build.(*Builder).runStep(0x16bfe0d46588, {0x1d3fd38, 0x16c00314dd40}, 0x16bf56fb8008)\n\t/usr/local/google/home/ukai/src/crbuild/build/siso/build/run_step.go:239 +0x14f4\n\nit seems tree.root was nil, and nil tree.root seems broken tree message,\nso return error from ParseTree when tree.root is nil.\n\nChange-Id: I202d1db40de2bd9909b4c3182b53b5aea22d1a44\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8002078\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "61abfbaebc905214a004164bf04dd4c625750ec0",
      "tree": "101fe0669c8f59c335073dfe260a392cba3e0d80",
      "parents": [
        "3351118fb1e00b1c8b2b66ce965196a9ded6bf3b"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Thu Jun 25 07:58:46 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jun 25 07:58:46 2026"
      },
      "message": "siso: migrate Materialize{Input,Output}sTime measurement to spans\n\nBug: b/520207778\nChange-Id: Ic5ebb9d32dc8e1f04fac49bb6fc66fa66a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/8000991\nReviewed-by: Junji Watanabe \u003cjwata@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\n"
    },
    {
      "commit": "3351118fb1e00b1c8b2b66ce965196a9ded6bf3b",
      "tree": "4180acb2d08e96ca75be929c62bbf3c082e54382",
      "parents": [
        "09890ff297cbf12975c0d1216eed8c8cf6879863"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Thu Jun 25 00:43:19 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jun 25 00:43:19 2026"
      },
      "message": "siso: retry for ResourceExhausted\n\nRBE team says client should retry for ResourceExhausted\n(as bazel and reclient does)\nhttps://chat.google.com/room/AAQAfwLQ8lg/RDG_-eExFZw\n\nBug: b/521538116\nChange-Id: I7eb636f4f452b7bfa582b5dd2a2f6c255db1ee01\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7999276\nReviewed-by: Neri Marschik \u003cnerima@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nCommit-Queue: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "09890ff297cbf12975c0d1216eed8c8cf6879863",
      "tree": "93637db2bbd10b5d4b7e0cb7e5f4ef1d2c59bed8",
      "parents": [
        "4a0c3a9655a3e1331656f4ca48bdfa9a05ec98c0"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Thu Jun 25 00:38:07 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jun 25 00:38:07 2026"
      },
      "message": "siso: add directory input/output support for build actions\n\nLet build actions declare a directory (a trailing-slash target) as an\ninput or output, so an action that consumes or produces a whole tree\n(e.g. an archive extraction) is tracked as a unit instead of requiring\nevery member to be listed.\n\nA directory target keeps the trailing-slash convention to the ninja\nedge, then is split once into typed Cmd.Outputs (files) and\nCmd.OutputDirs (directories); hashfs and the executors work in clean\npaths. Every result that can carry one (remote execution, the action\ncache) flows through one recording chokepoint that flattens a\ndirectory\u0027s REAPI Tree into its files, so a directory output is recorded\nlike any other output. Directory inputs are expanded to their members\nfor the action\u0027s input tree. Coverage:\n\n- local execution (nsjail capture of a directory as a unit) and remote\n  execution (output_directories / Tree fetch).\n- build-without-the-bytes: a remote or cached directory output is\n  recorded from CAS without materializing locally; contents download on\n  demand or when output_local wants them.\n- output_local strategies decide local materialization per directory.\n- cleandead, the .siso_fs_state file, and the journal track directory\n  outputs (members tagged with the producing step\u0027s cmdhash); a\n  file/directory kind flip is reconciled.\n\nrestat/restat_content support for directory outputs is a follow-up\ncommit.\n\nChange-Id: If9b431f66b1d29e50d6f30ae5382072490e378bf\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7731383\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "4a0c3a9655a3e1331656f4ca48bdfa9a05ec98c0",
      "tree": "e80c77758037d27b54d1c0784cf11c49c8d6ca2f",
      "parents": [
        "eabe097a1ba52f642aa4b8f948ecf45d2b18f7c6"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Wed Jun 24 05:59:20 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jun 24 05:59:20 2026"
      },
      "message": "gong: implement path_exists\n\nLike C++ it relies on underlying path resolution to error on empty path,\nhowever gong\u0027s underlying path wasn\u0027t returning a strongly typed error\nyet so this CL also swaps that over.\n\nBug: b/491999131\nChange-Id: I45f171a048bda461b1e93fbd25f0529f6a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7901577\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\n"
    },
    {
      "commit": "eabe097a1ba52f642aa4b8f948ecf45d2b18f7c6",
      "tree": "339ff37a7456b1ca01c945b9c545b3ec92d3492c",
      "parents": [
        "9993f5d5416ef797b28b7a6fadba315e06bfc396"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Wed Jun 24 05:37:52 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jun 24 05:37:52 2026"
      },
      "message": "gong: finish ResolvePath port\n\nhttps://source.chromium.org/gn/gn/+/main:src/gn/filesystem_utils.cc;l\u003d802-827;drc\u003d9e17378429f1508241b75bcd412ad37a35d5ed44\nChange-Id: I0d092d1d6fbcc76f98998b799ecdfb176a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7991015\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\n"
    },
    {
      "commit": "9993f5d5416ef797b28b7a6fadba315e06bfc396",
      "tree": "d9e8c45df823777a8f414a3dde6392e6eea987f5",
      "parents": [
        "201bd7157796ddd3ef6637c23704803366661fbb"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Tue Jun 23 13:52:05 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 13:52:05 2026"
      },
      "message": "siso: Fix logic bug in min concurrent flush limit\n\nThe CL https://crrev.com/c/7905186 intended to set a lower limit for the\nflush concurrency, so that even machines that had few cores would use at\nleast 200 parallel download requests. Due to a logic bug that we all\nmissed in the review, it did the opposite - it applied a *cap* so that\neven powerful machines would use *at most* 200 parallel flushes.\n\nFix the formula to do what the original CL intended.\n\nChange-Id: I36ac29e76df9bcdb7e0b0af48af42e46a3c8b136\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7971399\nCommit-Queue: Takuto Ikuta \u003ctikuta@chromium.org\u003e\nAuto-Submit: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Takuto Ikuta \u003ctikuta@chromium.org\u003e\n"
    },
    {
      "commit": "201bd7157796ddd3ef6637c23704803366661fbb",
      "tree": "46cef5a57ce714d71cc498f6d67ea09a57555b52",
      "parents": [
        "660e86aa21aa5656d1249bb3e77499d06a45189a"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Tue Jun 23 12:31:54 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 12:31:54 2026"
      },
      "message": "hashfs: make embedded-buf flush atomic via tmp+rename\n\nflushRegularFile\u0027s len(e.buf) \u003e 0 branch (ctx.actions.write outputs and\ncopies of small in-memory files) wrote in place with os.WriteFile, which\ntruncates the destination before refilling it. A concurrent reader or an\ninterrupted flush could observe a truncated or partially-written file --\nthe same hazard GN\u0027s copy action fixed in Chromium e0a287b3 by switching\nto cp-to-tmp + mv.\n\nRoute the buf branch through a new writeFileAtomic helper that writes a\n.siso_tmp file and renames it into place, matching the main FileSource\npath (flushWrite). rename atomically replaces an existing regular file\n(including a hardlink), so removeBeforeWrite is only needed for a\nnon-regular dst, mirroring flushWrite. The empty-file branch is left as\nis; there is nothing meaningful to make atomic about writing zero bytes.\n\nWithin a single build the scheduler and .siso_fs_state mtime tracking\nalready prevent the intra-build hazard, so this mainly buys consistency\nwith flushWrite and safety for external observers. Cost is ~3us/op on\nLinux ext4, ~35us/op on macOS APFS (journaled rename) -- negligible\nagainst whole-build flush time, which is parallelized and dominated by\nlarger writes.\n\nAdd two benchmarks:\n- BenchmarkFlushBuf measures the buf flush (create/overwrite x sizes).\n- BenchmarkCopyImpl compares the real-content copy path against the GN\n  shell copy_command (before/after e0a287b3) and copy_atomic.py\n  (47aac0539), showing Siso\u0027s in-process flush is 70-900x faster than\n  any subprocess approach and its tmp+rename atomicity is essentially\n  free.\n\nChange-Id: Ibdf064077880a21295bec40e3847585654c9698a\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7983464\nAuto-Submit: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Fumitoshi Ukai \u003cukai@google.com\u003e\n"
    },
    {
      "commit": "660e86aa21aa5656d1249bb3e77499d06a45189a",
      "tree": "097e251495c05a123d54545872275005bf00ef03",
      "parents": [
        "4979337ff3e0c2d88f188bafb069cd9938af101a"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Tue Jun 23 09:46:34 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 09:46:34 2026"
      },
      "message": "siso: initial span logging to siso_metrics.json\n\nBegin logging spans to siso_metrics.json, starting with `step:foo` which\ncovers the step run period:\nhttps://source.chromium.org/chromium/build/+/main:siso/build/run_step.go;l\u003d64;drc\u003d95472c45ff1dbf17c97614502737de45cef9243c\n\nBug: b/520207778\nChange-Id: I2f2b5ea1b421ced596f6aadb7856c1d86a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7929727\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\nReviewed-by: Junji Watanabe \u003cjwata@google.com\u003e\n"
    },
    {
      "commit": "4979337ff3e0c2d88f188bafb069cd9938af101a",
      "tree": "248a9aa8cad7afddf69aa14ef631894e43af0f44",
      "parents": [
        "2b15a855e194e24f356cd7a54c4b64e3088a5ea1"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Tue Jun 23 09:43:46 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 09:43:46 2026"
      },
      "message": "gong: ninjawriter inline targets should contribute phony\n\nInlined targets action() copy() should contribute their phony not their\nraw output file to the `all` target.\n\nFix by extracting the decision to inline a target in writeTarget into a\nshared function.\n\nBug: b/492000541\nChange-Id: If32c70e21d33c3fc721eac8f0258a6946a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7960661\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\n"
    },
    {
      "commit": "2b15a855e194e24f356cd7a54c4b64e3088a5ea1",
      "tree": "50d4f737cd825fd67f39562a7706bc6dda48075b",
      "parents": [
        "0de0ca9b4045f3c810f833d64e5c5494b5fcc52e"
      ],
      "author": {
        "name": "Richard Wang",
        "email": "richardwa@google.com",
        "time": "Tue Jun 23 06:27:03 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 06:27:03 2026"
      },
      "message": "gong: ninjawriter fix phony target collisions\n\nNeed to format ninja phony paths to account for label\u0027s directory\notherwise they\u0027ll collide e.g. //a:foo and //b:foo would both result in\n`phony/foo`.\n\nBug: b/492000541\nChange-Id: I949613ebe8f72950a3dfb6d08b97af9c6a6a6964\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7977660\nReviewed-by: Alex Ovsienko \u003covsienko@google.com\u003e\nCommit-Queue: Richard Wang \u003crichardwa@google.com\u003e\n"
    },
    {
      "commit": "0de0ca9b4045f3c810f833d64e5c5494b5fcc52e",
      "tree": "78a883baac7fa3e8e0f825eeb990ccc6b177f122",
      "parents": [
        "202a34c1d8d0ad0bd7c72c869fda11966435a886"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Tue Jun 23 05:21:41 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 05:21:41 2026"
      },
      "message": "hashfs: collapse stat flags into a statOpts struct\n\nstat/statHit/statNewEntry had two trailing bool flags (needCompute,\nskipDirMtimeRefresh). Fold them into statOpts so call sites read by\nname. Pure refactor; tests unchanged.\n\nChange-Id: I8af1de624d734dd008955db17807880c38121172\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7961421\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "202a34c1d8d0ad0bd7c72c869fda11966435a886",
      "tree": "d6845402859b5f81e4577c38eead7e543945cd44",
      "parents": [
        "17819e66c8b0a1644688a45d58157f29564dc9b0"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Tue Jun 23 05:17:45 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 05:17:45 2026"
      },
      "message": "hashfs, build: skip dir mtime-refresh Lstat in existence-only callers\n\nHashFS.Stat re-Lstats a cached dir every call to refresh its mtime.\nAdd StatIfExists, which skips that for callers needing only existence\n(and the visited-symlink chain), and route resolveSymlinkForInputDeps\nthrough it (~2.3M calls/build on chrome). A test pins the semantics:\nStatIfExists reports a vanished cached dir as existing; Stat returns\nErrNotExist.\n\nBench (chrome cache-warm): newfstatat 3.44M -\u003e 1.01M (-70.7%),\nuser CPU -29s.\n\nChange-Id: I00aec357774be68de036a501c3139c05113abddc\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7961420\nCommit-Queue: Philipp Wollermann \u003cphilwo@google.com\u003e\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\n"
    },
    {
      "commit": "17819e66c8b0a1644688a45d58157f29564dc9b0",
      "tree": "c7423f4d8b74cd79ef01d9ae46b85d6d69759761",
      "parents": [
        "de442ceaa6fc675726badb2f214c355360a32112"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Tue Jun 23 02:06:32 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 23 02:06:32 2026"
      },
      "message": "siso: drop --max_rbe_retries flag\n\nAndroid/Soong already uses --reapi_max_retries,\nhttp://ag/40439093\nso no need to keep --max_rbe_retries\n\nChange-Id: I8b755b35e010b81561f8e8357bcacf1ecd4c4971\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7975520\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "de442ceaa6fc675726badb2f214c355360a32112",
      "tree": "6d7407f460cc19de4d46f2dd76b8cb208b31e9bf",
      "parents": [
        "8b309cdb24e196810f5126f8c8b6e84922525403"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Mon Jun 22 09:22:45 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 22 09:22:45 2026"
      },
      "message": "siso: update version string to v1.5.21\n\nBug: 524398708\nChange-Id: I671dad3b2387c0de37892e2b8d31bdeb9254eedb\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7977563\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "8b309cdb24e196810f5126f8c8b6e84922525403",
      "tree": "d1b307f2aa9b3c9e0e415922c6fd1713bf243170",
      "parents": [
        "7ea15ed68d4aa12fc4aaa50f5446e8549e8f1ce0"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Mon Jun 22 08:21:26 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 22 08:21:26 2026"
      },
      "message": "siso: fix Unavailable error handling for cartfs\n\nIf it failed to connect to cartfs, it showed\nError: could not connect to backend. If you want to build offline, pass `-o` or `--offline`\n rpc error: code \u003d Unavailable desc \u003d connection error: desc \u003d \"transport: Error while dialing: dial unix /tmp/.siso_vfs.sock: connect: no such file or directory\"\n\nIt is confusing since `--offline` won\u0027t help here.\n\nShow offline suggestion only if it failed to connect to RE API server.\ne.g.\n Error: could not connect to backend. If you want to build offline, pass `-o` or `--offline`\n failed to check writable: upload batch: rpc error: code \u003d Unavailable desc \u003d batch update blobs: too many retries 10 43.3578441s: max retries exhausted: failed after 5 attempts: rpc error: code \u003d Unavailable desc \u003d no children to pick from\n\nNote\n - for wrong project, it will get \"code \u003d PermissionDenied\"\n - for wrong instance, it will get \"Error: failed to check writable: upload batch: rpc error: code \u003d FailedPrecondition desc \u003d batch update blobs: rpc error: code \u003d FailedPrecondition desc \u003d Resource \"rbe-chrome-untrusted/instances/not-exist\" does not exist in this region\"\n\nChange-Id: I5d2e9e629a4851a94eeb1b275cb5fa83dc7f946c\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7978137\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Yuke Liao \u003cliaoyuke@google.com\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    },
    {
      "commit": "7ea15ed68d4aa12fc4aaa50f5446e8549e8f1ce0",
      "tree": "d91f12247cd955b3f292b8a684b3907d09379455",
      "parents": [
        "3c4d5b81ee91fe4101e4f61801467e022d8b38a2"
      ],
      "author": {
        "name": "Neri Marschik",
        "email": "nerima@google.com",
        "time": "Fri Jun 19 23:50:03 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 19 23:50:03 2026"
      },
      "message": "build: add -output_local_strategy\u003dgraph dep-aware materialization\n\nAdd an opt-in fourth output_local strategy, \"graph\", that writes to\nlocal disk only the remote outputs a local step will actually read,\ndecided at schedule time from the dependency graph.\n\nBench (chrome cache-warm, 16-core, n\u003d2 means; wall / CAS read):\n  full     6:31 / 32.5 GiB\n  minimum  4:52 / 16.8 GiB\n  graph    4:16 / 16.9 GiB\n\nChange-Id: Id0147158b99da31ef7a2fc523bbe3ff771f7f42d\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7962499\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: Neri Marschik \u003cnerima@google.com\u003e\n"
    },
    {
      "commit": "3c4d5b81ee91fe4101e4f61801467e022d8b38a2",
      "tree": "5abe31328c04a576bcd68b55f4bde2b006509827",
      "parents": [
        "996c2a1031390e3ddf4aaaa124f9caac7b99e355"
      ],
      "author": {
        "name": "Fumitoshi Ukai",
        "email": "ukai@google.com",
        "time": "Fri Jun 19 16:34:41 2026"
      },
      "committer": {
        "name": "LUCI CQ",
        "email": "infra-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 19 16:34:41 2026"
      },
      "message": "siso: fix racing cancellation race\n\nWhen raceCtx is canceled, local action will be terminated by\nSIGTERM, but soong_zip script would exit with 0 with incomplete outputs.\nSiso detects it as exit\u003d0 and use cacheWrite if\nre_cache_enable_write\u003dtrue.\nAlthough ctx is already cancelled, gRPC may send the request\nand forget, and server may handle the write request.\nTo prevent from such unexpected cache write, ignore cacheWrite\nwhen ctx is already canceled.\n\nBug: b/521945727\nChange-Id: I0ac98b96e690d9d3ceb4ed8d0fa1ee75da4c7942\nReviewed-on: https://chromium-review.googlesource.com/c/build/+/7962502\nReviewed-by: Philipp Wollermann \u003cphilwo@google.com\u003e\nCommit-Queue: LaMont Jones \u003clamontjones@chromium.org\u003e\nAuto-Submit: Fumitoshi Ukai \u003cukai@google.com\u003e\nReviewed-by: Yuke Liao \u003cliaoyuke@google.com\u003e\n"
    }
  ],
  "next": "996c2a1031390e3ddf4aaaa124f9caac7b99e355"
}
