)]}'
{
  "log": [
    {
      "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"
    },
    {
      "commit": "e5fa7f0417185b2d02a72055b67a7559aaad71e6",
      "tree": "8aa3dc1e0b1d4f36741553ac426d857ea9e755ec",
      "parents": [
        "f1fcf6791561bf3c306bf25cc05239472ff4083a"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:14: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": "Fri May 22 12:14:50 2026 -0700"
      },
      "message": "[grpcutil] Add core types for protocol-opaque gRPC routing\n\nIntroduce the RawCodec and Message types to establish the foundational\ndata layer for efficient gRPC proxying. These allow streams to be\nrouted and recorded as raw wire-format bytes, avoiding unnecessary\nunmarshaling overhead.\n\n- Add internal/pkg/grpcutil/codec.go for raw byte passthrough.\n- Add internal/pkg/grpcutil/message.go for opaque message representation.\n- Establish the pattern for sequence-aware stream termination.\n- Verified with unit tests for codec and message serialization.\n\nbesproxy will need this to work with gRPCs at a low-level and avoid\nincurring unnecessary marhsalling/unmarhsalling overhead along\nthe fast-path to the real backend service.\n\nBug: 487240814\nChange-Id: I3418457264907a6419bba7fc925389a3651e4b09\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1612088\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "f1fcf6791561bf3c306bf25cc05239472ff4083a",
      "tree": "153a52a2aba5ec50e9226cdaf6a32c84eb631d77",
      "parents": [
        "8c4f120078ecbdc5e1a33e0b1a4f11c59b66e0e3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:13: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": "Fri May 22 12:13:13 2026 -0700"
      },
      "message": "[netutil] Harden network address handling for sandbox stability\n\nStandardize on literal IPv4 loopback and implement gRPC target\nnormalization to ensure reliable connectivity in restricted test\nenvironments like the Bazel sandbox.\n\n- Add netutil.IPv4Loopback and NormalizeTarget utilities.\n- Apply passthrough:/// scheme to TCP targets to bypass DNS resolvers.\n- Update auth and grpctest packages to use target normalization.\n- Refactor fake_resultstore to use literal loopback for server and configs.\n- Restore documentation for OS-specific socket limits and dialer behavior.\n- Add unit tests for address normalization and prefix-preserving updates.\n\nBug: 487240814\nChange-Id: I464c1778bd70dbd905c14153bb9254d21e9ccec0\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1611257\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "8c4f120078ecbdc5e1a33e0b1a4f11c59b66e0e3",
      "tree": "73e73c0fd4bc246082dc45125431b5dbd23db547",
      "parents": [
        "9af935be5a9a027fcd6a7d2db8b3a60d40de2ecd"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:10: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": "Fri May 22 12:10:47 2026 -0700"
      },
      "message": "[protoutil] Standardize proto-stream IO and message pathways\n\nIntroduce generic infrastructure for recording and injecting streams of\nprotobuf messages. This establishes the foundational patterns for\nsimulation capture/replay and high-fidelity tracing.\n\n- Add internal/pkg/protoutil for generic proto IO and sinks.\n- Implement DelimitedPrototextIO with 10MB buffer for large messages.\n- Add PrototextWorker for asynchronous background message capture.\n- Refactor rsproxy pathways to use generic delimited IO.\n- Add IsPrintable and DataSummary helpers for intelligent data logging.\n- Integrate protoutil.TextSink into fake ResultStore and CAS servers for\n  high-fidelity RPC logging.\n- Add flags to fake_resultstore to enable optional RPC logging to assist\n  in debugging and simulation capture.\n- Standardize on t.Context() and proper error handling (mustAnyPBNew) in tests.\n- Expanded unit tests for concurrency, error handling, and multi-type reuse\n  to demonstrate the flexibility of the generic I/O engine.\n\nNewDelimitedPrototextIO will also be used in besproxy (future commit).\n\nBug: 487240814\nChange-Id: I1c4ce0f6afb6fab97347917859c153cdf58c87f1\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1611256\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "9af935be5a9a027fcd6a7d2db8b3a60d40de2ecd",
      "tree": "967e1a1c381fe94ac0d95ac55d6bf3603ba151cc",
      "parents": [
        "2113527f651a6f45cbeaaaa1bc2d57a90d419d82"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 22 12:10: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 22 12:10:42 2026 -0700"
      },
      "message": "[rsproxy] Standardize readiness signaling using syncutil.ReadySignal\n\nReplace manual channel management and sync.Once logic with a generic\nReadySignal primitive across rsproxy and fake_resultstore. This\nstandardizes how our services coordinate startup and broadcast\ndynamic metadata (ports, FIFO paths) to listeners.\n\n- Add internal/pkg/syncutil/ready.go for generic synchronization.\n- Update Proxy.Ready() to return strongly-typed IngressMetadata.\n- Refactor fake_resultstore to use ReadySignal[PortMetadata],\n  eliminating multiple disparate coordination channels.\n- Add TestProxy_ReadyMetadata to verify metadata propagation.\n- Un-export internal readiness triggers to improve encapsulation.\n\nBug: 487240814\nChange-Id: I3383cdd177a67af99d7c77bae4f16f68dcb94724\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1611255\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "2113527f651a6f45cbeaaaa1bc2d57a90d419d82",
      "tree": "43c8d631da67729a9d1ee39ec38c9781f983fa06",
      "parents": [
        "2dc6a21e700990f1c9aa423f5f882b207fdbb2f4"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Mon May 11 18:34: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": "Mon May 11 18:34:42 2026 -0700"
      },
      "message": "[testing] bazel tests are slow, need more time\n\nAllow bazel tests to take up to 1 minute.\nWarmed up they take around 8s.\nCold can take 30s.\nWith resource contention (load from parallel tests),\nit may need more.\n\nClassify bazel tests as \"moderate\" size, giving up to 1 minute.\n\nBug: 487240814\n\nChange-Id: Iff4a770eb4517feb0d5b4fa8b39ccd802bdad7ba\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1608015\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "2dc6a21e700990f1c9aa423f5f882b207fdbb2f4",
      "tree": "2803c048babff08ada58d69e6bf3ee3a00dab18e",
      "parents": [
        "1bc102c53801563195b2834ecc5bdaec543499dd"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 08 16:27: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 08 16:27:42 2026 -0700"
      },
      "message": "[testing] integration test bazel (yes, inside bazel)\n\nSetup infrastructure for testing bazel invocations as bazel tests,\nusing the bazel prebuilt binary (the same one used to build this\nproject).\nThis will be needed to test bazel integration with (future) besproxy\nand buildminder.\n\nOrganization along dimensions is exactly the same as was done for\nscripts/ninja_tests:\n* bazel_invocation: is the bazel workload\n* outcomes: are behaviors of workloads paired with corresponding\n  verifiers that check exit status, and data received by the\n  fake backends.\n* integrations: combinations of tooling integration such as\n  ResultStore and buildminder (and both).\n\nInitially, we have minimal tests only, but this is expected\nto expand over time as besproxy and buildminder are developed together.\n\nBug: 487240814\nChange-Id: I57e7df7bbaa5f0a1298d033da6392a87b000b0da\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1584594\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "1bc102c53801563195b2834ecc5bdaec543499dd",
      "tree": "07df89f4f081e8128d2651fc801262a646a3c984",
      "parents": [
        "05d708c6f1c87ca1353dd11b46bc47f2e88d5461"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Fri May 08 11:26: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 May 08 11:26:49 2026 -0700"
      },
      "message": "[rsninja] integration tests: buildminder+RS+ninja\n\nDefine a shar_binary \"proxy_bundled_ninja.shar\" for a standalone drop-in executable\nthat contains the prebuilt-ninja, rsproxy, wrapper, and an orchestrator\nscript.  This can be used anywhere in bazel where a plain executable\n(prebuilt ninja binary) would be used.  This lets us test similarly\nto how the tools would be deployed in production (just with different\nlocations of scripts/tools).\n\nTests now demonstrate that proxy_bundled_ninja.shar works in simple\nninja invocations, and even nested ninja invocations (sub-builds).\nTests include expect-fail ninja builds, including a nested test where\nthe inner invocation fails, and propagates to the outer invocation, etc.\n\nThe ninja_invocation() rule (renamed from \u0027ninja_test\u0027) supports $(location)\nexpansion for tool path injection into template scripts.\n\nDefine ninja test suite builders, and test \"matrix\" of combinations\nof ninja outcomes/scenarios, and tooling integrations (resultstore,\nbuildminder).  These essentially generate combinations of\nsh_wrapper_tests, which replace the old hand-written tests.\n\nTest suite DIMENSIONS:\n* workload: these are the ninja build scenarios defined by ninja_workload(),\n  e.g. simple ninja invocation, recursive, clang compile,\n  slow build (for testing interrupts and signal handling).\n* outcome: these are behaviors of workloads paired with corresponding\n  verifiers that can check exit status, resultstore received requests,\n  buildminder received data.  Defined in scripts/ninja_tests/outcomes.bzl.\n* integration: generate a test for each combination of tooling integration:\n  plain-ninja, proxy-bundled-{disabled,sink}, resultstore-only,\n  buildminder-only, buildminder+resultstore.\n\nThese (40+) generated tests are comprehensive and cover and replace the\nprevious set of hand-written ninja integration tests.\n\nREADME.md: document buildminder+rsproxy integration and usage.\n\nBug: 487240814\nChange-Id: Ifef3d3a3b72292f97aa92409328a0fc9263ba8d0\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1553824\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\n"
    },
    {
      "commit": "05d708c6f1c87ca1353dd11b46bc47f2e88d5461",
      "tree": "b69bf305f4bb9b85ae1dd6c8955321b56439aea4",
      "parents": [
        "01555e9ab5aaa7b12bf8ac5875a61108c6e469fb"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed May 06 15:23: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 May 06 15:23:13 2026 -0700"
      },
      "message": "[testing] global test timeout\n\nunit-test and integration tests need very little time.\n\nAnything longer is a likely deadlock.\n\nApply test timeout globally.\n\nChange-Id: Iaff130cd319236ff968acf5573e0895e945ce821\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1601769\nFuchsia-Auto-Submit: David Fang \u003cfangism@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\n"
    },
    {
      "commit": "01555e9ab5aaa7b12bf8ac5875a61108c6e469fb",
      "tree": "8c876ecbc1ebace3f6a7db7c6f24c1941b01b6ce",
      "parents": [
        "dd62a9b982b47f5290d358ee4aeaaa825a7ca36c"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed May 06 14:01: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 May 06 14:01:54 2026 -0700"
      },
      "message": "[testing] synchronize with Waiter in fake servers\n\nReplaces brittle time-based polling in tests with a\ncondition-variable-based WaitUntil pattern in fake JobStatus and\nResultStore servers.\nRefactors high-level integration tests to use deterministic synchronization.\n\nBug: 487240814\nChange-Id: Ic0620389c2012a878cae413526db813b8fb43f2a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1599500\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "dd62a9b982b47f5290d358ee4aeaaa825a7ca36c",
      "tree": "34aafffc31832c1fc7fd00dd1ab199188b25a9f8",
      "parents": [
        "dea5ef75dddec8b0dd0c9e0f8fef9f91209e6d1b"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed May 06 13:46: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": "Wed May 06 13:46:49 2026 -0700"
      },
      "message": "[grpctest] centralize mock server testing tools\n\nExtends the foundational gRPC testing toolkit to standardize in-memory\nmock server patterns and de-dupe boilerplate by migrating existing tests.\n\ngrpctest features:\n- \u0027Connect()\u0027: A helper to establish functional, insecure connections to\n  mock servers with automated t.Cleanup and custom dialer support.\n- \u0027ServiceEnv\u0027: A struct grouping a mock server and its pre-connected\n  client, simplifying environment initialization.\n- Exports common time constants \u0027PollInterval\u0027, \u0027UnblockTimeout\u0027, and\n  \u0027DefaultTestTimeout\u0027.\n- \u0027testonly\u0027: Explicitly marked \u0027grpctest\u0027 and \u0027testenv\u0027 libraries as\n  test-only to reinforce architectural boundaries.\n\nMigration of existing tests:\n- \u0027testenv.go\u0027: Refactored to use \u0027Connect()\u0027 for automated client setup.\n- \u0027rsproxy/proxy_test.go\u0027: Migrated manual JobStatus mock setup to use\n  \u0027grpctest.NewServer\u0027.\n- \u0027jobstatus_adapter/adapter_test.go\u0027: Full refactor to use \u0027ServiceEnv\u0027\n  and \u0027Connect\u0027, removing manual bufconn orchestration without losing\n  test coverage.\n\nBug: 487240814\nChange-Id: I8545ab62b4b5d14a9fb1346b54451a672198e16e\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1600132\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "dea5ef75dddec8b0dd0c9e0f8fef9f91209e6d1b",
      "tree": "8cdae1ca19ef9a0ebe828b37b3d5ef5c1b66d123",
      "parents": [
        "208dc4578f54f6c335fe887bf1d3dffe1dd1cafc"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 16:37:26 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 May 05 16:37:26 2026 -0700"
      },
      "message": "[rsproxy] fix JobStatus egress flush race\n\nrace bug: JobStatusEgressWorker.Run() could return and close the\ngRPC stream before the bundler handler is done sending all events.\n\nFix the use of the WaitGroup to decrement for each event\nreceived in a bundle, and move Add() before the main loop,\npreventing incorrect completion.\n\nBug: 487240814\nChange-Id: I9dc22b78944930a30df5e6a9757621423fdcbcd1\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1598668\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "208dc4578f54f6c335fe887bf1d3dffe1dd1cafc",
      "tree": "ae9ea7dc9ff3d50c347b96604c045f61b0d27f06",
      "parents": [
        "35b4a8af2ba07c16d8e40ee77b7368a0ea2ecbb3"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 16:24: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": "Tue May 05 16:24:55 2026 -0700"
      },
      "message": "[rsproxy] improve test robustness\n\nObserved 1 in 500 test flake, so added polling verification\nto TestProxy_MultiEgress test case.\n\nrouter_test.go: reduce use of time.Sleep()\n\ntest_params_test.go:\nFurther centralized common tested-related time constants.\n\nTested: bazel test --runs_per_test 1000\nBug: 487240814\nChange-Id: I5eaaed140600d5f04eba6ecc8dee8a594b77ccc2\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1593553\nReviewed-by: Jay Zhuang \u003cjayzhuang@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "35b4a8af2ba07c16d8e40ee77b7368a0ea2ecbb3",
      "tree": "e7220277727ab43d81765afbd0b803375e47f6a5",
      "parents": [
        "39493f0edb2f91f7630159e8f2de31f5f5b9a913"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 16:13: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": "Tue May 05 16:13:51 2026 -0700"
      },
      "message": "[rsproxy] isolate egress worker failures (robustness)\n\nBefore: a single egress worker failure would effectively\nkill the entire error group shared by all other egress workers.\n\nNow: a failed egress worker will disconnect itself from the router,\nallowing others to continue unaffected.\n\nInternally, channel feeders are paired with their respective egress workers\nin egressPathway struct for easier coordination.\nThe Router maintains a slice of all original egressPathways, and the\ncurrent active set.  As failures are encountered, elements of the\nset are removed for isolation.\n\nBug: 487240814\nBug: 473907403\nBug: 487240814\nChange-Id: I97887e38c4272d314a7c978acfe56db33f5adc57\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1593571\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "39493f0edb2f91f7630159e8f2de31f5f5b9a913",
      "tree": "ced1f2e3d9f691730e7fabc737eea320ca8d86ee",
      "parents": [
        "7a96ab3dc5489d71a536d526eb709c64cd057948"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 16:05: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": "Tue May 05 16:05:07 2026 -0700"
      },
      "message": "[rsproxy] fix gRPC ingress deadlock\n\ngRPCIngressWorker: adds a stop channel to unblock the\ninternal handlers waiting on the output request channel during\nshutdown.\nUnblock before closing the server to avoid GracefulStop deadlocks.\n\nUpdate grpc-ingress tests to be independent of Router.\nReplace uses of Sleep() with gRPC interceptors (more reliable).\nAdd tests to verify that blocked handlers exit cleanly\non shutdown.\n\ngrpctest.go: plumb grpc.ServerOptions\n\nBug: 487240814\nBug: 487240814\nChange-Id: I8b78aaced179ec766e00d31d39f009046d260d8e\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1593570\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "7a96ab3dc5489d71a536d526eb709c64cd057948",
      "tree": "47bc7e5699e97083c1e32b4f1a880a8947f9b695",
      "parents": [
        "1d5d18243d88d9ec7250159bcc662a8dc2647833"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:57: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": "Tue May 05 15:57:04 2026 -0700"
      },
      "message": "[rsproxy] fix CAS bytestream URI construction\n\nPreviously, the CAS URI prefix was constructed using the raw\nCASInstanceName, which might be a full resource name (e.g.\n\"projects/p/instances/i\"). This resulted in duplicated segments\nlike \".../instances/projects/p/instances/i/blobs\".\n\nThis fix:\n- Adds ParseProjectID and ParseInstanceID helpers in rsmsg.\n- Adds FormatCASBlobURIPrefix helper to rsmsg.\n- Adds CASBlobURIPrefix() method to ResultStoreEgressOptions.\n- Updates resultStoreEgressWorker to use the new method.\n\nIncludes unit tests for the new rsmsg helpers and the new\nResultStoreEgressOptions method.\n\nBug: 487240814\nChange-Id: Ia435b50a68f77dc7c48ec157f36274d590bebc6f\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1595106\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "1d5d18243d88d9ec7250159bcc662a8dc2647833",
      "tree": "9e1fb29ae7f84ecd683715bdb9747ef6ab4f9f77",
      "parents": [
        "a3c05f124c6a9b48a12947bc823a5328cb490836"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:52: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": "Tue May 05 15:52:46 2026 -0700"
      },
      "message": "[rsproxy] implement Clone-on-Write for egress data isolation\n\nThe Router dispatches the same UploadRequest pointer to all active\negress workers. Previously, workers like ResultStore and JobStatus\nwould mutate this shared pointer (e.g., for ID mangling or timing\nrepair), causing race conditions and data corruption (manifesting\nas TUI \"stuttering\").\n\nThis fix implements a \"Clone-on-Write\" pattern:\n- ResultStore worker now clones the request before mangling IDs.\n- JobStatus worker uses a new rsmsg helper to clone the request\n  only if a timing repair is actually required.\n\nIncludes unit tests for the new rsmsg helper.\n\nBug: 487240814\nChange-Id: I90b90358dc45729ffbef45f99042478422d930e6\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1595105\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "a3c05f124c6a9b48a12947bc823a5328cb490836",
      "tree": "dcebc45de377dd441536caf82d0d73b68e1bef49",
      "parents": [
        "6335fe7313411100a9f8e83d96d41fe00298d4d1"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:52: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": "Tue May 05 15:52:41 2026 -0700"
      },
      "message": "[rsproxy] fix JobStatus egress deadlock on connection failure\n\nThe JobStatus bundler handler has a HandlerLimit of 1 to ensure\nsequential event delivery. Previously, the handler used a blocking\nretrier to open the gRPC stream. If the service was unreachable, the\nretrier would hang the handler, which eventually filled the bundler\u0027s\nbuffer and backpressured the entire event dispatcher.\n\nThis fix removes the blocking retrier from the handler. Connection\nfailures are now recorded as non-fatal errors, and the worker resets\nthe stream state to attempt a re-connect on the next flush.\n\nNew regression test: TestJobStatusEgressWorker_NoDeadlockOnFailure.\n\nBug: 487240814\nChange-Id: Ie3a39fe3ee01d33466e0e6da7f8f527fd99e228f\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1595104\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "6335fe7313411100a9f8e83d96d41fe00298d4d1",
      "tree": "8eb0dda234e8d00cc8540e1b222b032be8cc395e",
      "parents": [
        "e6f370af9ae1a62c9cc95afde0210fe63ffe2346"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:49: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": "Tue May 05 15:49:39 2026 -0700"
      },
      "message": "[jobstatus] sanitize non-UTF8 strings in gRPC events\n\nBuild tool output (stdout/stderr) sometimes contains non-UTF-8 bytes\n(e.g., from colored logs or legacy tool encoding). gRPC string fields\nMUST be valid UTF-8.\n\nThis fix adds toValidUTF8 sanitization for mnemonics, descriptions,\nand console output in the Ninja translation logic.\n\nBug: 487240814\nChange-Id: Iaf74a0317c6453d20e59bfc1ffec7e021247f629\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1595103\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "e6f370af9ae1a62c9cc95afde0210fe63ffe2346",
      "tree": "8799c751e3c9ee5e8684a7d525241a0e06c389e6",
      "parents": [
        "46ca7a39c3fddbdaef86c0befa0c0ae9630027ce"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:44: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": "Tue May 05 15:44:40 2026 -0700"
      },
      "message": "[rsproxy] insecure connections don\u0027t need credentials\n\nFix bug that was preventing simultaneous use of ResultStore and\nbuildminder.\n\nWhen rsproxy is configured with global credentials for using the real\nResultStore service, it was trying to reset them for JobStatus egress\nto buildminder, which typically runs an insecure connection.\n\nFix: filter out global credentials when a connection is configured\nas insecure.\n\nBug: 487240814\nChange-Id: I75342c36ac1f72c30a28146f54c8cd257df10b25\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1594674\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "46ca7a39c3fddbdaef86c0befa0c0ae9630027ce",
      "tree": "84170941f29e8b193227fd9d27ca170eceef19c7",
      "parents": [
        "8387d9f4f461fc764930c130959c3bf1e2fe253e"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:40: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": "Tue May 05 15:40:55 2026 -0700"
      },
      "message": "[buildminder] improve logging and flag forwarding\n\nEnhance observability of the buildminder application and its gRPC\nservice by adding structured log messages for lifecycle events\nand errors.\n\nChanges:\n- buildminder-wrap.sh: forward --log_dir and -v flags.\n- internal/pkg/buildminder/app.go: log start/end of Run.\n- internal/pkg/buildminder/service/service.go: log received status\n  updates and handling errors.\n\nBug: 487240814\nChange-Id: Iff63df31b440eba7f86b282bd3f726cf82f2e847\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1595102\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "8387d9f4f461fc764930c130959c3bf1e2fe253e",
      "tree": "9a1009adcaf2d6ffd905a0380527d85b12782fc0",
      "parents": [
        "d93da074210d51328d99cea8b565c384e56ee8bb"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:36: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": "Tue May 05 15:36:37 2026 -0700"
      },
      "message": "[buildminder] test with localhost:0\n\nTo avoid parallel test flakiness due to port collisions.\n\nChange-Id: Iada4a5e55d6f6b329369d4b876e001b6c68a1245\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1598433\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\n"
    },
    {
      "commit": "d93da074210d51328d99cea8b565c384e56ee8bb",
      "tree": "4990de2dcfdd6e21c99280f97a633eb68bc05a59",
      "parents": [
        "f7dd7bed9c2a4f6e682f50e4e2e42cf2004ef92a"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:36: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": "Tue May 05 15:36:32 2026 -0700"
      },
      "message": "[testing] implement universal test isolation shim\n\nAdds a mandatory init() shim (via internal/pkg/testsetup) to every Go\ntest in the project. This shim redirects glog and TMPDIR to Bazel\u0027s\nprivate TEST_TMPDIR, preventing parallel resource collisions and\nsilent Exit 2 crashes.\n\nInclusion is now enforced by scripts/check_test_setup_imports.sh,\nwhich is called automatically from scripts/precommit.sh.\n\nBug: 487240814\nChange-Id: I3745f1e43777ab5c2b3fe62eec40dce5491e69ee\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1599034\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nSLSA-Policy-Verified: SLSA Policy Verification Service \u003cdevtools-gerritcodereview-exitgate@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "f7dd7bed9c2a4f6e682f50e4e2e42cf2004ef92a",
      "tree": "556ecf9af8b44d2c96aa66ed1b9c11cf20d96ec8",
      "parents": [
        "dfcd9481d8f85ed260128245550c6c059cecb5ef"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:32: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": "Tue May 05 15:32:49 2026 -0700"
      },
      "message": "[buildminder] use TCP by default for integrated mode to avoid socket path limits\n\nDefaulting to TCP (localhost:0) instead of Unix sockets when an address\nis not provided in integrated mode. This bypasses the 104-character Unix\nsocket path limit which was frequently exceeded in deeply-nested Bazel\nsandbox environments. Also adds descriptive diagnostics in\nnetutil.ParseAddress to clearly surface path length issues to users and\ncomprehensive unit tests for address utility functions.\n\nBug: 487240814\nChange-Id: I111e9c4709ba3d8f497425fbc24ecdf3d2c69adb\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1599128\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "dfcd9481d8f85ed260128245550c6c059cecb5ef",
      "tree": "038da46361bbdf14f0e7551a38e6574741c2ff21",
      "parents": [
        "5f942e469bffd160e9ff481ffc0f05913130fe3d"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:28: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": "Tue May 05 15:28:33 2026 -0700"
      },
      "message": "[fifo] implement atomic, race-free FIFO path reservation\n\nReplaces the vulnerable \u0027reserve-then-remove\u0027 pattern with a robust\nAtomicMkfifo loop that incorporates PIDs and randomized suffixes. This\nensures that FIFO creation is truly atomic and collision-proof, even in\nnon-sandboxed or leaky environments.\n\nBug: 487240814\nChange-Id: I7a94d92415510b14498cc911e7b35469d8af9bec\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1598527\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Oliver Newman \u003colivernewman@google.com\u003e\n"
    },
    {
      "commit": "5f942e469bffd160e9ff481ffc0f05913130fe3d",
      "tree": "f142de9bb99cfbdd38d26a7400243a6ebf445ab7",
      "parents": [
        "a1530a06a75295bd31ba7fd83b61c1e23cfc9fa9"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Tue May 05 15:28: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": "Tue May 05 15:28:29 2026 -0700"
      },
      "message": "[bazel] enable private tmpfs for test sandbox isolation\n\nProvides absolute filesystem isolation for /tmp in every test run,\npreventing parallel collisions on shared resources like glog files or\nUnix sockets.\n\nBug: 487240814\nChange-Id: Id9a0e85ab354ad02f26fb8fddc50e626118ec42e\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1598686\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "a1530a06a75295bd31ba7fd83b61c1e23cfc9fa9",
      "tree": "aefb0094efc0c95d4b1eaa644f643908590f968c",
      "parents": [
        "2246a75cb3b94fe583009cba357939e2431de599"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Thu Apr 30 10:50: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": "Thu Apr 30 10:50:34 2026 -0700"
      },
      "message": "[rsproxy] fix project name\n\nThis was causing fatal errors using the real ResultStore service.\nThese manifested as Internal errors that exhausted retry.\n\nResultStore needs only the short project ID.\n\nBug: 487240814\nBug: 473907403\nChange-Id: I55fd93591f4068182c51b3912c4bf7ebc9d9c677\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1594533\nReviewed-by: Aidan Wolter \u003cawolter@google.com\u003e\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": "2246a75cb3b94fe583009cba357939e2431de599",
      "tree": "02953981296dc124e3da0fafa671dad3c5289a02",
      "parents": [
        "1e5c8669b66847045664b2a0ba138a9fac4427cc"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 29 16:47:11 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 Apr 29 16:47:11 2026 -0700"
      },
      "message": "[jobstatus] synthesize CANCELLED status if needed\n\nJust like we did for ResultStore, automatically synthesize\na cancelled invocation status if the input stream ends without\nexplicit terminal event (e.g. if ninja gets terminated).\n\nFor ResultStore, move finalization logic to rsmsg.\n\nBug: 487240814\nChange-Id: Ib72c8a7611bc4ad0c5425f391f9c0c1239a5d61f\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1581696\nReviewed-by: David Turner \u003cdigit@google.com\u003e\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\n"
    },
    {
      "commit": "1e5c8669b66847045664b2a0ba138a9fac4427cc",
      "tree": "e6d6d2ad633d9cde1c2b8ee62337113a2cfe7223",
      "parents": [
        "c8ca68b5d271f52c6b0df0b0f1fcf03f085ba863"
      ],
      "author": {
        "name": "David Fang",
        "email": "fangism@google.com",
        "time": "Wed Apr 29 16:44: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 Apr 29 16:44:37 2026 -0700"
      },
      "message": "[rsproxy] overhaul integration main_test framework\n\nmain_test.go: use StreamIngressOptions.SetFIFO over setting\nindividual fields (which is more error-prone).\n\nNo functional change.\n\nBug: 487240814\nBug: 473907403\nChange-Id: Iaf77894e44429de2871a349c78edfc15735ab70a\nReviewed-on: https://fuchsia-review.googlesource.com/c/rsclient/+/1590190\nCommit-Queue: David Fang \u003cfangism@google.com\u003e\nReviewed-by: Aaron Wood \u003caaronwood@google.com\u003e\n"
    }
  ],
  "next": "c8ca68b5d271f52c6b0df0b0f1fcf03f085ba863"
}
