)]}'
{
  "log": [
    {
      "commit": "8041874e494c2811b138971e542c74d1883beb6a",
      "tree": "1af9eb03b84c2e500361d957f7a05f1180226957",
      "parents": [
        "c96ea2dd61ee21e10c489b3a6a4d58bc8056cb81"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Oct 22 13:41:32 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Oct 22 13:41:32 2026 -0700"
      },
      "message": "[buildminder] Add unsuccessful actions reporting and log middle-truncation\n\nSupport gathering, partitioning, and exporting detailed failure reports\nacross multi-invocation builds in both headless and interactive modes:\n\n* buildstate: Enrich ActionMetadata with InvocationId and ToolName,\n  propagating parent invocation identity and backfilling actions\n  declared prior to invocation declaration attributes.\n* report: Implement TruncateMiddle to middle-truncate action\n  stdout/stderr using a Head (24KB) + Tail (40KB) policy with\n  line-boundary snapping, UTF-8 rune safety, ANSI code reset, inflation\n  prevention, and a clear truncation sentinel.\n* report: Implement GenerateUnsuccessfulActionsReport, partitioning\n  unsuccessful actions into failed_actions, cancelled_actions, and\n  interrupted_actions. Add JSON export, shell-quoted command formatting,\n  and reverse-scanned terminal summary formatting.\n* buildminder: Add --unsuccessful_actions_report\u003d\u003cpath\u003e and\n  --print_unsuccessful_actions flags and wire automatic report\n  generation/printing upon process teardown.\n* buildminder-wrap: Support --unsuccessful-actions-report and propagate\n  via BUILDMINDER_UNSUCCESSFUL_ACTIONS_REPORT.\n* tests: Add unit tests for report generation, line-snapped truncation,\n  flag parsing, and headless execution.\n* tests: Add ninja_clang_syntax_error_failure_report_test and\n  bazel_fail_failure_report_test end-to-end integration tests verifying\n  report schema, failed status, and log capture.\n\nBug: 573624782\nChange-Id: Ib95da7bbadf5c53bfddd0cfd20ca3f6393decca8\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1906465\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nPresubmit-Verified: fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cfuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "c96ea2dd61ee21e10c489b3a6a4d58bc8056cb81",
      "tree": "b30a170fb00b732f73c9ca56fafc02e4b040b704",
      "parents": [
        "7ad8251fdda6fa744b145e8adf48b926f81ba04f"
      ],
      "author": {
        "name": "Oliver Newman",
        "email": "olivernewman@google.com",
        "time": "Fri Oct 16 12:13:49 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Oct 16 12:13:49 2026 -0700"
      },
      "message": "[rsproxy_wrap] Fix deadlock in proxy timeout fallback\n\nWhen rsproxy doesn\u0027t become ready in time and fallback is enabled,\nthe wrapper sends rsproxy SIGTERM and waits for it to exit. But\nrsproxy doesn\u0027t act on SIGTERM until its input FIFO reaches EOF, and\nthe wrapper was still holding the FIFO\u0027s writer open on fd 3, so the\nwait never returned and the wrapped command never ran. In Fuchsia\ninfra this showed up as builds that sat idle until the 90-minute ninja\nstep timeout, e.g.\nhttps://ci.chromium.org/b/8667766679262034257\n\nClose the writer before signaling rsproxy, and escalate to SIGKILL if\nit still hasn\u0027t exited after --proxy-done-timeout.\n\nAlso fix the existing writer close in cleanup, which used\n`exec 3\u003e\u0026- 2\u003e/dev/null`. On a bare `exec` the redirection applies to\nthe shell itself, so all later stderr went to /dev/null, including the\n--print-logs-on-failure log dump.\n\nThe new test uses a fake rsproxy that never becomes ready and drains\nits FIFO on SIGTERM. It times out without the deadlock fix, and fails\nif the wrapped command\u0027s stderr has been discarded.\n\nTAG\u003dagy\nCONV\u003d6321911a-8c2c-4a35-a597-8a551b39e6cc\n\nChange-Id: I30efcf4c0cf4e31024b856e29214bc6ed6cdbfd3\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1897118\nCommit-Queue: Oliver Newman \u003colivernewman@google.com\u003e\nReviewed-by: David Fang \u003cfangism@google.com\u003e\nPresubmit-Verified: fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cfuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nFuchsia-Auto-Submit: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "7ad8251fdda6fa744b145e8adf48b926f81ba04f",
      "tree": "0f5b81451494c2939fef6e27c8d45bd5e601f650",
      "parents": [
        "040877b3425b114dbf92f31a7514b0630897413d"
      ],
      "author": {
        "name": "Mike Comfoltey",
        "email": "comfoltey@google.com",
        "time": "Fri Oct 09 15:11:28 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Oct 09 15:11:28 2026 -0700"
      },
      "message": "[build] Add .bazelignore to exclude prebuilt install_base\n\nExclude prebuilt/bazel/install_base, tmp_rsclient_unpack, and\nfor_context_only from recursive Bazel package pattern expansion.\nThis allows \u0027./bazel build ...\u0027 to succeed without attempting to load\ninternal toolchain packages unpacked from CIPD.\n\nTest: ./bazel build ...\nTest: ./scripts/precommit.sh --skip-diff-check\n\nChange-Id: Ibcb668708ffcd2557df10b5d35be6fbc4ae4a4f5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1881047\nReviewed-by: David Fang \u003cfangism@google.com\u003e\nCommit-Queue: Mike Comfoltey \u003ccomfoltey@google.com\u003e\n"
    },
    {
      "commit": "040877b3425b114dbf92f31a7514b0630897413d",
      "tree": "83a776f2574ac2499eb5110c30d95a10211fd277",
      "parents": [
        "df97cbc53824c4ade152d2145b8af1f941246cdf"
      ],
      "author": {
        "name": "Mike Comfoltey",
        "email": "comfoltey@google.com",
        "time": "Fri Oct 09 15:09:56 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Oct 09 15:09:56 2026 -0700"
      },
      "message": "[deps] Upgrade Go to 1.27.1 and gRPC to 1.84.0\n\n- Upgrade google.golang.org/grpc to 1.84.0 to resolve vulnerability\n  findings.\n- Upgrade Go SDK to 1.27.1 in go.mod and MODULE.bazel.\n- Set ServerStreams and ClientStreams to true in downstream RPC port\n  tests to satisfy gRPC stream cardinality enforcement.\n\nBug: 558381505\nTest: ./scripts/precommit.sh --skip-diff-check\nTest: ./scripts/infra/presubmit.sh\n\nChange-Id: Ic91603a7d408d3d6e4debd33784ad1c810f5f686\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1875446\nCommit-Queue: Mike Comfoltey \u003ccomfoltey@google.com\u003e\nReviewed-by: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "df97cbc53824c4ade152d2145b8af1f941246cdf",
      "tree": "ccc5bd1e7170f0ebb8044986901ed84a47757652",
      "parents": [
        "b898b00d745816afafc4d012a64102cc8f375eee"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Oct 08 09:10:37 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Oct 08 09:10:37 2026 -0700"
      },
      "message": "[rsproxy] Fix CAS-disabled deadlock on file uploads\n\nPrevent unbounded build deadlocks when ResultStore metadata streaming is\nenabled without a connected Content Addressable Storage (CAS) service:\n\n* uploadFiles: When CAS uploads are disabled (w.cas.client \u003d\u003d nil), skip\n  file enqueueing and digest waiting immediately. Previously, files were\n  enqueued to cas.uploadFilesQueue where the background drain loop\n  pulled\n  and discarded them without signaling DigestsComputed(), causing\n  rewriteFile() to hang indefinitely.\n* rewriteFile: Add DefaultCASDigestTimeout (60s) and bound digest\n  computation with context.WithTimeout. If digestion times out or fails,\n  log a warning and skip the CAS URI rewrite non-fatally rather than\n  halting the pipeline.\n* tests: Add TestResultStoreEgress_DisabledCAS_DoesNotDeadlock and\n  TestResultStoreWorker_RewriteFile_TimeoutSkipped.\n\nBug: 570223323\nChange-Id: If70faee848f43e7f16b33add71cd4ff1076b3835\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1874806\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nPresubmit-Verified: fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cfuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "b898b00d745816afafc4d012a64102cc8f375eee",
      "tree": "1f21bc3aa9d592a101c2862ff6d10d9a0e4e2233",
      "parents": [
        "217330f93c0580d92ecb0b4aa2d3796aff42ade3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Oct 01 06:41:30 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Oct 01 06:41:30 2026 -0700"
      },
      "message": "[rsproxy] Optimize verbose logging of ResultStore requests\n\nWrap expensive prototext.Format(req) calls in glog.V(2) conditional\nguards. Because Go evaluates function arguments before dispatching the\ncall, evaluating prototext.Format for every request/batch on the hot\npath causes substantial CPU and garbage collection/memory allocation\noverhead, even when verbose logging is completely disabled.\n\nWith this change:\n* Default logging (v\u003d0) is entirely silent on these hot paths.\n* v\u003d1 logs a lightweight count representation of upload batches:\n  \"uploadBatch (N requests)\" without any serialization overhead.\n* v\u003d2 logs the full prototext-formatted request and batch dumps.\n\nBug: 473907403\nChange-Id: I4eb2f2d5c873011aceadee94b0f407c5b97b2ef5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1858401\nPresubmit-Verified: fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cfuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nFuchsia-Auto-Submit: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "217330f93c0580d92ecb0b4aa2d3796aff42ade3",
      "tree": "75913dc8414dc24b0d54657411e9135c69b16bb6",
      "parents": [
        "9354fc80922aa86adf6ef95f051cd9740adc7d67"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Sep 17 17:02:56 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Sep 17 17:02:56 2026 -0700"
      },
      "message": "[rsproxy] Reorder initialization to prevent FIFO deadlock\n\nSwap the order of IngressWorker and EgressWorker setup in NewProxy. This\nensures the FIFO named pipe is opened and grounded for reading\nimmediately, unblocking the POSIX shell wrapper\u0027s blocking open write\nhandle.\n\nThis decouples IPC establishment from external gRPC dial latencies and\ncredential exchanges, resolving hangs when ResultStore or CAS endpoints\nare misconfigured or unreachable. Failing out allows builds to fallback\nwithout ResultStore.\n\nAlso:\n* Adds proxy.Shutdown() on egress worker creation failures to prevent\n  resource/file descriptor leaks.\n* Reduces the shell-wrapper monitor timeout from 3600 seconds to\n  READY_FILE_TIMEOUT + 2 seconds (typically 12 seconds), so the wrapper\n  will unblock the pipe and degrade gracefully within seconds if rsproxy\n  fails to write its ready file.\n\nBug: 473907403\nChange-Id: Ice065551b88e876fdc67cf5fd4424c539de929cd\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1826955\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "9354fc80922aa86adf6ef95f051cd9740adc7d67",
      "tree": "ab384aaa7c4b95dc418b3653cb63107d57eac0b1",
      "parents": [
        "7d43821b6e185d38d6cf0fd326f18272f0518bce"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Sep 17 10:09:07 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Sep 17 10:09:07 2026 -0700"
      },
      "message": "[rsproxy] fallback to USER env variable\n\nWhen running rsproxy inside isolated sandboxes (like nsjail), os/user is\nnot guaranteed to work. Falling back to the USER environment variable\nresolves the username, which can be artificially set.\n\nBug: 473907403\nChange-Id: I51d1044c5f0d692bf6e98aa7d0d89326d7d70edd\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1826956\nFuchsia-Auto-Submit: David Fang \u003cfangism@google.com\u003e\nPresubmit-Verified: fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cfuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\n"
    },
    {
      "commit": "7d43821b6e185d38d6cf0fd326f18272f0518bce",
      "tree": "22c500a214f974d8f4ddb2cb8bfff74375d16804",
      "parents": [
        "e86fc085093c13b82059aef5e0ddafcda22712c9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Sep 04 22:56:04 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Sep 04 22:56:04 2026 -0700"
      },
      "message": "[event] keyboard bindings for help generation\n\nKey-press event trigger registers and dynamic keymap bindings:\n* event.KeyMap: descriptive keyboard triggers and descriptions.\n* event.Binding: maps keypress patterns to contextual actions.\n\nEnables modular, declarative help pane registration and keyboard-driven\naction routing.\n\nBug: 487240814\nChange-Id: I764f51709233bf7182a5f696d67bad181e0e2ed1\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1797259\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nFuchsia-Auto-Submit: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "e86fc085093c13b82059aef5e0ddafcda22712c9",
      "tree": "346f4ca48fdd3887380cbb961ba9b42adaa2c9bc",
      "parents": [
        "e075eafea5caf7c93183d8dcdeb24d97c4020684"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Sep 04 22:48:31 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Sep 04 22:48:31 2026 -0700"
      },
      "message": "[tui] waveform math for animations\n\nThese waveform functions are useful for temporally driven UI animations\nand state changes (e.g. momentary overlays, view cycling).\n\nBug: 487240814\nChange-Id: Ic875821a46f2e43b5a8fa3c6958865cf99d95e5d\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1797258\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nPresubmit-Verified: fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cfuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "e075eafea5caf7c93183d8dcdeb24d97c4020684",
      "tree": "c31f7f610ed531ebf6fa878d03b359769d1caed7",
      "parents": [
        "639d22eae115ac17a71105c7c0e6b1651db25a20"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Sep 04 22:48:25 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Sep 04 22:48:25 2026 -0700"
      },
      "message": "[vtime] factor out VirtualClock\n\nVirtualClock provides deterministic timeline simulation controls.\n\nUseful for:\n* buildminder simulator refactoring\n* mockable terminal repaint throttling\n* testing momentary temporal controls in (upcoming) subpackage\n\nBug: 487240814\nChange-Id: I6cf6c8eb2b0d2187b32deefcee838a6deff4dab6\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1790818\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "639d22eae115ac17a71105c7c0e6b1651db25a20",
      "tree": "a612401c4183141f0792a190d758fc839231708f",
      "parents": [
        "2d11d07634ddf83dc9afa6942815dfacf1a20ed9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Sep 04 22:48:14 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Sep 04 22:48:14 2026 -0700"
      },
      "message": "[layout] FitConstraint calculation\n\nFitConstraint determines how many whole and partial (maybe +1) elements\nfit within a maximum size limit. This is useful for viewport rendering\ndecisions.\n\nBug: 487240814\nChange-Id: I1a69d5cadf41a4fba44946b63900992a7ff4713a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1790817\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "2d11d07634ddf83dc9afa6942815dfacf1a20ed9",
      "tree": "dc70cf3c71f01dc2ffd875f4ceeae9bed0572aac",
      "parents": [
        "627b27fbefda8c83d6ace1b8883bdf3599ff9e25"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Sun Aug 23 22:35:04 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sun Aug 23 22:35:04 2026 -0700"
      },
      "message": "[benchmark] benchmarking tools, component benchmarks\n\nREADME.md: (benchmarking) describes our approach to benchmarking the\nTUI, including a variety of models-under-test for comparison. Basic\nmetrics: time/op, heap-allocs/op.\n\nMain rendering models under test:\n* Scribe-based (our new and improved) -- directly writing to\n  Canvas/FrameBuffer, using pull-driven viewports.\n* Stitch-based (semi-old) -- composition based on returned []string\n* includes variants with and without adaptation to tea.Model.View()\n  Adaptation includes the cost of flattening representations to\n  monolithic string.\n\ntuitest/benchmark_harness.go:\n- BenchmarkHarness provides a simulation environment for measuring\n  update-render event sequences.\n- Workloads are expressed as BenchmarkSchedule of BenchmarkSteps,\n  including time-tick events, triggered updates, render cycles.\n- Use RunAllModels() on each component-workload combination.\n\nBenchmarked components:\n- Atom-level benchmarks (atoms_benchmark_test.go):\n  measures: text segments, spacers, and animated marquees.\n- Compose-level benchmarks (compose_benchmark_test.go):\n  measures: tiling (BoxRow, BoxColumn, StaticRow) and\n  layering (OverlayBox, TableBlock) layout.\n\nBug: 487240814\nChange-Id: I757058b6b316bfb3e9a710d42734f0b4d8be5144\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1754352\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "627b27fbefda8c83d6ace1b8883bdf3599ff9e25",
      "tree": "b832e756685e4a281960430d3eb262f637dfa707",
      "parents": [
        "3311312d77d8cbcb2ad7e9312c95c411df893519"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 14 22:43:34 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 14 22:43:34 2026 -0700"
      },
      "message": "[tui2] optimized GridPartition, implement StitchLines in compose/\n\ntui2/compose/grid_partition.go:\n- Refactored X (Column) and Y (Row) layout dimensions caches to\n  use a generic `dimensionLayoutCache[K]` structure that\n  combines distribution memoization, unbounded offset caching,\n  and stateful layout memoizations.  Partially fixes a performance bug.\n- `constraintSensitivityMemo` to manage layout-specific revisions.\n  It performs O(N) comparisons of *active* child constraints\n  and sizes on each pass, and bypassing full layout distribution\n  recalculations on geometry-stable frames even when global\n  revisions increment.\n- Factored constraint calculations to `computeColumnConstraints`\n  and `computeRowConstraints`.\n- `scribeState` remove concrete Canvas pointers (no need to compare),\n  which are already stable over the lifetime of TUI components.\n  This fixed a part of a performance bug found during benchmarking.\n\ntui2/compose/: (everything else)\n- Migrated test suite to the TestSchedule/Step DSL,\n  exercising all interactive layout, focus, and culling flows.\n- Updated Scribe-call count checks to use tuitest.AssertScribeCalls.\n- Implement and test StitchLines for benchmarking.\n  Where applicable, uses CJK-safe pkg/text operations to replace\n  manual lower-level rune-splicing functions,\n  and optimized to reduce heap allocations.\n- Refactored BoxRow, BoxGrid, and TableBlock to utilize the\n  pre-allocated\n  text.JoinHorizontal utility to eliminate redundant intermediate slice\n  allocations during horizontal layout compilation.\n  Fix missing vertical padding and right alignment padding.\n- Replace strings.Repeat with text.FillSpace many places (optimization)\n- Refactored BoxRow.StitchLines to utilize the optimized text.BoxLine\n  utility,\n  completely removing manual rune-slicing and strings.Repeat.\n- stencil_box.go: now memoize the bit mask based on mask function.\n  Use refactored text.BlendLines.\n- transparent_layers.go: use refactored text.BoxLines and\n  text.OverlayLines, replacing manual loops.\n- titled_window.go: added TitledWindow single-child decorator and\n  associated tests.\n- Updated comments to \u0027propagation\u0027 terminology instead of \u0027bubbling\u0027.\n\nBug: 487240814\nChange-Id: I767758ae0fe38d10ea16ecdfb9a119ba8233b609\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1754351\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "3311312d77d8cbcb2ad7e9312c95c411df893519",
      "tree": "79bcfa3d2689f79764e4f41b75d7a857fa147ee2",
      "parents": [
        "655fb8b3bf8b44db05ce6eb4aa9d3fbfa0721ea6"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 14 22:43:29 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 14 22:43:29 2026 -0700"
      },
      "message": "[tui2] Update testing and documentation, prepare for benchmarks\n\ntuitest/\n- introduced TestSchedule, TestStep.\n  This has the benefit of making tui tests much easier to read and\n  write, with a tiny DSL for expressing sequences of changes and\n  expected results, including verifying properties like cache\n  sensitivity.\n  Modernized existing tests to use this.\n  - Update ScribeCalls checks to use AssertScribeCalls.\n  - AssertAndResetScribeCalls is useful for sequential mutation tests\n    that make it easier to express incremental (non-cumulative) changes.\n- rename harness.go to view_harness.go (Harness -\u003e ViewHarness) for\n  clarity.\n\nDocumentation, README.md:\n- Updated language to use \u0027propagate\u0027 terminology instead of \u0027bubbling\u0027\n\ncore:\n- stitch.go: optional interface that represents a slice-of-strings based\n  implementation of tea.Model.View(), that resembles a\n  reasonably-performing implementation of Views in the old TUI library.\n  This is the basis for comparison when benchmarking.\n  Following commits will implement and test StitchLines() for a variety\n  of view-composers.\n- atoms/title_bar.go: introduced TitleBarView to render\n  horizontally-centered headers.\n\nBug: 487240814\nChange-Id: I2f1681284a0d58888ccea0cdaac8ea7f052058bf\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1754350\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "655fb8b3bf8b44db05ce6eb4aa9d3fbfa0721ea6",
      "tree": "5edad0aea3a343c358c81cee6dbaf60d8f9acda6",
      "parents": [
        "e2d5928f8e8c7822d8201fca903e63337788f751"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 14 22:43:24 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 14 22:43:24 2026 -0700"
      },
      "message": "[text] JoinHorizontal, CenterLabel, OverlayRunes, BlendLines\n\nUpdates to the text package to support upcoming commits, including bug\nfixes in composers.\n\nbox.go:\n- Implemented JoinHorizontal(blocks [][]string, height int) []string\n  This is a common operation that will be used by upcoming\n  functions that stitch together rows of text (performance critical).\n  - Pre-allocated strings.Builder buffer capacities via sb.Grow\n    bounds the number of heap allocations.\n  - BenchmarkJoinHorizontal verifies expected performance.\n- OverlayLines, overlayRunes: correctly overlays strings and accounts\n  for rune-correctness to avoid tearing of multi-char runes (CJK-safe).\n  Reuses buffers to minimize GC activity for performance.\n- BlendLines: piecewise assembles a string from two string sources,\n  also correctly accounting for rune widths.\n\nborder.go:\n- Refactored CenterLabel(): label-centering/truncation\n  logic used in a variety of places, such as title bars.\n  - Handle multi-byte/wide Unicode characters\n  - automatic truncation when the label exceeds available space\n  - precise distribution of rounding differences between left and\n    right padding, including bounds safety checks.\n\nBug: 487240814\nChange-Id: I3cae39274d5a67cffb5c2fb105b6a71f57acc89a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1754349\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "e2d5928f8e8c7822d8201fca903e63337788f751",
      "tree": "556b9c0709f14638b15c935dcd99c9d9115b7a48",
      "parents": [
        "501a1096b07ad6139eb65257c7838a1450538493"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 14 15:43:14 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 14 15:43:14 2026 -0700"
      },
      "message": "[doc] Document Python formatting workflow in GEMINI.md\n\nChange-Id: I453f92eaa36350cfe8507f091a58b78935e6d1d6\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1762858\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\nFuchsia-Auto-Submit: David Fang \u003cfangism@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "501a1096b07ad6139eb65257c7838a1450538493",
      "tree": "cd19937bde929f4bbd1fc91c1c55dbcea68cfec8",
      "parents": [
        "3c5cabebf04a9d56f0f52b7d893066987f09e9ea"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Aug 13 08:57:01 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Aug 13 08:57:01 2026 -0700"
      },
      "message": "[besproxy] real-time exit codes from profile\n\nA locally patched bazel now emits real-time exit codes in the profile\nstream.  This will allow us to see failed actions in real time.\n\nWithout the exit codes in the trace, events are treated as\noptimistically successful until the BEP finalizes action statuses, at\nthe very end of the build.\n\nThe patched bazel profile stream includes \"exit_code\" in phase \"E\" (End)\nevents under \"args\" (of Chrome trace format).\n\n1. Updates handleProfileActionEnd in joiner.go to parse the new\n   \"exit_code\" argument.\n2. Transitions the action state directly to FAILED in real-time when a\n   non-zero exit code is detected, maintaining complete\n   backward-compatibility if standard/unpatched Bazel binaries are used.\n3. Adds TestJoiner_ProfileEvents_FailingAction to explicitly verify and\n   protect this translation behavior in our unit test suite.\n\nBug: 487240814\nChange-Id: I6523552d1c091ef3a15039ba16ae9d9774342c10\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1716535\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "3c5cabebf04a9d56f0f52b7d893066987f09e9ea",
      "tree": "2841f9c2aa236604bc308b331eadc7f278fd4276",
      "parents": [
        "73a60b2624870b44b2c69ecdb9199efc8fa1731a"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Aug 13 08:51:05 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Aug 13 08:51:05 2026 -0700"
      },
      "message": "[besproxy] Disregard BEP event timing, correlate threads\n\nBazel\u0027s BEP does not provide live timing information, so rely on the\n(experimental) timestamps from a streamed profile.\n\nThis change refines our real-time profile streaming integration:\n- Solely relies on high-precision timing from the profile trace stream,\n  completely disregarding BEP timing for actions.\n  If an action has already started via the profile, we strip coarser\n  BEP timestamps (Timestamp \u003d nil) from any subsequent updates,\n  completely preventing temporal regressions or clock skews without\n  needing clamping inside the state machine.\n- Thread-Based Correlation: Maps active action labels by thread_id\n  inside Joiner, resolving empty target labels on Phase \"E\" (End)\n  events and instantly completing actions in the TUI the exact\n  microsecond they finish/fail.\n- Visual Zero-Clamp: Clamps negative running action durations to zero\n  in running_actions.go, gracefully absorbing sub-millisecond\n  OS thread scheduling lags.\n\nIf bazel lacks the experimental profile streaming feature, behavior will\nstill fallback gracefully to handle completed events from BEP and the\nnon-streamed profile (\"X\" events) -- you just won\u0027t see real-time\nupdates in buildminder because the timing information arrives all at the\nend of the build.\n\nBug: 487240814\nChange-Id: I5b518967d39816b9fa7af8816c9dafea11be1123\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1712190\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "73a60b2624870b44b2c69ecdb9199efc8fa1731a",
      "tree": "9de7a95e58d05b1338a5ef1d4783a9cd9f9c6430",
      "parents": [
        "9ff436df3f42dfd33722a92ad826f487538df528"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Aug 13 06:03:17 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Aug 13 06:03:17 2026 -0700"
      },
      "message": "[layout] 2D compressed BitMask for overlays\n\nImplement layout.BitMask, a 2D boolean bit-matrix designed to support\ncompressed stencils and transparency overlays (in tui/compose). Bits are\npacked uint64 words, minimizing memory footprint and enabling fast\nmachine-level bit operations.\n\n- Register-Level Word Checks: Performs 64-bit word assertions for\n  AllSet() and AllClear().\n- NewBitMaskFromFunc() converts a closure to a BitMask.\n- LineTransitions(): Extracts row-level interval transition points,\n  as a representation of alternating regions, from which\n  two strings can be woven together efficiently.\n\nThis will help fix a few bugs and bring some optimizations in\ntui/compose in subsequent commits.\n\nBug: 487240814\nChange-Id: I71ed224fed32810482f5b7160c60b080dcce26e2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1759754\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nFuchsia-Auto-Submit: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "9ff436df3f42dfd33722a92ad826f487538df528",
      "tree": "246ab13667f198f070d9fdc6d00600fd98a97a5b",
      "parents": [
        "57e279050b34f4a46a658836d5e428a4873c379b"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Aug 12 10:22:45 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Aug 12 10:22:45 2026 -0700"
      },
      "message": "[testing] Package standalone profile_tap_helper.\n\nAdds and packages scripts/profile_tap_helper.sh inside our distribution\nartifacts (bin/profile_tap_helper.sh).\n\nThis helper enables Fuchsia\u0027s parent wrapper.bazel.sh to dynamically tap\nand stream uncompressed profile traces to besproxy in real-time, while\ncompressing the stream to gzip on-the-fly to ensure 100% compatibility\nwith ResultStore uploading.\n\nBug: 487240814\nChange-Id: Ic44a49e3c0e05f3812fa5dafbe9a600bafdef463\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1712191\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "57e279050b34f4a46a658836d5e428a4873c379b",
      "tree": "57ebc2853e105bc54ce5aae61134409a03eb88d6",
      "parents": [
        "4e894aa028471730f08fac23e17ae26122bc4f1d"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 07 10:05:12 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 07 10:05:12 2026 -0700"
      },
      "message": "[tui2] Implement Spatial Clipping, Stencil Masking, and Z-Layering\n\nIntroduce advanced visual processing passes, coordinate-slicing\nclipping, stenciled maskings, flat Z-layer overlays, and focus-aware\nframed windows.\n\nKey Features:\n- Viewport Clipping (ClippingBox): Implements coordinate bounds\n  filtering,\n  enabling scrollable list/view containers to clip child elements\n  seamlessly\n  without manual arithmetic inside children.\n- Cell-Level Stenciling (StencilBox): Custom cell-by-cell transparency\n  masks to shape rectangular nodes dynamically.\n- Z-Axis Stack Layering (TransparentLayers): Implements back-to-front\n  Z-stacked layout layers with active culling of occluded coordinates,\n  powering overlap panels and window management.\n- Focus Borders (FramedWindow): Decorative double-bordered panes with\n  upward ComposerLink title propagation and uncached revision-sentinel\n  overrides.\n\nBug: 487240814\nChange-Id: Ie26dd5c308a84bfd2c1d3e65c479702469826597\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1717742\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "4e894aa028471730f08fac23e17ae26122bc4f1d",
      "tree": "1630911ddb3d76689b5348f9e8540ab00a2f192d",
      "parents": [
        "b6b193f877c6f3e7ce7909a1464017a14f4f992d"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 07 10:02:33 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 07 10:02:33 2026 -0700"
      },
      "message": "[layout] Implement 2D Rect.Covers geometry primitive\n\n- Implemented Rect.Covers method in internal/pkg/layout/geometry.go to\n  check whether one 2D rectangle completely encompasses another.\n- Added comprehensive unit testing for Rect.Covers in geometry_test.go\n  covering identical, fully nested, shifted, and larger rectangles.\n\nChange-Id: I97fd7b207fdd246e2a66c306d407d0e7ea8cc8da\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1743409\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "b6b193f877c6f3e7ce7909a1464017a14f4f992d",
      "tree": "9009f30e0ba4b1fb876a542153670b61c9ad15ed",
      "parents": [
        "461ed185b06ca3d97908ead1e624f6213e4db201"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 07 10:01:06 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 07 10:01:06 2026 -0700"
      },
      "message": "[tui2] 2D layout composers, tiling box layout Engine\n\nReplace legacy TUI composers with high-performance 2D spatial layout and\ngrid partitioning composers under internal/pkg/tui2/compose.\n\nKey Improvements over old TUI:\n- Universal 2D Grid Engine: Replaced separate, custom row/column models\n  with GridPartition, unifying all horizontal (BoxRow), vertical\n  (BoxColumn), and spreadsheet-like (TableBlock) containers under a\n  single 2D\n  floorplanning engine. Reduced code duplication (and near-duplication).\n- Parallel Scribing: Parallelizes rendering concurrently across Y-axis\n  row boundaries (Vertical-Only), lock-free and thread-safe.\n- Upgraded BoxColumn to child-revision-aware tui2.Memo caching,\n  solving legacy bugs where dynamic child height changes failed\n  to trigger boundary recalculations.\n- Embed ComposerNode across all tiling models to automate parent link\n  tracking and O(1) sequential revision-summing dirty-passes.\n\nBug: 487240814\nChange-Id: I37ebecd283a76afcdc8d14c7508e74c411941a84\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1733892\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "461ed185b06ca3d97908ead1e624f6213e4db201",
      "tree": "ae41a7d735fcbb732c147cbcf9943c48172751ba",
      "parents": [
        "8070ad011dc3300adbd24858df872f5757c2ec8d"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Aug 07 09:57:12 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Aug 07 09:57:12 2026 -0700"
      },
      "message": "[tui2] update Scribe interface, tuitest, and atoms\n\nview.go: Introduce Composer as an interface that represents a\ncomposite/parent Scribe caller, e.g. from a UI composer/container to one\nof its children. This supports a shift toward\ndeclaring-mutation-as-it-happens (push) for much better performance over\ndetecting-mutation through (hashing) signature changes. Generally,\nmutation/set operations will increment a component\u0027s internal revision\nnumber.\n\nUpdated BoxView\u0027s Scribes interface/signature to: 1) Group params into a\nsingle ScribeContext structure. 2) Add Parent (of type Composer) to\nScribeContext so a scribed element knows how to\n   notify its containers that a change actually occurred (revision\n   update protocol, for memo/cache invalidation).\n   Notification is upward-recursive.\n\nScribeContext: Transitioned ScribeContext to use value receivers rather\nthan pointers during the recursive scribe pass. This critical\noptimization completely eliminates heap escape, allowing the context to\nbe stack-allocated and passed efficiently within CPU registers,\ndramatically reducing heap allocation volume and GC activity on hot\nrendering paths.\n\nHelper structs like ComposerLink help determine whether an update from a\nchild was actually visible to its parent based on its last requested\nviewport, and warrants invalidation.\n\ntuitest/*.go: Re-organized into separate files based on testing role\n(assert.go, harness.go, mocks.go, revision_harness.go). RevisionHarness\nis designed to test the revision-updating contract from children\nelements to parents, to ensure that invalidations happen when they are\nsupposed to, applicable to all implementers.\n\natoms/*.go: Updated to adhere to updated Scribe interface.\n\nIt was necessary to bundle all these changes together to prevent build\nbreakage due to interface skew.\n\nBug: 487240814\n\nChange-Id: I31fe14fb0da49b5a49847076f19d3a3933290c4b\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1727451\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8070ad011dc3300adbd24858df872f5757c2ec8d",
      "tree": "cdfd3e4ee3e8c8be3d1ee478d4f2d30d5f18ae45",
      "parents": [
        "1ce34566f31afe779a0cacddb19b9af9b83781a5"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Aug 04 11:39:27 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Aug 04 11:39:27 2026 -0700"
      },
      "message": "[tui2] Implement Frame border painter and typographical crossing solvers\n\nIntroduce Frame border painters under internal/pkg/tui2/draw, and the\ntypographical crossing solver under internal/pkg/text. These are added\nin preparation for upcoming commits using border graphics.\n\nKey Changes:\n- Border Styling \u0026 Customization: Implement draw.Frame, allowing\n  elements to paint single-line light borders or double-line\n  borders (for focus/blur states) around canvas dimensions.\n- Decoupled Rendering: draw.Frame operates as a pure visual painter\n  on top of the Canvas, allowing components to render decorative borders\n  without adding layout tree complexity.\n- Style Querying: Queries text.BorderRunes dynamically to resolve\n  graphical line sets (single, double, or rounded) from environment\n  context.\n- Typographical Crossing Solvers (border.go): Implement MakeJunctionLine\n  and getJunctionRune using a flat array-based jump table to resolve\n  overlapping horizontal/vertical line intersections on terminal\n  screens.\n- Verify 100% build-and-test passes under Bazel across all 175 targets.\n\nBug: 487240814\nChange-Id: I9992d6b7f0a69d9918934ae5567f714be9d668b5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1733893\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "1ce34566f31afe779a0cacddb19b9af9b83781a5",
      "tree": "deab1e4f0ddac9f540eb5ffb81d42b8eddd13e92",
      "parents": [
        "33cfd1557829fa1ec79b30a815c4c8f5998c42b7"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Aug 04 02:53:59 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Aug 04 02:53:59 2026 -0700"
      },
      "message": "[layout] Introduce IntersectAndTranslate 2D projection primitive\n\nIntroduce IntersectAndTranslate method to Rect struct, consolidating 2D\nspatial intersection and coordinate translation calculations into a\npure, un-cached geometric calculation inside the layout package.\n\nThis completely decouples coordinate-space calculations from TUI canvas\nelements and allows universal reuse across overlays, cutouts, and layer\ncompositors.\n\nIntroduce UnboundedSpan constructor helper for expressing unbounded\nspatial spans.\n\nAdd extensive table-driven unit tests to geometry_test.go verifying\nfull, partial, empty, and unbounded projections.\n\nBug: 487240814\nChange-Id: I77bf0d1911424e4d16c4d09922845c28eb18d34f\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1740469\nFuchsia-Auto-Submit: David Turner \u003cdigit@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "33cfd1557829fa1ec79b30a815c4c8f5998c42b7",
      "tree": "816f11b566a5700d51c68744af39f1318b360202",
      "parents": [
        "af429b372689f1deef2e16912fb104ea69e6bd40"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Aug 04 02:53:01 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Aug 04 02:53:01 2026 -0700"
      },
      "message": "[text] Optimize string padding, pre-allocate space templates, and cache multibyte patterns\n\nIntroduce zero-allocation text padding and space caching inside\ninternal/pkg/text to support high-performance terminal layout rendering.\n\nKey Changes:\n- Zero-Allocation FillSpace: Pre-allocate a 512-character spaceBuffer\n  template. Slices are returned in lock-free O(1) time with 0 GC\n  allocations.\n- Zero-Allocation FillChar: Implement patternCache, an on-demand\n  thread-safe cache that pre-compiles and slices multibyte pattern\n  templates in O(1) time and 0 allocations once warmed up.\n- Optimized Fallbacks: Add micro-benchmarks and automated\n  testing.AllocsPerRun unit tests proving 0 allocations on standard\n  widths.\n\nBug: 487240814\nChange-Id: I23817ddc038d4b2a91c5a4576de1f4f43983456f\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1741109\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nFuchsia-Auto-Submit: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "af429b372689f1deef2e16912fb104ea69e6bd40",
      "tree": "fb31e852253c3177b9888876c6ad23f7e0d8a8bd",
      "parents": [
        "1f31925497013fe7f4090fb6867d556c0fce34c6"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 30 00:38:47 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 30 00:38:47 2026 -0700"
      },
      "message": "[build] Modernize Bazel rule dependencies and clean up clang toolchain\n\nModernize direct dependencies to eliminate version mismatch warnings,\nand clean up deprecated toolchain definitions:\n\n* Update MODULE.bazel direct dependencies (rules_cc, rules_shell,\n  bazel_skylib, platforms, abseil-cpp, protobuf, rules_proto,\n  rules_python, and gazelle) to match resolved versions, eliminating\n  dependency mismatch warnings on standard and experimental local-bazel.\n* Remove the deprecated no-op `cc_toolchain_suite` target from\n  scripts/infra/clang_toolchain.BUILD.bazel, resolving the standard\n  Bazel build warning.\n\nChange-Id: Ic557b57d6ff46d2f53a477565299a155682e3a71\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1732689\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "1f31925497013fe7f4090fb6867d556c0fce34c6",
      "tree": "1d826829949beb2c224bcfd56fbb59c5f9c328c4",
      "parents": [
        "05f7988274866b8ea2502ebde202ddeb6cc95dcb"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 30 00:19:07 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 30 00:19:07 2026 -0700"
      },
      "message": "[besproxy] Symmetrically filter pseudo-actions, align ActionIds, and resolve exit deadlocks.\n\nThis change completes our Bazel profile streaming integration with three\nmajor refinements:\n- Symmetrical Filtering: Implements an ExcludedMnemonics set in\n  jobstatus to symmetrically filter out administrative pseudo-actions\n  (like BazelWorkspaceStatusAction) from both BEP and profile streams.\n- Aligned ActionIds: Prefers target labels over primary output paths as\n  ActionIds in TranslateActionExecuted, aligning both streams to ensure\n  running actions complete cleanly in the TUI.\n- Deadlock-Free Shutdown: Switches GracefulStop to non-blocking Stop on\n  buildminder\u0027s gRPC server, and stops the server inside our background\n  quit loop. This cleanly breaks circular socket deadlocks because\n  GracefulStop was blocking waiting for active client\n  streams/connections to close, while the proxy\u0027s async readers/writers\n  were permanently blocked waiting for EOF, creating a classic circular\n  lock dependency. Forcing Stop immediately closes all active sockets.\n\nAlso refactors translate_bazel.go to remove unreachable and\nnon-deterministic startTime nested checks, adding watertight\nmathematical proof that both StartTime and EndTime cannot be nil.\nCertifies the profile exclusion filters with comprehensive unit tests.\n\nBug: 487240814\nChange-Id: I9b1aecf3a34712f423193cab6323b75570609e06\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1709591\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "05f7988274866b8ea2502ebde202ddeb6cc95dcb",
      "tree": "300e557c451525effa1955d5853b0d746357cf86",
      "parents": [
        "6b2407fde527ffd24f2dc5520caef1f6c5a568fc"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 30 00:17:50 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 30 00:17:50 2026 -0700"
      },
      "message": "[besproxy] ingest Chrome Trace profile stream\n\nThis is testing an experimental feature of bazel that provides an option\nto stream out the command-profile (Chrome Trace format) with real-time\naction life cycle events \"B\" and \"E\". This supplemental data source is\nneeded because bazel\u0027s BEP alone fails to provide the desired\ninformation in real-time.\n\n1. Chrome Trace fifo intake (profile_ingress.go):\n   - Streams in a Bazel (Chrome trace) profile, incrementally reads\n     chunks, and decodes incoming Chrome Trace Event JSON frames.\n   - Forwards events dynamically onto our besproxy internal channels.\n\n2. Stream translation and action-joining (joiner.go):\n   - Correlates incoming live Chrome Trace events with concurrent\n     gRPC BES and RBE events using dynamic action-matching rules.\n   - Incorporates local Proto-definitions inside\n     \u0027besproxy/translation/proto\u0027 to fully model live trace-events\n     as part of our telemetry ingress pipeline.\n\n3. Process Integration (proxy.go, funnel.go):\n   - Plumbs the profile ingress pipeline directly into our central\n     BES Proxy processes.\n\n4. Generic stream parser (chrometrace/event.go):\n   - Introduces chrometrace.ParseStream, a reusable, zero-dependency\n     Chrome Trace JSON streaming parser.\n   - Decodes outer wrappers, checks standard JSON object boundaries,\n     delegates key handling, and decodes array streams in real-time\n     via callbacks.\n   - Refactors ProfileIngress to consume ParseStream declaratively,\n     drastically reducing code footprint and complexity.\n   - Adds TestParseStream_TruncatedInput to ensure robust decoding error\n     handling on truncated streams.\n\nBug: 487240814\nChange-Id: I3a65d801727dba552847074fc2080ee813297e2b\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1709796\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "6b2407fde527ffd24f2dc5520caef1f6c5a568fc",
      "tree": "7849eacb4af8f32f056b59eee4047ba9a11963a6",
      "parents": [
        "2ce8e8ed15497dea4296d2e96eac7a20f8886a28"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Jul 29 22:47:54 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 29 22:47:54 2026 -0700"
      },
      "message": "[text] Introduce FNV-1a zero-allocation sequential Hasher\n\nAdds a stack-safe, zero-allocation Fowler-Noll-Vo (FNV-1a) sequential\nhashing library inside internal/pkg/text.\n\nIncludes detailed docstrings explaining the FNV-1a algorithm and its\n64-bit constants, and verifies hash determinism in hasher_test.go.\n\nBug: 487240814\nChange-Id: I02741a145c8a0709acd8187d8a8200928eb70f09\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1727450\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "2ce8e8ed15497dea4296d2e96eac7a20f8886a28",
      "tree": "b3f1dc2c9baaec8fac365ae78d15e425463a4268",
      "parents": [
        "da8889f36f7c5bddfc03b4a2839855f8ecbc26c9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Jul 29 22:47:37 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 29 22:47:37 2026 -0700"
      },
      "message": "[layout,text] Upgrade text formatting and 2D layout geometry primitives\n\nUpdates the existing internal/pkg/text and internal/pkg/layout packages\non main to support high-performance terminal UI layout calculations and\ntext alignment.\n\nKey Upgrades:\n1. Layout Geometry: Enhances Point, Size, Span, and Rect models to\n   support flexible grid distributions, safe boundary clamping, and\n   coordinate conversions.\n2. Text Formatting: Upgrades alignment, wrapping, padding, and trimming\n   routines to support multi-rune characters while eliminating redundant\n   string allocations.\n3. Pure Isolation: Contains zero new file additions, keeping upstream\n   base utility packages completely decoupled from TUI layout and\n   rendering files.\n4. Comprehensive Verification: Both packages compile and pass their\n   fully updated unit tests 100% under Bazel.\n\nBug: 487240814\nChange-Id: Ieb55e29e3c561cea2d6530f1bf44c517bcc8e675\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1727449\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "da8889f36f7c5bddfc03b4a2839855f8ecbc26c9",
      "tree": "df2c9e2ec78e04abfa64c5fc333dc5436f019799",
      "parents": [
        "ab3938b19921bca71d94bd9e7b0e108656654365"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Jul 29 22:34:55 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 29 22:34:55 2026 -0700"
      },
      "message": "[testenv] Remove unused context parameters from New and NewRouter\n\nRemove the unused \u0027ctx\u0027 parameter from testenv.New, rsproxy.NewRouter,\nand unexported helpers since they now rely on Go 1.24\u0027s native\nt.Context().\n\nUpdate all call sites across package tests to conform, and clean up any\nnow-unused local context variables and imports.\n\nBug: 487240814\nChange-Id: I83fafae4e143476d501ad4669a2b6eba8d16aca5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1728831\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "ab3938b19921bca71d94bd9e7b0e108656654365",
      "tree": "c92a19b74d9defc19404745f1b4b10dad054ddce",
      "parents": [
        "878617077e3d4d50874330ec3768bb297c8cb685"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Jul 29 22:34:48 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 29 22:34:48 2026 -0700"
      },
      "message": "[testenv] Support using bufconn in test env\n\nIn-memory bufconn-based testing benefits from\n* immunity to network performance issues,\n    such as TCP slowdown under load\n* high performance, low overhead\n\nAdd a WithBufconn() option to testenv that spins up the mock\nResultStore, CAS, and JobStatus servers using in-memory bufconn\nlisteners instead of TCP loopbacks.\n\nUpdate RSDialParams, CASDialParams, and JSDialParams to automatically\ninject the context dialer in bufconn mode, making the transition\ncompletely transparent to clients.\n\nDe-duplicate serviceEnv by using grpctest.ServiceEnv (and apply\nmechanical changes).\n\nUpdate known-heavy test to use WithBufconn(), reducing chance of timeout\nunder heavy load.\n\ncleanup:\n* removed serverWG, now that grpctest.Server manages cleanup\n* setupService() remove now unused addr parameter\n\nBug: 487240814\nChange-Id: I56dada446d227a24e6fc0b31501da0ec72ddaf67\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1728830\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "878617077e3d4d50874330ec3768bb297c8cb685",
      "tree": "ac5d901221342bdd272b0331d5b440c6428b4db3",
      "parents": [
        "b421bbd1aa05f1711db08b2be9b0cda5bc6f53fa"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Jul 28 13:17:36 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jul 28 13:17:36 2026 -0700"
      },
      "message": "[rsproxy] Optimize rsproxy_test execution time.\n\nSignificantly improves rsproxy_test execution performance, reducing the\ntotal suite maximum execution time from over 31s to under 3s:\n\n1. Resolves a context-deadlock in TestProxy_ReadyMetadata/GRPC by\n   cancelling the subtest context immediately after verifying ready\n   metadata. This allows the background proxy\u0027s gRPC server to exit,\n   unblocking the deferred Close() call and reducing the test duration\n   from 30.02s to 0.00s.\n\n2. Optimizes\n   TestResultStoreWorker_CreateInvocationFailure_RetriesAndDegrades\n   by introducing a test-only RetryFastForTest() helper with a 1ms\n   backoff policy, and updating resultStoreEgressWorker to support\n   injecting a custom createInvocationRetrier. This allows the test\n   to verify all 10 retry attempts in 0.03s instead of 14s.\n\n3. Refactors the unexported resultStoreEgressWorker retrier fields\n   and constructors to use more descriptive and self-documenting names:\n   \u0027batchRetrier\u0027 (for typical batch metadata uploads) and\n   \u0027createInvocationRetrier\u0027 (specifically for CreateInvocation).\n\nBug: 487240814\nChange-Id: Id084549805b9b8605e45c7a6be34daa49ec995a6\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1724193\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "b421bbd1aa05f1711db08b2be9b0cda5bc6f53fa",
      "tree": "a8974ca604a42c00291686ca9dba6ce286fe28d4",
      "parents": [
        "5ce38ae721a49d8dcabd1ced0744cbaddec8a9e5"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Jul 28 08:06:24 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jul 28 08:06:24 2026 -0700"
      },
      "message": "[rsproxy] resume-token recovery using GetInvocationUploadMetadata\n\nAdd a resume-token recovery mechanism to resultstore_egress to\nautomatically heal from \"lost ACK\" network drop scenarios. When a lost\nACK occurs, the server successfully processes a batch write and advances\nits expected token, but the client times out and retries with the old\ntoken, causing a token mismatch error (InvalidArgument).\n\nfakeresultstore.Server:\n   - Introduce EnforceUploadTokens and expectedTokens map to optionally\n     model sequential resume token progression.\n   - Return expected tokens dynamically in GetInvocationUploadMetadata.\n   - Add RecordUploadBatch testing utility to simulate lost ACKs.\n   - Add comprehensive TestServer_EnforceUploadTokens unit test\n   coverage.\n\nresultstore_egress:\n   - On retry attempts (\u003e 1) failing with InvalidArgument, Aborted, or\n     FailedPrecondition mismatch codes, query\n     GetInvocationUploadMetadata\n     to verify server-side expected token status.\n   - If the server has already advanced to NextResumeToken, realign\n     our local token chain and recover the batch as successful.\n   - Add TestResultStoreWorker_UploadBatch_TokenRecovery to simulate and\n     validate lost ACK recovery.\n\nBug: 473907403\nChange-Id: I12d3de8f58118ca87e7eb4570a001c271013a8e3\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1724192\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "5ce38ae721a49d8dcabd1ced0744cbaddec8a9e5",
      "tree": "6603a5184f6b7bccf53b99863ae3f3131c970001",
      "parents": [
        "c178a51e95edcd7a8998bbbc00a23871817d7fdd"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Jul 28 08:06:19 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jul 28 08:06:19 2026 -0700"
      },
      "message": "[rsproxy] Handle CreateInvocation ALREADY_EXISTS on retry as success\n\nAddress a common \"fall-of-the-wall\" network drop scenario where an\ninitial CreateInvocation RPC successfully creates the resource on the\nResultStore server, but the network connection is dropped before the\nclient receives the response. On retry, the server returns\nALREADY_EXISTS (\"resource already exists\") causing a false-positive\nbuild failure.\n\nMake CreateInvocation idempotent with respect to retry attempts:\n1. Track the attempt number inside the persistent retry loop.\n2. If we receive codes.AlreadyExists on any attempt \u003e 1, assume our\n   previous attempt succeeded on the backend, log a warning, and\n   proceed with metadata uploads rather than degrading to sink mode.\n3. Keep original retrier override defaulting semantics to ensure\n   standard\n   timeout/attempt configs behave correctly when retries are enabled.\n\nAdd a dedicated unit test\nTestResultStoreWorker_CreateInvocation_AlreadyExistsOnRetry verifying\nsuccessful recovery and continued metadata uploading.\n\nBug: 538301040\nChange-Id: I9374afd0316bd25bfc5d437477fdd4225bef88ab\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1724191\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "c178a51e95edcd7a8998bbbc00a23871817d7fdd",
      "tree": "525a1934db7d33db42ed76c0ec3488e93f8652da",
      "parents": [
        "1b36ae1f0f7c4be95e0b460a36d5e4b6862eeb56"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 23 11:22:58 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 23 11:22:58 2026 -0700"
      },
      "message": "[testing] Consolidate fake-server test environments\n\nFurther improvement against test flakes.\nHardens test infrastructure and eliminates socket/port-allocation\nrace conditions in parallel sandboxes:\n\n1. Unified testing backend:\n   - Consolidates ResultStore and CAS testing backends into a single\n     Unified gRPC server in \u0027testenv\u0027, preventing address-binding\n     deadlocks and drastically improving parallel testing\n     performance.\n\n2. Fake Capabilities support:\n   - Upgrades the fakeresultstore Server to implement Remote\n     Execution GetCapabilities, returning MinimalCapabilities\n     from the fakerbe library.\n\n3. Dialing retries coverage:\n   - Adds a robust TestWaitReady unit test inside grpcutil, asserting\n     WaitReady\u0027s retry and context-cancellation logic.\n\nBug: 487240814\nChange-Id: I806a18ffc830ed30dec4620ea5eb4102889d3d18\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1709795\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "1b36ae1f0f7c4be95e0b460a36d5e4b6862eeb56",
      "tree": "eedcbc47e0559ae6a1e354906d322738d36e5737",
      "parents": [
        "36894f0f52278919237a83677df5eb0f5d1bcb3e"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 23 11:17:49 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 23 11:17:49 2026 -0700"
      },
      "message": "[buildstate] Tolerate out-of-order events inside BuildInfo.\n\nInformation about build actions arrives on different sources:\nBEP, CAS, and (experimental) profile trace.\nThese sources are asynchronous to each other, so we must tolerate\ninformation arriving in different orders, so that information\ncan be presented as it become available.\n\nTolerate out-of-order event delivery support for both Invocations and\nActions inside BuildInfo. Gracefully ignore older timestamps inside\nLifecycle, Action, and Invocation update states instead\nof returning errors to prevent status and stream regression.\n\nSupport implicit action declarations on early action updates (e.g., progress or\noutput) with late-declaration enrichment to eliminate network-jitter failures.\n\nDeduplicate metadata extraction inside InvocationMetadata and document ActionInfo\nfields with an explicit reminder that ActionDeclarations come from Bazel\u0027s BEP.\n\nBug: 487240814\nChange-Id: Ic7fdc717518b70b18df65b48c93faa5ae637dd7a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1709794\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "36894f0f52278919237a83677df5eb0f5d1bcb3e",
      "tree": "a2a19ae42e08075a431a01062665290aa6d19e0f",
      "parents": [
        "1b68ecdc66d659ad3e17e0c394999e6fa429f61e"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 23 11:12:56 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 23 11:12:56 2026 -0700"
      },
      "message": "[chrometrace] Introduce Chrome Trace Event decoder package.\n\nIntroduces a pure, lightweight, self-contained library for decoding\nJSON records conforming to the Chrome Trace Event format specification.\nThis includes the Event struct representation and standard JSON mappings.\n\nThis library serves as the foundational data parsing layer for our real-time\nBazel profile streaming and telemetry pipeline.\n\nBug: 487240814\nChange-Id: I1790acfedfe34e80139a09df6dee4b75662430a2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1709793\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\n"
    },
    {
      "commit": "1b68ecdc66d659ad3e17e0c394999e6fa429f61e",
      "tree": "fa2368984a0851bcac9754e6758a7f0faa14024c",
      "parents": [
        "d912d6d73d7bb28cf6c5e48f119ca7f16a66ff87"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 23 11:06:15 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 23 11:06:15 2026 -0700"
      },
      "message": "[schema] Add optional states to jobstatus.proto.\n\nUpgrades our jobstatus.proto API contract to introduce optional status fields\nand relaxed state identifiers, preparing the schemas to safely handle partial,\nreal-time profile event streams.\n\nNote: The primary reason for making these fields optional is to distinguish\nbetween a state being explicitly unspecified/omitted (representing an incremental\nprogress update with no-change to the active state) versus an active transition.\n\nMechanical Changes:\nTo reconcile compile-time type-safety with the new pointer fields, Go-level struct\ninstantiations and visual test renderings have been updated. These test file updates\nare purely mechanical in nature (applied via mass substitutions with sed/buildifier)\nto replace raw enum constants with our native pre-allocated global pointer constants,\nensuring zero heap allocation or GC thrashing under the hood.\n\nBug: 487240814\nChange-Id: Ic9dea8e48dc3de595a41e9a8b8e6538e754cb3e5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1709792\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "d912d6d73d7bb28cf6c5e48f119ca7f16a66ff87",
      "tree": "94caefdef19ca696f3bd6884db02e82ff1601b8b",
      "parents": [
        "062731065dd94a080e2783ce8af8723514ca36f6"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 23 11:04:53 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 23 11:04:53 2026 -0700"
      },
      "message": "[bzlmod] Modernize Starlark rules and toolchains for Bazel 9 compatibility.\n\nModernize our workspace Bzlmod rules and toolchain configurations\nfor compatibility with bazel 9+ and backward-compatibility with the\ncurrent Bazel 8.5.1.\n\nMotivation:\nThis prepares the rsclient codebase to natively support running against\nclose-to-development HEAD versions of Bazel (such as experimental Bazel 9\nconfigurations) where experimental support for real-time build profile\nstreaming is being tested.\n\nKey modifications:\n- Bumps @rules_go to 0.61.1 inside MODULE.bazel to natively resolve deprecated native cc_common.configure_features references and local patches.\n- Starlark Rules Modernization: Replaces native legacy sh_binary, sh_test, and cc_library rule invocations with official @rules_shell and @rules_cc loads.\n- Transitioned proto rules in api/jobstatus/BUILD.bazel away from legacy @rules_proto to @com_google_protobuf to maintain native compatibility with Bazel 9 compile paths and prevent dependency conflicts under Bzlmod.\n- Removing \u0027provides\u0027 constraint: Removes optional \u0027provides \u003d [CcToolchainConfigInfo]\u0027 from scripts/infra/clang_toolchain.rules.bzl to bypass modern cc_toolchain_config analysis crashes.\n- Adjusts bazel_invocation.bzl and ninja_invocation.bzl to allow multi-file runfiles redirections under modern rules_shell.\n- Added standard LINT.IfChange / LINT.ThenChange anchors between go.mod and MODULE.bazel to maintain long-term Go SDK synchronization.\n- Restricted test_lib\u0027s package default visibility to //:__subpackages__ to protect helper scripts.\n\nNo functional changes.\n\nBug: 487240814\nChange-Id: I5169551c49d549d0ad2be3083cf8aec18d908412\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1711210\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "062731065dd94a080e2783ce8af8723514ca36f6",
      "tree": "6f96023a1bc18bfff096b6d4ac5b86ba652ecb91",
      "parents": [
        "aa9c9fcbdaaace1a1700ceff5ec5f641a5ce7b32"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 23 11:01:40 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 23 11:01:40 2026 -0700"
      },
      "message": "[testing] Enforce strict IPv4 loopback in fake_resultstore.\n\nIn restricted CQ sandbox environments, resolving \"localhost\" can\nreturn non-deterministic dual-stack IPv4/IPv6 loopback addresses.\nSince our fake services are strictly bound to 127.0.0.1, dual-stack\nmismatches can cause connection timeouts, port-probing failures,\nor \"Method not found\" errors.\n\nThis change:\n1. Replaces \"localhost\" with netutil.IPv4Loopback inside\n   fake_resultstore\u0027s Go main_test.go.\n2. Introduces a LOCAL_LOOPBACK constant in fake-resultstore-wrap.sh\n   and substitutes it across bash\u0027s built-in socket probers\n   (/dev/tcp/) and generated config files.\n3. Automatically updates Bazel BUILD.bazel with netutil dependency.\n\nThis completely fortifies the testing infrastructure against\ntransient CQ DNS-resolution failures.\n\nBug: 487240814\nChange-Id: Ia5baceecc70d0cbf2ababe6a8cf36128f0c0b2c8\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1714010\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "aa9c9fcbdaaace1a1700ceff5ec5f641a5ce7b32",
      "tree": "a4cf0ae286e96c8994e6a8b8bcdc9b37accdea9f",
      "parents": [
        "c2b0c5a75ddccf6a5275c60775601b623cdf34ab"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Jul 17 17:24:23 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jul 17 17:24:23 2026 -0700"
      },
      "message": "[testing] Dynamically pace Bazel integration tests via cpu:4 tagging.\n\nAssigns a \u0027cpu:4\u0027 resource weight tag to nested Bazel integration tests to\nprevent local disk and CPU starvation during high-concurrency or multi-run\nstress testing (such as --runs_per_test\u003d10).\n\nThis instructs Bazel\u0027s scheduler to dynamically pace sandbox execution\naccording to host capacity, mitigating transient timeouts under heavy load.\n\nBug: 487240814\nChange-Id: Ifdbd587ba83573fcbe25a056b77cf3cf4c3760dc\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1711331\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "c2b0c5a75ddccf6a5275c60775601b623cdf34ab",
      "tree": "01f01a6da398fd7e1ace2b9d8d0aecfdd548d168",
      "parents": [
        "8c9e493110c8e81cf79ce5819836ae91a76cc799"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:59:00 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:59:00 2026 -0700"
      },
      "message": "[testing] simplify flake detection\n\nJust use bazel --runs_per_test (default 10x).\n\nLike before, cat logs for any failed runs.\n\nBug: 487240814\nChange-Id: Ibaef0993d29db2341d13614e8b81888f9afac361\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1595651\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8c9e493110c8e81cf79ce5819836ae91a76cc799",
      "tree": "aa4d88100a76550366234cae151b8be0834a868f",
      "parents": [
        "31daac0e4b5247b6687649ce51196fcbf379ae8f"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:58:03 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:58:03 2026 -0700"
      },
      "message": "[proxy] Unexport internal fields of LogicalStream and add documentation.\n\nThis change unexports fields of LogicalStream (id, fullMethod,\nmetadata, clientResp) that are confined to the proxy package, and\nadds missing documentation for unexported fields and methods.\n\nBug: 487240814\nChange-Id: Iab6c846ae85cb75499c67f8d872461b3f4e6a819\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1708178\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\n"
    },
    {
      "commit": "31daac0e4b5247b6687649ce51196fcbf379ae8f",
      "tree": "7503ec9d96832a1bd7dfb4c6c5a7e69e9117f38b",
      "parents": [
        "988f1b46d97ea24c161f150d15cf676637d4b7bf"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:54:16 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:54:16 2026 -0700"
      },
      "message": "[proxy] Fix concurrent close-send race in downstream RPC egress.\n\nThis change eliminates an intermittent concurrent test failure under\nintense load where response messages received from the backend were sent\nto the stream\u0027s response channel after it was concurrently closed by\nthe client handler.\n\nInstead of hard-closing the channel, we coordinate stream shutdown\nvia a safe CloseConduit sentinel protocol on LogicalStream. Any active\nsender safely checks whether the conduit has closed before sending.\n\nAdds TestLogicalStream_ConcurrentCloseAndSend, a concurrent stress test\nthat deterministically reproduces the race condition and verifies its\nstable resolution.\n\nBug: 487240814\nChange-Id: I8821eaa8a15c8af687f59c9cec5cf6e10e1d2907\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1708177\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "988f1b46d97ea24c161f150d15cf676637d4b7bf",
      "tree": "558d5f237699befe30fd21a4f4e2e96676647eb6",
      "parents": [
        "896c97bbad702306fe7d1d4ce600db26926c7347"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:52:49 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:52:49 2026 -0700"
      },
      "message": "[test] Synchronize background subshell in lingering_writer_test.\n\nThis change prevents a race condition under heavy parallel test load\nwhere the wrapper\u0027s EXIT trap closes its own writer FD and deletes the\npipe before the background subshell has successfully scheduled,\nconnected, and started writing, resulting in empty test metrics.\n\nWe resolve this by:\n1. Grounding the pipe: Opening the FIFO on file descriptor 3 inside\n   the child subshell to guarantee at least one active writer is\n   registered.\n2. Parent-child synchronization: Using a process-unique temporal\n   file sentinel (stamped with the PID \u00271586445\u0027) to block the parent\n   script\u0027s exit until the background child is actively holding the\n   pipe open.\n3. Fail-fast error handling: Exiting with code 1 if the subshell\n   fails to synchronize within 5 seconds, avoiding silent masking.\n4. Signal isolation: Shielding the background subshell from being\n   forcefully terminated by parent\u0027s process-group TERM teardown\n   signals using trap \"\" TERM.\n5. Hermetic TMPDIR isolation: Exporting TMPDIR\u003d\"${TEST_TMPDIR}\" in\n   the assertion script to isolate ephemeral pipes, ports, and done\n   files inside the private, sandboxed test execution tree. This\n   permanently prevents parallel tests from colliding.\n6. Diagnostics: Automatically dumping all server/proxy diagnostic\n   logs in check_lingering_writer_log.sh using native globbing and\n   clean { ... } \u003e\u00262 redirection if the jq assertion fails, allowing\n   immediate, isolated visibility.\n7. Configurable done timeout: Adding --proxy-done-timeout flag\n   (default: 10s) to rsproxy-wrap.sh to allow overriding limits.\n\nThis is expected to allow running bazel tests 10x reliably.\n\nBug: 487240814\n\nChange-Id: Idf13daecf074daa0266fc28050a039c64784786c\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1705076\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "896c97bbad702306fe7d1d4ce600db26926c7347",
      "tree": "cb05dd6612b56d62f53dd40b6081bb9dcbb9788a",
      "parents": [
        "46b94ea91c9c53b3befe03e18434dd19bca09e99"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:50:57 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:50:57 2026 -0700"
      },
      "message": "[besproxy] Implement uncorrelated events queue and ingestion fidelity.\n\nThis change improves data quality and correlation reliability for\nout-of-order, asynchronous event streams by implementing a sequential\nuncorrelated events queue in the Joiner. Events arriving before a\nbuild identity is established are buffered sequentially until the\nauthoritative UUID is known, enabling late-binding correlation.\n\nBug: 487240814\nChange-Id: I9f4306aa8e7f417e43967b5e92650180c0fffbf5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1704978\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "46b94ea91c9c53b3befe03e18434dd19bca09e99",
      "tree": "e18d031ba2fb4394a7bba36453e0b88a7fcd7ca2",
      "parents": [
        "dc5790d70a44a5433357213027519adcee0cc718"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:50:01 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:50:01 2026 -0700"
      },
      "message": "[router] Make prioritized pipeline drainage permanent.\n\nThis final stabilization commit simplifies the Router API by making the\nprioritized drainage behavior the default and only mode of operation.\n\nKey changes:\n- Router: Removed the \u0027LosslessDrain\u0027 flag from RouterConfig.\n- Logic: Simplified send() to always use syncutil.PrioritySend with\n  context.Background() for guaranteed delivery to egress buffers.\n- API: Removed redundant configuration overrides across the project.\n- Data Integrity: This design choice ensures Stage N-1 prioritizes delivery\n  to Stage N\u0027s buffer over context cancellation, preventing drops even during\n  rapid build shutdowns.\n- Testing: Updated regression tests to certify permanent prioritized drainage behavior.\n\nCertified with 10x project-wide stress testing.\n\nBug: 487240814\nChange-Id: Ibac33db229fc08609550ede42771af7f69ecc2c2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1701961\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "dc5790d70a44a5433357213027519adcee0cc718",
      "tree": "d9f210472f58d08793e52aab8e96a4493610c676",
      "parents": [
        "b359ea3d1d9c2d8874eb2c7520251abedb1dfa1c"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:44:46 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:44:46 2026 -0700"
      },
      "message": "[fifo] Add GroundReader to prevent premature reader EOF during scheduling lag.\n\nThis change introduces a GroundReader helper function to the fifo package\nand leverages it within TestProxy_MultiEgress.\n\nBy synchronously grounding the FIFO reader with a non-blocking writer\nhandle prior to executing proxy.Run(), we guarantee that the FIFO always\nhas at least one active writer connected. This prevents the reader from\nreading a premature EOF under heavy parallel test load, while still\nsupporting a seamless handoff to the actual writer goroutine.\n\nBug: 487240814\nChange-Id: Ic5201ae043cd504f0daf13c49218abeff468668a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1704721\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "b359ea3d1d9c2d8874eb2c7520251abedb1dfa1c",
      "tree": "ef3d6960a92843c3db120d6e6c621278165a5587",
      "parents": [
        "c19c1a17e8d9c437a63ca3ed0a51eb917639224b"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:41:57 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:41:57 2026 -0700"
      },
      "message": "[rsproxy] Harden test infrastructure against background write races.\n\nThis change fixes a transient race condition discovered during 10x stress\ntesting where the test would call stop() (cancelling the context) before\nbackground FIFO writers had finished their final handshake.\n\nKey changes:\n- Added a Wait() method to mainTestEnv to synchronize with background goroutines.\n- Updated TestRunFromConfig_SinkMode and TestRunFromConfig_DualEgress to wait\n  for background writers before triggering shutdown.\n\nVerified with 10/10 successful stress test runs.\n\nBug: 487240814\nChange-Id: Id0a4be91c1f7f277832afc30f195b2be1ce39cd5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1701959\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "c19c1a17e8d9c437a63ca3ed0a51eb917639224b",
      "tree": "78b877f6060096cc348b26048bfbd36d8774cdb9",
      "parents": [
        "85c67369ec0db405d8c63f7b63d573f476fb60f3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:33:54 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:33:54 2026 -0700"
      },
      "message": "[buildminder] Handle interrupts when waiting on child processes.\n\nEnsures that buildminder-wrap.sh correctly handles non-zero returns\nfrom \u0027wait\u0027 when interrupted by signal traps. If wait is interrupted\nwhile the wrapped child is dead, a final non-blocking wait is executed\nto retrieve the child\u0027s true exit code instead of returning an error.\n\nBug: 487240814\n\nChange-Id: I36e2c02c26371feabbf26b2d798ed6fac840ac2c\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1701958\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\n"
    },
    {
      "commit": "85c67369ec0db405d8c63f7b63d573f476fb60f3",
      "tree": "7e498bf0e41a5f9017941f6b69c9559868e35935",
      "parents": [
        "db563ed6468f508791d6881abab2ba7608ff2f48"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:28:37 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:28:37 2026 -0700"
      },
      "message": "[rsproxy] Finalize prioritized drainage across the telemetry pipeline.\n\nThis change completes the infrastructure-wide migration to prioritized drainage\nprimitives (syncutil.PriorityReceive/Send). It ensures that every critical\ntelemetry path—from stream ingress to ResultStore egress—is robust against\nrapid build shutdowns and context cancellations.\n\nKey upgrades:\n- ResultStore Proxy Router: Enabled prioritized drainage by default and upgraded\n  validatingIngress loop to use prioritized I/O.\n- gRPC Message Router: Enabled prioritized drainage by default in\n  grpcutil.DefaultRouterConfig and hardened manual relay test configurations.\n- ResultStore Egress: Upgraded all transformation, file-upload, and\n  finalization loops to use PrioritySend, ensuring \u0027Interrupted Finalization\u0027\n  always reaches the backend.\n- Stream Ingress: Converted ReadUploadRequests to prioritized drainage.\n- Regression Testing: Added high-fidelity tests to certify that sitting\n  messages are not lost during build aborts.\n\nBug: 487240814\nChange-Id: I05a3bc51066e5b78f110249aea80074edbf81625\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1702014\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "db563ed6468f508791d6881abab2ba7608ff2f48",
      "tree": "9afcf325c7fbd2380d75c020f56fc322b93f0bee",
      "parents": [
        "30d53ddb4491f77fd801c45821018ee322ef09ca"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:26:41 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:26:41 2026 -0700"
      },
      "message": "[fake_resultstore] Implement isolated ports and environment propagation.\n\nThis change finalizes the stabilization stack by ensuring service mocks\nand handshakes are production-ready:\n- Restore Isolated Ports in fake_resultstore: Use separate listeners for\n  RS, CAS, and BES to eliminate relay cross-talk.\n- Implement Generic Handshake Orchestration: Use WaitReady with RBE\n  probes to replace blocking dials in fake_resultstore and proxy wrappers.\n- Satisfy Full Protocol Handshake: Register Capabilities service on both\n  RS and CAS ports to ensure Bazel\u0027s discovery phase succeeds.\n- Sanitized Environment Propagation: Ensure JOBSTATUS_ADDR and port metadata\n  flow through integrated wrappers to restore terminal telemetry links.\n\nBug: 487240814\nChange-Id: I3578d67dad41159ab7579305781b5d34ad8ba97c\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1701857\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "30d53ddb4491f77fd801c45821018ee322ef09ca",
      "tree": "3a741a21b3cf119aa2e7474b9cfc57b675d7e7e6",
      "parents": [
        "c9130f820c5bb9d6f473158489e790997a8217a3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:25:51 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:25:51 2026 -0700"
      },
      "message": "[grpcutil] Global Close sentinel for prioritized pipeline termination.\n\nThis change ensures that data extraction workers (Dispatchers) stay alive\nacross multiple concurrent or sequential gRPC streams until the entire\nbuild is finished, resolving races in multiplexed environments.\n\nThe changes are organized into four logical sub-systems:\n\n1. Global Close Primitives (grpcutil):\n   - Introduce NewGlobalCloseMessage and the IsGlobalClose predicate (StreamID 0)\n     to formally represent authoritative pipeline termination.\n   - Remove unused SendResponse method from LogicalStream to keep the production\n     API minimal.\n\n2. RBE Support \u0026 Testing (fakerbe):\n   - Add RBE protocol support to fakerbe for enhanced CAS data extraction testing.\n   - Introduce fakerbe unit tests to verify probe capabilities under multiplexed\n     or sequential stream scenarios.\n\n3. Protocol Dispatcher Hardening (besmsg, casmsg):\n   - Refactor BES and CAS dispatchers to wait for the Global Close sentinel before\n     exiting, ensuring data is flushed without being discarded during sequential or overlapping stream\n     transitions.\n   - Integrate ErrorAggregator to report unmarshal failures instead of silently\n     dropping them, and remove redundant \u0027inbound\u0027 channel fields.\n\n4. Proxy Wiring and Port Drainage (proxy, router):\n   - Standardize internal Port and Relay Stop() methods to propagate the sentinel\n   and ensure authoritative termination signals flow through natural drainage.\n   - Prevent a 100% CPU busy-loop in the central dispatcher during context\n     cancellation by falling back to a blocking channel receive once context is\n     cancelled.\n   - Wire proxy dispatchers as managed egress workers to enable centralized\n     lifecycle coordination.\n\nBug: 487240814\nChange-Id: I69e5488cdeafb5d2c5e331512bc689006897b0d7\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1698581\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "c9130f820c5bb9d6f473158489e790997a8217a3",
      "tree": "1effd9546b0447640b9e99fa2e6e4ccca7a38860",
      "parents": [
        "8b3b52474eee645c0c47e3a8390a782fe9adaf8f"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:12:57 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:12:57 2026 -0700"
      },
      "message": "[jobstatus] Add pointer helpers for state transitions.\n\nThis change introduces InvocationState and ActionState pointer constants\nto distinguish between \u0027Missing\u0027 and \u0027Zero-Valued\u0027 Protobuf states.\nThis is a prerequisite for the implicit discovery logic used in\ndownstream telemetry translation.\n\nBug: 487240814\nChange-Id: I1f528db9e65643d7ab645f7f621593a4a3868bff\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1697238\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8b3b52474eee645c0c47e3a8390a782fe9adaf8f",
      "tree": "f8d8a8931995f8759ab41b85ef6ab9e716216650",
      "parents": [
        "02b8aace8991e117dbba4de0e84dc9238e15df81"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:07:41 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:07:41 2026 -0700"
      },
      "message": "[besproxy] Implement reliable delivery flushes and in-flight tracking.\n\nThis change ensures that telemetry data is not lost during the rapid\nshutdown phase of a build:\n- Implement \u0027Reliable Shutdown Flush\u0027 in Joiner and ChannelSink: Use a\n  non-cancellable context (context.Background) for final flushes to\n  prevent transport-layer drops when the primary context is cancelled.\n- Add In-Flight Tracking to JobStatusEgress: Use a per-event WaitGroup\n  and Timed Wait to ensure all events added to the bundler are\n  transmitted before the gRPC stream is closed.\n- Upgrade Joiner Run loop to use PriorityReceive for coordinated drainage.\n- Add regression test for Joiner shutdown flush.\n\nBug: 487240814\nChange-Id: I0521d562b261263d084e6febcf205e6692947c76\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1697237\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "02b8aace8991e117dbba4de0e84dc9238e15df81",
      "tree": "41c20c8b17888c47372d4d93edfc2d65e40de0ad",
      "parents": [
        "b0eef2d4c0da76558a1013c0c25d5143dab3ade9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 11:04:55 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 11:04:55 2026 -0700"
      },
      "message": "[router] natural pipeline drainage, channel-sender closure\n\nThis change hardens the core Router pipeline against race conditions\nduring build shutdown that manifest as flaky data loss:\n- Implement natural pipeline drainage: Use syncutil.PriorityReceive and\n  PrioritySend in all workers and the central dispatcher to ensure\n  buffered telemetry is drained before responding to context cancellation.\n  This avoids data loss during shutdown that was causing test flakes.\n- Busy Loop Hardening: Prevent a 100% CPU busy-loop in funcConsumer and\n  channelConsumer during context cancellation by falling back to a blocking\n  channel receive once context is cancelled, enabling \"Patient Drainage\"\n  without spinning.\n- Channel sender ownership: centralize inbound channel closure in the producer\n  loop. This fixes the \u0027send on closed channel\u0027 panic by ensuring\n  closure only happens after the worker has authoritatively finished.\n  This works because we only have single-senders, no shared senders.\n- Added tests to cover the interaction between bridge and workers and\n  router during shutdown.\n\nBug: 487240814\nChange-Id: I55ef4491fcf7a7c5f9bdfff95eb70d49c7cb4456\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1697236\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "b0eef2d4c0da76558a1013c0c25d5143dab3ade9",
      "tree": "a8835623946e17b7a1f360f993b6e2595113d2d6",
      "parents": [
        "33b88bcf451b6490a8eefb73913d055f0a7944f4"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jul 16 10:56:28 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jul 16 10:56:28 2026 -0700"
      },
      "message": "[syncutil] Document prioritized pipeline drainage\n\nThis change adds technically rigorous package and function-level documentation\nfor syncutil\u0027s priority channel primitives, detailing the non-deterministic\ncancellation select race and outlining real-world back-pressure limitations.\n\nWhen tools like rsproxy and besproxy directly wrap around build commands\n(\"integrated mode\", as opposed to \"shell-wrapper mode\") the end of the\nwrapped command is the trigger for the proxy to wind-down (via\ncontext-cancellation), but there may still be data that is still in-flight\nin the pipeline that we want to flush instead of dropping.\n\nPrioritizing channel communication over cancellation is the key\nto preserving data at the tail end of shutdown, while the data is still\nin the pipeline.\nThe priority-ordered nested select statement solves the problem\nof a bare-select being selected nondeterministically when multiple\nguards fire.\n\nThis construct is needed throughout the proxy codebase to be\ndeemed worth refactoring (seen in downstream commits).\n\nBug: 487240814\nChange-Id: Ic99dd48613fe19f27de032eb212be1c682a5a697\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1706718\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "33b88bcf451b6490a8eefb73913d055f0a7944f4",
      "tree": "98f92a7a3d1281ebae51274a5e188f1e44859190",
      "parents": [
        "252b83ac655a1eb31175598d0aee81a54142108a"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Sat Jul 11 11:06:07 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sat Jul 11 11:06:07 2026 -0700"
      },
      "message": "[syncutil] Add priority channel primitives\n\nsyncutil:\n- Implement PriorityReceive and PrioritySend to guarantee data drainage\n  during context cancellation, ensuring pre-buffered telemetry is never lost.\n- Refactor PrioritySendWithLossyDrain to deterministically prioritize the\n  primary context error when both contexts are cancelled simultaneously, and\n  add extensive tests for this edge case.\n- Provide NewReadySignal constructor.\n- Harden WriteFileAtomic to explicitly error out on empty paths to prevent\n  accidental file creation in the CWD, and update callers to perform\n  optionality checks.\n\nNext commits will use PriorityReceive and PrioritySend to plug gaps\nin data preservation during various points of proxy shutdown.\n\nBug: 487240814\nChange-Id: Ib446ad44144cdeec63f8e356e83060c4f37dedcc\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1697235\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "252b83ac655a1eb31175598d0aee81a54142108a",
      "tree": "b7d3055bb0adf89aacb90e3721963c40d669db4c",
      "parents": [
        "db04ad971751c7b6cf3df3e592be3085d2ac4241"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Sat Jul 11 11:06:01 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sat Jul 11 11:06:01 2026 -0700"
      },
      "message": "[test] Replace sleepy_cat with sleepy_target and harden timeouts.\n\nThis change eliminates flakiness and hangs in expect_interrupt_test by\nreplacing the aggressive \u0027cat /dev/zero\u0027 busy-loop with a standard\ninterruptible sleep (and avoids wasting CPU).\nPreviously, the test was flaking ~1/10, which was a significant\nhindrance to rapid development cycles.\n\n- Replace sleepy_cat.sh with sleepy_target.sh.\n- Removed \u0027exec cat\u0027 while retaining \u0027py_sleep 60\u0027.\n- Moved \u0027trap - INT\u0027 to the first line of the script to ensure immediate\n  responsiveness to signals in non-interactive (Bazel) shells.\n- Harden send_sigint.sh: Increase the readiness timeout from 2s to 5s\n  to provide headroom for deep wrapper chains to start up under\n  extreme CPU contention (e.g. 10x stress tests).\n- Updated BUILD files.\n\nBug: 487240814\nChange-Id: Ia5437cb411b0d20fed68fb2e5bccfe149ded735a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1697234\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\n"
    },
    {
      "commit": "db04ad971751c7b6cf3df3e592be3085d2ac4241",
      "tree": "11b1d0176514c53e05b73f6c65a14844bc4fd8cd",
      "parents": [
        "aba811a4e36e1091580056a366178606628e7585"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Jul 01 13:58:13 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 13:58:13 2026 -0700"
      },
      "message": "[tui2] consolidate READMEs\n\nBug: 487240814\nChange-Id: Ifabffdbc89a6273a4534666029a9a2142aa976f2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1689855\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nFuchsia-Auto-Submit: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\n"
    },
    {
      "commit": "aba811a4e36e1091580056a366178606628e7585",
      "tree": "ef8ab325a9cee2895cfb1955ea74a08f094f0cf8",
      "parents": [
        "8dfeda15e92960d8a167c7289eb1d5b298456555"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Jul 01 13:01:20 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Wed Jul 01 13:01:20 2026 -0700"
      },
      "message": "[tui2] Atoms: Leaf components\n\nImplement the basic visual building blocks (Atoms) using the\n\u0027managed params\u0027 pattern:\n* params struct that determine view contents, with public fields\n* private params field inside atom implementation, accessed through\n  `Params()` and `Set()` (with auto-revision increment).\n* memoized string contents\n\nThis pattern ensures O(1) identity performance and guaranteed visual\ncorrectness and freshness through explicit revision signaling.\n\nSpecific Atoms:\n\n- TextSegment: Single line text with alignment and padding.\n- TextImage: Static text box with X/Y tiling support.\n- Spacer: Flexible empty space for layout distribution.\n- Marquee: Horizontally scrolling text animation.\n- WrappedText: Multi-line word-wrapping component.\n- README-atoms.md: Documentation for \u0027The Atom Pattern\u0027.\n\nBug: 487240814\nChange-Id: I800c1667b5a082d20cefdd57c25d7ea9a4d9aa42\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1684335\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nFuchsia-Auto-Submit: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8dfeda15e92960d8a167c7289eb1d5b298456555",
      "tree": "48628ede1d058e50bfa9ef94136fd34ec01ae2cd",
      "parents": [
        "77092412bf9cdb5af1f9a01fe0021f0ac28065ef"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Mon Jun 29 22:58:27 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 22:58:27 2026 -0700"
      },
      "message": "[rsproxy] Abort uploads after any single failure\n\nThe sequence of RPCs to ResultStore are:\n  CreateInvocation; UploadBatch x N\n\nIf CreateInvocation fails, all subsequent uploads are guaranteed to fail.\nIf a single UploadBatch fails, subsequent uploads will also fail because\nthe resume token chain will be broken.\n\nTo avoid overloading the backend with errors, just stop-and-drain\non the first failure (give-up).  This doesn\u0027t change data-loss, just reduces\nuseless load on the backend.\n\nGive CreateInvocation a more generous retry policy, because it is the\nhead of all uploads.  Existing RPC calls already use a default retrier.\n\nBug: 473907403\nChange-Id: Id1e0644e700eca6cb50c38559180f335ae297329\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1686394\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "77092412bf9cdb5af1f9a01fe0021f0ac28065ef",
      "tree": "c482261456ccb96f12f8f1a2b760d02be2db85a5",
      "parents": [
        "f44cddb910bd3c3fa7a44c55700b0a28e7045490"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Mon Jun 29 01:58:03 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 01:58:03 2026 -0700"
      },
      "message": "[tui2] Memoization utility\n\n\u0027Memo[K,V]\u0027 for consistent, single-slot result caching.\n- \u0027Memoize\u0027 method take a closure, only called on signature-miss.\n- \u0027ViewSignature\u0027 and \u0027MemoizedView\u0027 can be used to bypass rendering\n  calls.\n- \u0027StringBoxMemo\u0027 is for caching pre-compiled styled text rows,\n  which will be used in many places.\n\nREADME describes the memoization benefits, strategy, and how it is applied\nin implementation of elements (coming in next commits).\n\nBug: 487240814\nChange-Id: I742f6fb4a2ff55a21e3739553965efd36492c4dd\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1672975\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nFuchsia-Auto-Submit: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "f44cddb910bd3c3fa7a44c55700b0a28e7045490",
      "tree": "65fb32ec45823e6d2fcb84d57d195b79f0d0d7a8",
      "parents": [
        "64e55405763eea6b5edd0c41d82feab84b2063e9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Mon Jun 29 01:56:32 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Mon Jun 29 01:56:32 2026 -0700"
      },
      "message": "[tui] doc update \u0027dest Canvas\u0027\n\nMissed one documentation update from source branches.\nNaming Canvas parameter \u0027dest\u0027 consistently across the code\nbase to reflect that this is where content is to be written\nduring `Scribe()` operations.\n\nNo functional change.\n\nBug: 487240814\nChange-Id: I65b3358ec6d335e8e263bf889112d05a1cb585d5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1684334\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nFuchsia-Auto-Submit: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "64e55405763eea6b5edd0c41d82feab84b2063e9",
      "tree": "103d2e5b3e81544129c8a99bfafaf8a7a82ccd00",
      "parents": [
        "2d7b74b377793633004e7bb4e6bca7787c831f43"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Sat Jun 27 10:02:12 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sat Jun 27 10:02:12 2026 -0700"
      },
      "message": "[tui2] \u0027tuitest\u0027 testing library\n\n\u0027tuitest\u0027 will be used extensively in the unit-tests for upcoming\nbuilding blocks.\n\n- \u0027tuitest.Harness\u0027 for simulated mini-runtime testing.\n  - Uses \"golden-output\" text comparisons.\n- \u0027MockBoxView\u0027 is a reusable mock component for testing composers and\n  layout containers and revision sensitivity.\n\nREADME.md section documents the high-level testing approach.\n\nBug: 487240814\nChange-Id: I76a4e80fd0f86d722b64010f12cc1fec2bf19ad8\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1672974\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "2d7b74b377793633004e7bb4e6bca7787c831f43",
      "tree": "0fc7c84a7288042f920898c48414d36576edfe5c",
      "parents": [
        "825747b48fb3422b1d5a330c80c6940125bc3508"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Sat Jun 27 09:56:14 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Sat Jun 27 09:56:14 2026 -0700"
      },
      "message": "[tui2] New TUI core interfaces and support structures\n\n\u0027tui2\u0027 is the future replacement for \u0027tui\u0027 that touts highly\nefficient rendering and structured interaction management.\nWe are pulling changes into an isolated \u0027tui2\u0027 package to ensure zero\ndisruption to the existing v1 TUI.\n\nREADME.md: Focuses more on high-level objectives, rationale, and\ndesign strategies, with less focus on code documentation.\n\nThis commit introduces the primary interfaces and supporting structures:\n* BoxView: for visual rendering in an efficient manner\n  * pull-driven rendering to minimize work\n  * caching is achieved in multiple ways\n  * expresses geometric constraints for elastic spatial floorplanning\n  * Canvas: a writable 2D memory interface\n    * makes view-composition allocation-free by directly Scribe()-ing to buffer\n    * concurrency-safe by disjoint partitioning of areas\n* Reactor: for state updates and event handling\n* Interaction: for event routing and focus management\n  * KeyMap: map of key-handler closures used to Update() components.\n  * can automatically generate context-sensitive help based on focus-path\n\nCore Frame Buffer implementation (and support):\n\n* frame_buffer.go: a Canvas implementation, 2D cell grid that represents\n  un-encoded terminal state.\n  Caches renderings by row, and cache entire frame.\n\n* render_buffer.go: general purpose pre-allocated byte-slice for efficient\n  append-driven rendering (faster than Write).\n\n* style.go: responsible for Select Graphics Rendition (SGR) involving\n  ANSI control sequences.  Describes Style and Cell structures,\n  and implements state-machine driven encoding.\n\nCore interaction and reaction:\n* message_routing.go: routes events through the focus path to the\n  correct handler.\n* keymap.go: structure for mapping key-events to registered closures,\n  and used to generate context-sensitive help.\n\nAdaptation to/from bubbletea Models:\n\n* adapt.go: two-way bridging to bubbletea framework.\n  As long as everything is designed in tui2 framework, only a single\n  adaptation layer is needed, minimizing bridging overhead.\n\nComponents as units of composition:\n\n* component.go: interface bundle for ease-of-composition.\n  This is a unit of TUI composition.\n\nFuture commits:\n* tuitest testing library\n* caching utilities\n* atom/leaf view components (mostly non-interactive)\n* composers and navigators\n\nBug: 487240814\nChange-Id: Icfc3f018c1406ec1406b5beb1f760722f28122b2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1647556\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "825747b48fb3422b1d5a330c80c6940125bc3508",
      "tree": "dc61fc9e8ee4f65d8f27e7b0939bd4a6fb5a97c4",
      "parents": [
        "2c3d7690a9834d40cc400791cd5923e203ba4aef"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Jun 12 09:13:34 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 12 09:13:34 2026 -0700"
      },
      "message": "[layout] Factor out geometry engine\n\ninternal/pkg/layout is the new home for geometry calculations that\nare used in the existing tui components, and the upcoming \u0027tui2\u0027 rewrite.\n\nConcepts:\n* A viewport is a rectangular slice of a component\u0027s internal memory\n  (think of paging and scrolling in 2D).\n* To support lazy/incremental processing of data in a desired viewable area,\n  we use LinearMap and GridMap to efficiently compute bounds-of-interest\n  in a 1D or 2D component, so that ranges outside of the bound need not\n  be rendered.  \"Only work on what will be viewed.\"\n\n- Expanded \u0027internal/pkg/layout\u0027 with the new monotonically non-decreasing 1D partitioning \u0027LinearMap\u0027 and 2D tabular partitioning \u0027GridMap\u0027, both supporting O(log N) coordinates-to-index resolution and viewport intersections.\n- Added distinct 2D Point and Size types and operations, needed in tui2.\n\nImprovements to constraints (used to calculate spatial distribution):\n- Added \u0027IsUnbounded\u0027, \u0027BoundedSize\u0027, \u0027Unbounded\u0027, and constraint summation utilities.\n- Added \u0027Max\u0027 size bounds constraint to \u0027layout.Constraint\u0027 and upgraded the \u0027Distribute\u0027 algorithm to support iterative locking, weight-redistribution, and maximum capping constraints.\n- Integrated \u0027layout.Unbounded()\u0027 and \u0027layout.Expandable()\u0027 explicitly inside legacy \u0027tui\u0027 components constructing \u0027layout.Constraint\u0027 literals (\u0027line_partition.go\u0027, \u0027table_block.go\u0027, \u0027vertical_partition.go\u0027) to ensure absolute backward compatibility.\n\nNote: \u0027tui2\u0027 will make more direct use of the 2D types layout.Point and\nlayout.Rect (over x,y and width,height), but it was decided to not update\nthe current/old tui library to use them, because they will be discarded\nin the end.\n\nBug: 487240814\nChange-Id: I8f8b626eea7e674a9ee7131d37f9c48f4551b789\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1644156\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "2c3d7690a9834d40cc400791cd5923e203ba4aef",
      "tree": "0408ed6fe73d9ea37592907807b7d60f00d05755",
      "parents": [
        "f1dd7dace891e2d4c63230bcf7910e95360247f3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri Jun 12 09:12:16 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri Jun 12 09:12:16 2026 -0700"
      },
      "message": "[text] re-org string-formatting package\n\nMove text-related functions to internal/pkg/text.\nThis is used by the existing tui components, and also contains\nnew functions that serve the \u0027tui2\u0027 rewrite, such as padding,\nfitting, truncation.\n\n- Added \u0027internal/pkg/text\u0027 package containing zero-dependency formatting, padding, truncation, ANSI sanitization, and word-wrapping routines.\n- Migrated all active callsites in \u0027buildminder/tiles\u0027 and legacy \u0027tui\u0027 components to call the \u0027text\u0027 package helpers directly instead of legacy \u0027tui\u0027 format helpers.\n- Cleaned up \u0027tui/format.go\u0027 and \u0027tui/format_test.go\u0027, removing all general string utilities while keeping only legacy title bar layout helpers (which delegate to \u0027text\u0027).\n- Resolved all shadow namespace conflicts in legacy components by renaming shadowed local \u0027text\u0027 parameters/variables to \u0027content\u0027.\n\nBug: 487240814\nChange-Id: I35964858d73bd76edbb6d8ea7b00c8cec587116e\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1644155\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "f1dd7dace891e2d4c63230bcf7910e95360247f3",
      "tree": "4a3f3ebaf4448683b76fb8121c833d3dce40a453",
      "parents": [
        "ad2486255b87854dd6858eb9afd5dd4c22a32cfa"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Jun 04 00:40:05 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Thu Jun 04 00:40:05 2026 -0700"
      },
      "message": "[fifo] Fix race conditions in FIFO tests causing timeout flakes\n\nFix intermittent test timeouts in fifo_test.go by ensuring proper\nsynchronization between the reader and writer ends of the FIFO.\n\nThe failures were caused by a race condition where a non-blocking\nopen (O_NONBLOCK) would succeed and close the file descriptor before\nthe blocking counterpart (reader or writer) had fully established\nthe connection, leaving the counterpart hanging indefinitely.\n\nKey changes:\n- TestOpenReaderContext: Simplified to be synchronous, as\n  OpenReaderContext is non-blocking.\n- TestOpenWriterContext: Added a \u0027done\u0027 channel to keep the\n  non-blocking writer open until the blocking reader has connected.\n- TestSignalFIFOEOF: Replaced a fragile 100ms sleep with explicit\n  synchronization using OpenReaderContext synchronously to guarantee\n  the pipe is grounded before signaling EOF.\n\nVerified by running the tests 200 times with high parallelism (--jobs\u003d50).\n\nBug: 487240814\nChange-Id: I964e8453f3d43a75a34610da421ee88456da7d1d\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1636207\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "ad2486255b87854dd6858eb9afd5dd4c22a32cfa",
      "tree": "900b09f8dbd3e5564ba4d0244c9461377898f8fc",
      "parents": [
        "a488b89484edf97e496730d53a04b4c0e7391674"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue Jun 02 11:22:31 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Tue Jun 02 11:22:31 2026 -0700"
      },
      "message": "[jobstatus] Split Bazel Action lifecycle into RUNNING and DONE states\n\nRefactor the Bazel-to-JobStatus translation and plumbing to support\nseparate ActionStarted and ActionExecuted signals. This provides the TUI\nwith the data needed to accurately render action progress.\n\nKey changes:\n- Translation: Update TranslateBuildEvent to return []*jspb.BuildEvent.\n- Action Lifecycle: Split terminal Bazel ActionExecuted events into a\n  RUNNING event (using action start time) and a DONE event (using end\n  time).\n- Plumbing: Update Bazel BES service and Joiner to iterate over and\n  process the new event slices.\n- Multi-Action Support: Refactor Joiner to support log fan-out (multiple\n  actions sharing the same digest) and ensure logs are flushed between\n  RUNNING and DONE states.\n- Testing: Update all unit and trace tests to verify the new multi-event\n  output and sequencing.\n\nBug: 487240814\nChange-Id: If961cbbcc5ad79d203d5f70ef3c4c7de87bdbb8e\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1631518\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "a488b89484edf97e496730d53a04b4c0e7391674",
      "tree": "c6600bcef09f540292cce5e6d62bff21cf1829e1",
      "parents": [
        "cf6a7e5cb872e997d251b686d68bbcc5ac3f55e2"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:20:27 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:20:27 2026 -0700"
      },
      "message": "[style] automate Go import grouping and protobuf aliasing\n\nImplement a project-wide standard for Go import organization and\nautomate its enforcement via a new pre-commit tool, fix_go_imports.py.\n\nStandardized 4-section layout:\n1. Standard Library (unaliased)\n2. External \u0026 Internal (unaliased)\n3. Aliased (e.g., tspb, bespb)\n4. Blank/Underscore (e.g., _ \"testsetup\")\n\nKey changes:\n- scripts/fix_go_imports.py: A new Python tool that reorganizes\n  import blocks and enforces strict protobuf aliasing rules. It uses\n  a centralized registry of known protobuf packages to ensure\n  consistent alias naming (e.g., \u0027tspb\u0027 for timestamppb).\n- scripts/precommit.sh: Integrated the fixer using \u0027git ls-files\u0027 to\n  ensure .gitignore-aware file discovery.\n- Added rules_python to MODULE.bazel to manage the script\u0027s toolchain\n  and unit tests hermetically.\n- Mass-cleanup: Performed a project-wide fix-up of over all Go files to\n  align with the new standards.\n\nBug: 487240814\nChange-Id: Idc6d0d40c97bc66c830fea086e2517541eefb222\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1630313\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nSLSA-Policy-Verified: SLSA Policy Verification Service \u003cdevtools-gerritcodereview-exitgate@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "cf6a7e5cb872e997d251b686d68bbcc5ac3f55e2",
      "tree": "aec3bbd87986686d5b5a10b41da076aef1bf6cd9",
      "parents": [
        "fba92912151a4202720aaaafae758ff226e3a1f2"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:20:22 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:20:22 2026 -0700"
      },
      "message": "[besproxy] End-to-end integration tests with Bazel\n\nThis commit completes the robust sniffer proxy (\u0027besproxy\u0027) implementation\ndemonstration with a comprehensive integration test suite.\n\nEnd-to-end bazel-in-bazel tests:\n- Integration: Added the \u0027scripts/bazel_tests\u0027 suite using SHAR-based bundles\n  to verify zero build event loss across multiple integration profiles:\n  - PLAIN: Standard Bazel build.\n  - BUNDLED_DISABLED: Bundle with orchestration kill-switch.\n  - BUNDLED_SINK: Bundle as a drop-in replacement (sink mode).\n  - BUILDMINDER: jobstatus-only proxying.\n  - RESULTSTORE: BES/CAS proxying to fake ResultStore.\n  - BUILDMINDER_RESULTSTORE: Full stack integration.\n\nThese tests use a compositional approach to verify behavior across\ndifferent commands (build, test), outcomes (pass, fail), and\nintegration toolsets.\n\nBug: 487240814\nChange-Id: Ib4e8b85be7fdc10fc101deb029474a979f9329ce\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1621429\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\n"
    },
    {
      "commit": "fba92912151a4202720aaaafae758ff226e3a1f2",
      "tree": "f690a8f32e2eff1789dc218664e940ff87be9398",
      "parents": [
        "8ddf1a150556b017bdcc7243c0f927938f4e0782"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:19:48 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:19:48 2026 -0700"
      },
      "message": "[besproxy] besproxy CLI and bash wrappers\n\nImplement the besproxy CLI for the BES and CAS sniffing proxy. The binary\nsupports both \u0027standalone\u0027 and \u0027integrated\u0027 modes, allowing it to\neither run as a background service or wrap a build command (like Bazel)\ndirectly.  The current plan is to primarily use it in integrated mode.\n\n- Implement cmd/besproxy/main.go with support for signal propagation\n  and integrated mode readiness signaling.\n  Includes support for recording gRPC data (from bazel) as sinks that\n  operate as fake BES and CAS services.\n- config.go: flag parsing and proxy option mapping.\n  Infer sink-mode for a service whose upstream address is not set.\n- Add besproxy-wrap.sh and rs-bazel.sh as reference scripts for\n  transparent proxying of Bazel builds.\n  Used together in coordination, they behave like a drop-in replacement\n  for bazel that operates with an extra gRPC channel to the buildminder\n  TUI application.\n- main_test.go: uses the TCP loopback testing infrastructure from grpctest.\n\nBug: 487240814\nChange-Id: I662274b7ceaf9781c6fc92ef52b72597cdf87dd3\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1619161\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8ddf1a150556b017bdcc7243c0f927938f4e0782",
      "tree": "5ca4206a78a4f1e04159db72004c1526713ad449",
      "parents": [
        "730a9fa2e5279816c98b0f64d2eb9ed22f6627c3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:11:45 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:11:45 2026 -0700"
      },
      "message": "[besproxy] passive message dispatching, data safety\n\nNumerous related fixes to increase stability,\nand avoid flaky data loss during shutdown.\n\ninternal/pkg/{besmsg,casmsg}/dispatcher.go:\n- Was implementing egress workers (to be pluggable into router), but...\n- Now these are migrated to be passive components so they\n  participate in cascading pipeline shutdown by virtue of\n  propagating channel closures from inputs to outputs (simplification).\n- Context-cancellation is not considered an error, is normal termination.\n\ngrpcutil/proxy/TappedRelay:\n- Fixed GracefulStop ordering to let active message handlers\n  finish naturally before context cancellation.\n\nbesproxy/proxy/Proxy:\n- gRPC stream registry entries persist for asynchronous observers,\n  which fixes \"unknown stream ID\" errors during build finalization.\n\nbesproxy testing:\n- fixed to use backend callbacks that poll to wait for data, tolerating\n  delays.\n\ninternal/pkg/jobstatus:\n- Enhanced BES event unmarshaling, glog reporting for corrupted events\n\nBug: 487240814\nChange-Id: I46911f13e5d76e30aef5af22e95d7f1ebc7d855d\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1621428\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "730a9fa2e5279816c98b0f64d2eb9ed22f6627c3",
      "tree": "960c8e7a4fe2478ab4b9c5034a5f18de959ed620",
      "parents": [
        "458d1c945a546011b606bb24c7ab7f45ea9fa1e4"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:04:17 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:04:17 2026 -0700"
      },
      "message": "[besproxy/router] cascading shutdown stability\n\nbesproxy.Proxy: make clean-up more deterministic and loss-free\n- Implement sequential flushing for forward-cascading shutdown:\n  Relays stop -\u003e Stage 1 Funnel drains -\u003e Joiner flushes -\u003e Stage 2\n  Router drains -\u003e Egress/Loggers finish.\n- Refactored responders to use the new ResponderFactory structure,\n  supporting stateful per-stream simulations (needed for BES and CAS).\n- Joiner: Added explicit flushing logic to ensure orphaned correlation\n  logs are processed during shutdown.\n\nrouter.Router:\n- Add stopOnce to ensure internal channels are closed exactly\n  once. Improved Run() safety with re-run protection.\n\nBug: 487240814\nChange-Id: I6455e91cde11a290a91f61450250aa6e72c6aa2b\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1622311\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "458d1c945a546011b606bb24c7ab7f45ea9fa1e4",
      "tree": "5a4936521bcb5e1f96b9bc8a4b5c59b396a81e3b",
      "parents": [
        "2f0e17945bbd00c3b791c403cb5d21255a48e866"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:04:12 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:04:12 2026 -0700"
      },
      "message": "[fake_resultstore] improve fake servers observability\n\nUpgrades the fake ResultStore, CAS, and BES servers:\n\n- Fakes: Implement RequestSink in ResultStore, CAS, and BES for real-time\n  capture of gRPC messages using the new thread-safe JSONLSink.\n  JSONL is good for streaming outputs as they happen instead of waiting\n  until shutdown time to dump everything at once.\n- Fake CAS:\n  - Improved ResourceName normalization and uploaded digest tracking.\n- Fake ResultStore:\n  - Enhanced state management and ResourceState integration.\n- Fake BES:\n  - Support for sequence tracking and acknowledgment.\n\nfake_resultstore:\n- Add --dump_dir for automatic capture of transactional logs (.jsonl)\n  and final state files (.json).  This replaces the old --dump_json\n  single-file output.  The new directory separates files by service\n  type and transactional vs. stateful data for easy use in verification\n  scripts using \u0027jq\u0027.   All legacy uses of JSON dump have been removed.\n- config.go: Refactored configuration and added unit tests for\n  flag parsing and lifecycle management.\n\nvarious fake-resultstore verification scripts:\n- Updated existing integration verifiers (Ninja, gRPC Ingress,\n  Passthrough) to align with the new structure.\n\nThese improvements prepare for bazel+besproxy end-to-end testing.\n\nBug: 487240814\nChange-Id: I6a893719614b29dc5aec465c2067e6483da07cb7\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1622310\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "2f0e17945bbd00c3b791c403cb5d21255a48e866",
      "tree": "029745bab01536b2df27914aeafd357aa5bf52e8",
      "parents": [
        "b94f0819f72f4c0ba6d485b55bcf50c92d601b33"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 18:03:42 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 18:03:42 2026 -0700"
      },
      "message": "[grpcutil] Standardize insecure and raw gRPC connections\n\nRefactor mechanism for establishing unencrypted gRPC connections,\nensuring consistency and simplification across the codebase.\n\ngrpcutil:\n- Add DialInsecure and DialRaw helpers to internal/pkg/grpcutil.\n- Helpers automatically apply netutil.NormalizeTarget (passthrough:///) to\n  bypass DNS issues in restricted test environments.\n- Modernized: Replaced all deprecated WithInsecure() calls with\n  modern insecure.NewCredentials().\n- Refactored besproxy, rsproxy, jobstatus_adapter, fakebuild,\n  and the integration test suite (grpctest/testenv) to use the new\n  standardized connection pathways.\n\nBug: 487240814\nChange-Id: Iec5922241a670a02574df94d4ec5bb3c976db870\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1622059\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: David Dorwin \u003cddorwin@google.com\u003e\n"
    },
    {
      "commit": "b94f0819f72f4c0ba6d485b55bcf50c92d601b33",
      "tree": "78f79b252ac47130c6b21ff27847c4cfbeb5017e",
      "parents": [
        "a31c73d9c2fa084c65bec6b3968f66185b3a591c"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 17:56:12 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 17:56:12 2026 -0700"
      },
      "message": "[router] implement egressPathway.send() and drain()\n\nNew methods on the \u0027egressPathway\u0027 struct:\n\n* \u0027send(ctx, msg)\u0027: Ensures that messages are delivered to worker\n  buffers even if the context is cancelled, provided there is space.\n  This eliminates a major source of data-loss races during pipeline\n  shutdown (caused rare test flakes).\n\n* \u0027drain(wg)\u0027: Encapsulates the background channel drainage logic\n  required when an egress worker is unregistered or finishes early.\n  This prevents the central dispatcher from deadlocking on full\n  worker channels.\n\nThis change is working towards a more loss-less cascading\nshutdown in implemented proxies.\n\nBug: 487240814\nChange-Id: Idb07919feab590cbbe7d4f083ad1c7c5a432bfa0\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1624397\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\n"
    },
    {
      "commit": "a31c73d9c2fa084c65bec6b3968f66185b3a591c",
      "tree": "1bcfa33deb093567982d8855f12b4a01cfafee41",
      "parents": [
        "ef0987cb8f9b22bd963cf0f5d9dad32254412949"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 17:56:07 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 17:56:07 2026 -0700"
      },
      "message": "[grpcutil] proxy TappedRelay resilience\n\nTappedRelay fixes and improvements:\n\n- DownstreamRPCPort: Refactor bridge and client-egress to use robust\n  DRAIN logic and thread-safe SendResponse via LogicalStream.\n- UpstreamRPCPort: Prioritize draining the inbound message channel during\n  shutdown to ensure zero build event loss.\n- StreamRegistry: Safer lifecycle management for proxied gRPC streams.\n- TappedRelay: Improved error propagation and cleanup coordination.\n- Responders: Refactored besResponder and casResponder to be Unary-safe\n  in Sink Mode by responding to request data immediately. This ensures\n  compliance with gRPC Unary semantics over bidirectional-streams and\n  avoids protocol violations on the client (downstream) side.\n- Use ResponderFactory to support stateful per-stream\n  simulations (e.g. for ByteStream.Write).\n\nSome of these issues were discovered during end-to-end testing.\n\nBug: 487240814\nChange-Id: I560845377e58fc4c60a6f5caeaaaa39093bc19b0\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1622309\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "ef0987cb8f9b22bd963cf0f5d9dad32254412949",
      "tree": "454b5f313094f30a250933b00b3826a2226d3d90",
      "parents": [
        "3a29c49121dedfdc3e002735ffcdef7db294c475"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 17:55:39 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 17:55:39 2026 -0700"
      },
      "message": "[protoutil] Implement thread-safe JSONL streaming sink\n\nThis commit adds a JSONLSink to internal/pkg/protoutil, providing a\nreliable mechanism for real-time gRPC traffic captures.\n\n- Support atomic line-writing for multi-process/thread safety.\n- Use protojson for deterministic proto-to-JSON marshaling.\n- Implement thread-safe streaming to any io.Writer.\n- Add comprehensive unit tests verifying concurrent write safety and\n  data fidelity.\n\nThis will be used in the upcoming fake_resultstore server update\nfor improved data capture and end-to-end test data validation.\n\nBug: 487240814\nChange-Id: I77ceedb5ccd2ee4abbf185fd81f917173689e4f4\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1622308\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "3a29c49121dedfdc3e002735ffcdef7db294c475",
      "tree": "5e3007e2bcfc40db546b0ac4054883b011b471d1",
      "parents": [
        "cdad9f55327753b7fd3e29157a1b45eeedece7de"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 17:48:09 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 17:48:09 2026 -0700"
      },
      "message": "[fifo] Implement context-aware, ergonomic FIFO API\n\nThis commit refactors the \u0027fifo\u0027 package to replace blocking syscalls\nwith interruptible, leak-proof pipe operations using O_NONBLOCK polling\nloops.\n\n- Implement \u0027Ground then Block\u0027 pattern for readers to ensure pipes are\n  grounded immediately without blocking the caller.\n- Implement \u0027Patient Writer\u0027 pattern with O_NONBLOCK probing to avoid\n  deadlocks when connecting to readers.\n- Fully respect context cancellation and deadlines in OpenReaderContext\n  and OpenWriterContext.\n- Clean-up redundant FIFO package aliases in internal/pkg/rsproxy.\n- Use t.Context() a few more missed places.\n\ninternal/pkg/fifo/fifotest:\n- Add NewTestPipe to simplify synchronization in integration tests.\n\nThis fixes some more infrequent deadlocks and flakes found during\nstress testing.\n\nBug: 487240814\nChange-Id: I2884b9fe6ab93d263a966079df02ac8fd83e6432\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1622307\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "cdad9f55327753b7fd3e29157a1b45eeedece7de",
      "tree": "bce8752f51481975c73e13eff50f81bd7854f20a",
      "parents": [
        "4cad753a90657e233c1a62980ed8089b469d61dd"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 17:48:04 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 17:48:04 2026 -0700"
      },
      "message": "[besproxy] Harden integration test wrappers and diagnostics\n\nFix a race condition in the readiness handshake between rsproxy and its\nshell wrapper by implementing atomic file writing (write + rename) and\nhardening the shell polling to check for non-empty files.\n\nAlso update \u0027rs-fakebuild.sh\u0027 to correctly support gRPC ingress mode,\nand fix Bash subshell bugs in log-dumping functions to ensure\ndiagnostics are visible on failure.\n\nBug: 487240814\nChange-Id: Ie397d0a6adb25ce121ba1994d9147f9b20b98e04\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1628056\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\n"
    },
    {
      "commit": "4cad753a90657e233c1a62980ed8089b469d61dd",
      "tree": "44212ee26c3cf2de10b027cf019bfeeee93461d7",
      "parents": [
        "7b61209192452bf03cb0bc5e8dd4dd0059c727cb"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 29 17:47:58 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 29 17:47:58 2026 -0700"
      },
      "message": "[foundations] Add TempDir (netutil) and WriteFileAtomic (syncutil)\n\nIntroduce foundational utilities for robust process synchronization\nand environment management:\n\n- netutil.NewShortTempDir: Creates temporary directories in /tmp by\n  default to work around the 104-character limit for Unix domain sockets\n  in deeply nested build environments (like Bazel sandboxes).\n\n- syncutil.WriteFileAtomic: Implements a robust \"write-sync-close-rename\"\n  pattern for atomic file creation. This is an inter-process readiness\n  signal that complements the intra-process ReadySignal[T], ensuring\n  external tools (like shell wrappers) never read a partial file.\n\nThe internal implementation is used to keep dependencies lean for\ntransient signals, while leaving an option to migrate to \u0027renameio\u0027 if\nmore complex persistence needs arise.\n\nBug: 487240814\nChange-Id: I922497c076ab698c387eea19db16c560bc1c29a4\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1628055\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "7b61209192452bf03cb0bc5e8dd4dd0059c727cb",
      "tree": "27fd5c300d514598cab0e2381df608b4e45e0006",
      "parents": [
        "5eff083c10d0abee4b258610320a2aba97fe754e"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:55:09 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:55:09 2026 -0700"
      },
      "message": "[besproxy] Implement Proxy orchestrator\n\nThe Proxy struct instantiates and connects components:\n* TappedRelays for BES and CAS services (raw gRPC level), which feeds\n* BES and CAS request dispatchers, which feeds\n* TraceEvent serializer (funnels BES/CAS streams), which feeds\n* TraceEvent Router (can record/replay streams), which feeds\n* Joiner for translating to JobStatus BuildEvents, which feeds\n* BuildEvent Router, whose egress worker bundles JobStatus BuildEvents\n  to the outbound streaming UpdateStatus RPC (to buildminder TUI).\n\nProxy can also act in sink-mode and configure the TappedRelays to respond-only\nwithout relaying/forwarding (for BES and CAS).  This removes the\nnecessity for besproxy (application in next commit) to communicate with a\nfake server in end-to-end tests.\n\nBug: 487240814\nChange-Id: I678778dc69dc709946be366d61b9aec8737c2c28\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1619262\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "5eff083c10d0abee4b258610320a2aba97fe754e",
      "tree": "e69cb3679f03c5de42dddb25898c134603bcf00b",
      "parents": [
        "fe98e20716d6999c77ba8eb7ab7553e986ecf6c8"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:50:59 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:50:59 2026 -0700"
      },
      "message": "[jobstatus] Implement JobStatusEgress worker for stream bundling\n\nIntroduce JobStatusEgress, a specialized egress worker that aggregates\ntranslated BuildEvents using a bundler and streams them to a remote\nJobStatus service.\n\n- Implement router.EgressWorker[*jspb.BuildEvent].\n- Use bundler for efficient batching of events.\n- Support thread-safe gRPC stream management with lazy initialization.\n- Align with modern grpctest patterns in unit tests.\n\nBug: 487240814\nChange-Id: Icea4df3ff1c66b633c05cd5a32a662751a69e9a7\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1619261\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "fe98e20716d6999c77ba8eb7ab7553e986ecf6c8",
      "tree": "ec4ffa50bbaecdce019d580836d86b0f3bc8131a",
      "parents": [
        "2af79b0205772a511d3d6299278bf37460fac010"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:47:06 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:47:06 2026 -0700"
      },
      "message": "[besproxy] TraceRecorder for offline analysis and playback\n\nTraceRecorder is a worker that can record a TraceEvent stream\nand also inject recorded streams (bypassing upstream logic,\nfeeding the Joiner) for testing.\nThis is critical for studying (and reverse-enginering) real gRPC\nstreams coming from Bazel and digesting them into test case data\nfor besproxy Go tests.\n\n- Implement TraceRecorder as a router.EgressWorker[*tracepb.TraceEvent].\n- Uses textproto serialization/deserialization for human-readability.\n\nBug: 487240814\nChange-Id: Icd2c05079f6ee6db8808ec499938d63bfc78d97c\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1619041\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\n"
    },
    {
      "commit": "2af79b0205772a511d3d6299278bf37460fac010",
      "tree": "74d65e66684f01d47a066b603f93cc1e1c8ef42d",
      "parents": [
        "63f8a51974cd08966639f65d6a7bfb60ddf64839"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:45:32 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:45:32 2026 -0700"
      },
      "message": "[besproxy] Joiner: stateful BES/CAS correlation\n\nJoiner is a worker that operates on TraceEvent and implements the core\ntranslation and BES/CAS service correlation logic of besproxy.\nRemember that the BES protocol does not actually carry text output\nof actions, but rather only CAS URIs (e.g. bytestreams).\nIt implements router.EgressWorker[*tracepb.TraceEvent] and\nis responsible for:\n\n- Identifying the primary Build UUID from BES Lifecycle events.\n- Aggregating interleaved build events into a coherent state.\n- Keep a mini-CAS in memory for stdout/stderr log text seen.\n- Matching CAS blob uploads to their corresponding BES action references.\n  Also support reuse of the same digests, in case actions print the same\n  output (possible).\n  For safety, we impose a 10MB limit on intake in case any large binaries\n  are attempted to be uploaded, as this is intended for stdout/stderr text\n  logs and progress messages.\n  - head_tail_buffer.go: When size limit is exceeded, retain the first\n    and last 5MB (or configured size) of the logs, where the useful\n    information is more likely to be found (mitigate risk of information\n    loss).\n- Managing \u0027correlation\u0027 logs that arrive out-of-order relative to the\n  build event stream.\n- Emitting JobStatus protos for UpdateStatus gRPCs, which feed\n  the buildminder TUI application.\n\nThis enables the proxy to reconstruct a high-level view of the build\nprogress and logs from raw gRPC traffic.\n\nBug: 487240814\nChange-Id: I79bcc646b94e8be7b972232493c6912bf6b4959f\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1619040\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "63f8a51974cd08966639f65d6a7bfb60ddf64839",
      "tree": "097cd17e634eb7bfd364e726822bfdd1d1640e49",
      "parents": [
        "8bf5ecbec796a61dbb3f9e03ad8cef65ba448dd9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:43:03 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:43:03 2026 -0700"
      },
      "message": "[besproxy] TraceEvent proto for BES/CAS stream correlation\n\nTraceEvent is the chronological container for interleaved BES and CAS\nmessages. This establishes the authoritative sequence required for the\n(future) Joiner to correlate log uploads with their originating build\nevents, making BES/CAS look like a single unified service.\nThe translator (to JobStatus messages) in the upcoming commit will be\nresponsible for tolerating different-but-equivalent interleavings of\nBES and CAS messages.\n\nNote: since we are only tapping from the real gRPC streams,\nthis proto only needs to be concerned with request message types,\nand not responses.\n\nUpdate third_party/bazel proto visibility to support internal use.\n\nBug: 487240814\nChange-Id: Iafab27a6581f56d2a4bb4d6e18a49e7dc65c5ce5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1619034\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8bf5ecbec796a61dbb3f9e03ad8cef65ba448dd9",
      "tree": "252331497e998de2d1ddf7a0fcabfd1fa440971b",
      "parents": [
        "a4ac1591f8a49d31c0f711debdcaab0043ae91a3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:42:56 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:42:56 2026 -0700"
      },
      "message": "[grpcutil] gRPC TappedRelay\n\nTappedRelay performs bidirectional relaying of requests\nand response messages at a low-level to avoid the cost\nof marshaling and unmarshaling typed messages.\nIt is essentially a man-in-the-middle relay, that also\nincludes tap points for requests and responses.\nFor besproxy (coming soon), we are only interested in intercepting\nrequests.\nThis is the Go-equivalent to cmd/grpc_tee utility that uses `socat`\nand `tee` to asymmetrically copy gRPC streams.\n\nTappedRelay is built from MessageRouters (one in each direction)\nand upstream and downstream ports that connect as router workers\nto implement full-duplex relaying of gRPC message between two ends.\nStreamRegistry: Manages logical gRPC conversation state and ID\nassignment across bidirectional ports.\n\nTappedRelay prioritizes \"Fast Path\" relaying using raw wire-format\nbytes, ensuring that sniffing overhead does not impact the primary\ngRPC stream, data is never dropped, and defaults to large worker buffers\nto minimize the frequency of pipeline stalls.\n\nBug: 487240814\nChange-Id: I03a2a5c6b676fbd1f65b8d3d2f0f64064c70e588\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1617817\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "a4ac1591f8a49d31c0f711debdcaab0043ae91a3",
      "tree": "dd5317e128adb8dc35ded721a1aa57fa4acfa0eb",
      "parents": [
        "7a556eee4a4d95919bca503a49f58f9eb3738a43"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:37:27 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:37:27 2026 -0700"
      },
      "message": "[grpcutil] MessageRouter, recorder, replayer\n\nMessageRouter is router.Router[grpcutil.Message],\nwhich will form the core of the upcoming gRPC tapped relay.\n\nMessageRecorder/Replayer are complementary tools for\nrecording raw gRPC message streams and replaying them\nfor testing.\n\nBug: 487240814\nChange-Id: Ifd3592f2ae576d3583fe412b382bdc6431909165\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1617816\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "7a556eee4a4d95919bca503a49f58f9eb3738a43",
      "tree": "e505465f3768551ee04f3e485b16f7ededb46970",
      "parents": [
        "90b0c952692b8dfaa77ce1f5f5baf5c9d3af8e87"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:34:58 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:34:58 2026 -0700"
      },
      "message": "[fake-servers] Modernize ResultStore and unify testing hub\n\nUpdate test environment by upgrading the fake ResultStore server\nand unifying all fake services (RS, CAS, BES)\ninto a high-fidelity testing hub.\n\n- Modernize \u0027fakeresultstore\u0027 with improved internal storage and\n  simplified accessors (GetData -\u003e Data).\n- Update \u0027testenv\u0027 to support the modernized service lifecycle.\n- Upgrade \u0027cmd/fake_resultstore\u0027 to a unified hub for all three\n  simulated build services.\n  Restructured configs for consistency for each service.\n- Refactor all \u0027rsproxy\u0027 tests to handle the ResultStore API rename.\n\nBug: 487240814\nChange-Id: Ic4ce8fdc8596b8c268522a8ca924af1f6f7406d2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1612573\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "90b0c952692b8dfaa77ce1f5f5baf5c9d3af8e87",
      "tree": "042db4bdbd1346532f53ab15874775558dcd2cb7",
      "parents": [
        "ba40ce32cd0c62d78a3b2f24da3cd86aeb2c81d6"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:34:52 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:34:52 2026 -0700"
      },
      "message": "[fake-servers] Introduce BES infrastructure and fake server\n\nAdd the \u0027besmsg\u0027 and \u0027fakebes\u0027 packages to establish the Build Event\nService (BES) orchestration and simulation layer. These packages are\nprerequisites for the full modernization of the fake ResultStore hub.\n\n- Add \u0027internal/pkg/besmsg\u0027 for parsing, dispatching, and acknowledging\n  build event streams.\n- Implement \u0027internal/pkg/fakebes\u0027 as a high-fidelity sink for build\n  events during integration tests.\n- Provide thread-safe event storage and JSON marshaling in fakebes.\n- Include detailed architectural and protocol-level documentation.\n- Verified with unit tests for message unmarshaling and dispatching.\n\nBug: 487240814\nChange-Id: Ie5a7aaf1628597ccd79d94fb746bd535a8e2f133\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1612572\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "ba40ce32cd0c62d78a3b2f24da3cd86aeb2c81d6",
      "tree": "7c511b992a47b7ad53d92b9df4f7c0ffeb5a810f",
      "parents": [
        "3572969096a11d6c42276b76b0e8b3aaa457b079"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:26:55 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:26:55 2026 -0700"
      },
      "message": "[fake-servers] Modernize CAS and JobStatus testing infrastructure\n\nIntroduce the \u0027casmsg\u0027 package for specialized CAS protocol\norchestration and modernize the fake CAS and JobStatus servers to\nleverage the new high-fidelity testing infrastructure.\n\n- Add \u0027internal/pkg/casmsg\u0027 with granular test files for\n  assembler, dispatcher, and resource handling.\n- Implement ByteStreamAssembler to restore (rehydrate) sticky\n  ResourceName fields in gRPC Bytestream sequences.\n- Update \u0027fakecas\u0027 to use \u0027casmsg\u0027 for resource normalization and\n  to support detailed RPC logging via protoutil.TextSink.\n- Add thread-safe helper methods (MarkUploaded/IsUploaded) to fakecas.\n- Modernize \u0027fakejobstatus\u0027 to align with the latest grpctest patterns.\n- Verified with unit tests for casmsg and fake server implementations.\n\nThese updated fakes for end-to-end testing of besproxy, and also\nfor besproxy to implement sink-mode.\n\nBug: 487240814\nChange-Id: I1a14a698df36f7bc667711f0b40f4839125b4f49\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1612090\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\n"
    },
    {
      "commit": "3572969096a11d6c42276b76b0e8b3aaa457b079",
      "tree": "2b0f098233d516eb5b9a1eb963d9a1e9953f4fe4",
      "parents": [
        "d4517853194b0ff65ff700f04ce1c73fc4d72c3f"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:21:17 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:21:17 2026 -0700"
      },
      "message": "[rsproxy] Migrate to generic Router orchestration\n\nReplace the bespoke UploadRequest router in \u0027rsproxy\u0027 with the new\ngeneric \u0027router.Router\u0027 engine. This significantly reduces technical\ndebt while providing a standardized worker orchestration pattern for all\nfuture proxy pathways.\n\n- Land \u0027internal/pkg/router\u0027 as a reusable orchestration engine.\n- Introduce \u0027bridge.go\u0027 with BridgeRouters and RouterToChannel utilities\n  to express type-safe inter-router connections in a compact, DSL-like\n  manner (graph-edge analogy).\n- Implement passive shutdown propagation, where termination signals\n  flow naturally from inputs (source routers) to outputs.\n- Migrate \u0027rsproxy\u0027 to use \u0027router.Router[*rspb.UploadRequest]\u0027.\n- Standardize the \u0027Close(ctx)\u0027 signature across the proxy and workers.\n\nThe generic Router will be used in multiple places inside besproxy,\nincluding a tapped gRPC relay (so this refactoring is worthwhile).\n\nBug: 487240814\nChange-Id: I9e02d19a512bd7f5bdab39b2561cffe8fa24bed5\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1612091\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "d4517853194b0ff65ff700f04ce1c73fc4d72c3f",
      "tree": "64ffb3b7b4ad7770bfb97cbc04efa0892923635d",
      "parents": [
        "9a59df0b37bb479c6e8cf0a316579edfa50e46e0"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:18:52 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:18:52 2026 -0700"
      },
      "message": "[testing] Upgrade grpctest to real TCP loopback\n\nProvide NewTCPServer for real TCP loopback (127.0.0.1) testing.\nMigrate most tests to use this.\n\nAlso retain NewBufconnServer for the cases where bufconn-based in-memory\ntesting is sufficient.\n\nThis ensures that our tests exercise the full gRPC stack, including\nserialization, which is a prerequisite for using custom codecs like\nRawCodec. It also eliminates non-deterministic DNS resolution issues in\nrestricted Bazel sandboxes by using explicit loopback addresses.\n\n- Upgrade grpctest to real-TCP loopback with lifecycle/idempotency guarantees.\n- Update \u0027jobstatus_adapter\u0027 tests to use the new TCP-based \u0027grpctest\u0027 API.\n\nBug: 487240814\nChange-Id: I232f1900a85c27f434ffe9dedf29231f1e3c0b80\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1612089\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "9a59df0b37bb479c6e8cf0a316579edfa50e46e0",
      "tree": "0663b6a6b89c719341ffcfa8d317feb3184e1a43",
      "parents": [
        "e5fa7f0417185b2d02a72055b67a7559aaad71e6"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:18:45 2026 -0700"
      },
      "committer": {
        "name": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "email": "fuchsia-internal-scoped@luci-project-accounts.iam.gserviceaccount.com",
        "time": "Fri May 22 12:18:45 2026 -0700"
      },
      "message": "[grpctest] Move grpctest under grpcutil\n\nNo logical changes.\n\nBug: 487240814\nChange-Id: If2385d1cbf684627f04c65fa627a16c579326d24\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1618450\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    }
  ],
  "next": "e5fa7f0417185b2d02a72055b67a7559aaad71e6"
}
