)]}'
{
  "log": [
    {
      "commit": "4d4d42843b7154ede87a6cead454ccf8410baea8",
      "tree": "6c70b4f3da98a0a79343749a14f61212416495f1",
      "parents": [
        "18b5908944db6019205adbee73f42782cb571bd4"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Oct 14 17:40:44 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 17:40:44 2026"
      },
      "message": "xdsclient: update xdslbregistry\u0027s API to support A119 (#9510)\n\nThis PR implements the changes mentioned in\nhttps://github.com/easwars/proposal/blob/slicer/A119-autosharding-lb-policy.md#changes-to-xds-lb-policy-registry\n\nI\u0027ve gone with a slightly modified API than the one suggested in the\ngRFC since it made more sense for the converters to return a map of\nGrpcServices than for the resource decoder to allocate the map.\n\nAlso note https://github.com/grpc/grpc-go/issues/9509.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "18b5908944db6019205adbee73f42782cb571bd4",
      "tree": "eec06973a69788a839c4dd4ad1259545a20b1848",
      "parents": [
        "215d0ea53d432718f78ee4f1a6d553f1eb8f21c0"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Wed Oct 14 09:58:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 09:58:25 2026"
      },
      "message": "extproc: reject invalid server flow control window increments (#9388)\n\nrecvFromProcServerLoop applies a ServerWindowUpdate from the external\nprocessor by adding its window_increment value straight into the\nper-direction int64 flow control counters, which start at the 64KiB\ndefault. The increment is an int64 the processing server controls, so a\nvalue near math.MaxInt64 wraps the window negative and leaves it there\nfor good; acquireDownstreamToSidestreamWindow and its upstream sibling\nthen keep blocking and the RPC\u0027s body forwarding through the processor\nstalls.\n\nRoute both increments through applyServerWindowUpdate, which rejects an\nincrement that would wrap the int64 window in either direction, failing\nthe proc stream instead of corrupting the accounting. Negative\nincrements are allowed, per the spec, and simply shrink the window;\nsenders block until later updates bring it back above zero. The check\nsits next to the window because this recv loop is the only place a\nserver-supplied increment is applied.\n\nRELEASE NOTES:\n* xds: reject flow control window updates from an ext_proc server that\nwould overflow the window"
    },
    {
      "commit": "215d0ea53d432718f78ee4f1a6d553f1eb8f21c0",
      "tree": "d5e6b2b89ab237ebec7b648c675fd93e9e4a19e9",
      "parents": [
        "6b95ef1231bf5124069f9a006bd3bb4e42da61df"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Wed Oct 14 08:21:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 08:21:22 2026"
      },
      "message": "internal/serviceconfig: reject misplaced signs when parsing durations (#9454)\n\n`Duration.UnmarshalJSON` parsed both the whole and fractional parts of a\nduration string with `strconv.ParseInt`, which accepts its own leading\nsign. Because the leading `-` had already been stripped, signs in other\npositions were accepted and produced wrong values instead of an error:\n| Input      | Before   | After |\n|------------|----------|-------|\n| `\"1.+5s\"`  | 1.05s    | error |\n| `\"1.-5s\"`  | 950ms    | error |\n| `\"-1.-5s\"` | -950ms   | error |\n| `\".-5s\"`   | -50ms    | error |\n| `\"--1s\"`   | 1s       | error |\n| `\"-+1s\"`   | -1s      | error |\n\nThis change strips a single optional leading sign (`-` or `+`) and then\nparses both parts with `strconv.ParseUint`, so any further sign is\nrejected. This matches the protojson parser\n(`google.golang.org/protobuf/encoding/protojson`), which also allows\nonly one leading sign. A leading `+` (e.g. `\"+1s\"`) was already accepted\nand still is.\n\nEvery input that is now rejected used to parse to a wrong value, so\nvalid durations are not affected.\n\nRELEASE NOTES:\n* client: Reject service config duration strings with a sign anywhere\nother than the leading position (e.g. `\"1.-5s\"`, `\"--1s\"`)."
    },
    {
      "commit": "6b95ef1231bf5124069f9a006bd3bb4e42da61df",
      "tree": "0f8221ca3bd9b6d9d2147fbaffd60d5449540929",
      "parents": [
        "5ff04b66ea52b067fab16c735f330f6c2528c53a"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Oct 14 06:51:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 06:51:56 2026"
      },
      "message": "autosharding: handle slices from sharding server with no endpoints (#9511)\n\nThis PR handles\nhttps://github.com/easwars/proposal/blob/slicer/A119-autosharding-lb-policy.md#handling-slices-with-no-endpoints.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "5ff04b66ea52b067fab16c735f330f6c2528c53a",
      "tree": "f5371e4032ab73bb4a308fd93076e0a9ebee75d9",
      "parents": [
        "28f871cd3e9c02095d1eab97d2231ae1437a6b90"
      ],
      "author": {
        "name": "Elric",
        "email": "tbnsok40@gmail.com",
        "time": "Tue Oct 13 06:45:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 06:45:06 2026"
      },
      "message": "xdsclient: test all client metric units (#9494)\n\nFollow-up to #9476, as requested in [review\ncomment](https://github.com/grpc/grpc-go/pull/9476#discussion_r4192034135).\n\n\nRELEASE NOTES: n/a"
    },
    {
      "commit": "28f871cd3e9c02095d1eab97d2231ae1437a6b90",
      "tree": "1d82c384185b04d9153ef7a01fd839b169f5b387",
      "parents": [
        "ca742c175d4189709be0322839f98544150ea71f"
      ],
      "author": {
        "name": "Richard Ragusski",
        "email": "richard.ragusski@gmail.com",
        "time": "Tue Oct 13 06:24:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 06:24:29 2026"
      },
      "message": "examples: fix division by zero in custom load balancer (#9489)\n\nSetting `chooseSecond: 0` is\n[documented](https://github.com/grpc/grpc-go/blob/39ebc82c352a3302c3d7f748b4359e26689d9187/examples/features/customloadbalancer/client/customroundrobin/customroundrobin.go#L45)\nas never selecting the second SubConn, but currently it causes a\ndivide-by-zero panic once both children are ready. Fix is to check\n`chooseSecond` before evaluating the remainder.\n\nRELEASE NOTES: n/a"
    },
    {
      "commit": "ca742c175d4189709be0322839f98544150ea71f",
      "tree": "6f89684ada622e204ae191a19750391d7471752d",
      "parents": [
        "de20bed5c0557256824b14b7ef9ac860c81a0863"
      ],
      "author": {
        "name": "Roshan Singh",
        "email": "35294369+lopster568@users.noreply.github.com",
        "time": "Tue Oct 13 06:19:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 06:19:37 2026"
      },
      "message": "balancer/ringhash: fix flaky TestRingHash_RequestHashKeyConnecting (#9329)\n\nFixes #9030\n\n`TestRingHash_RequestHashKeyConnecting` counts connection attempts in\nthe same loop that resumes the blocked one, so it can count an attempt\nthat its own `Resume()` caused. Resuming makes the endpoint READY,\nring_hash publishes a\npicker with `hasEndpointInConnectingState` false, and the queued RPCs\npick again and start a connection to one idle endpoint along the ring\nwalk, which is what gRFC A76 asks for (picker.go:93-115). If the loop is\nstill scanning when that\ndial reaches the blocking dialer it counts that attempt and the test\nfails. Both failures linked from the issue show the second subchannel\nbeing created after the resume, never before it.\n\nThe fix orders the phase so the assertion cannot observe something the\ntest itself caused:\n\n1. First RPC in a goroutine, wait for a hold to be entered.\n2. Count all 20 holds, want exactly 1.\n3. Second RPC on the test goroutine, short deadline,\n`WaitForReady(true)`, want `DeadlineExceeded`.\n4. Count all 20 holds again, want exactly 1.\n5. Only then resume the single started hold.\n\nBoth counts precede any `Resume()`. Only two pickers can exist before\nthat point and a pick against either cannot start a second connection\nattempt, so `at most 1` is tightened to `exactly 1` and the fixed 10ms\nsleep is removed. I proved this\nwith a throwaway instrument that forces the CI interleaving\ndeterministically (current loop fails 100 of 100, this change 0 of 100),\nand also reproduced the flake organically under core pinning (current 2\nof 300, this change 0 of 2000).\nThe CI log ordering, the picker state argument and the full numbers are\nin the first comment.\n\nRELEASE NOTES: n/a"
    },
    {
      "commit": "de20bed5c0557256824b14b7ef9ac860c81a0863",
      "tree": "83855a54c67d9430190e536793efbc5e2841add3",
      "parents": [
        "9470552765e069d8bbdac5a3de39600778f9347e"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Mon Oct 12 19:03:23 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 19:03:23 2026"
      },
      "message": "autosharding: AutoshardingClient implementation (#9484)\n\nThis PR is a follow-up from https://github.com/grpc/grpc-go/pull/9479\nand uses the scaffolding for the autosharding client defined in there.\n\nApart from the implementation of the autosharding client, this PR also\ncontains the following:\n- `*.pb.go` files for autosharding.proto\n- Changes to regenerate.sh to generate the above\n- A dependency on google.golang.org/genproto/googleapis/api since the\nautosharding proto uses the `google.api.field_behavior` annotation\n- Allow the autosharding proto to be imported twice (by adding to an\nallowlist in vet.sh), once for messages and once for services\n\nRELEASE NOTES: none"
    },
    {
      "commit": "9470552765e069d8bbdac5a3de39600778f9347e",
      "tree": "ce34b51bea2eca1f72d79238e6376aa8dd97eaec",
      "parents": [
        "cf7e941719766922d0222f65ef91841bfe0eed14"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Mon Oct 12 18:47:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 18:47:06 2026"
      },
      "message": "autosharding: core balancer implementation (#9479)\n\nThis PR contains most of the balancer implementation. It does not\ncontain the implementation of the autoshardingClient that will actually\ntalk to the sharding service to fetch assignments. But it makes it\npossible to test the balancer functionality by stubbing out the\nautoshardingClient.\n\nSubsequent PRs will address autoshardingClient implementation and xDS\nintegration.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "cf7e941719766922d0222f65ef91841bfe0eed14",
      "tree": "28e660264941a3cac2cbe7c7810c5d29128c98d6",
      "parents": [
        "8c59ee6356bf92d0a5819b0cdbd3118876783028"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Mon Oct 12 18:00:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 18:00:00 2026"
      },
      "message": "internal/xds: rename ChannelCreds to ChannelCredsConfig as per TODO (#9498)\n\nThis is prep work for some of the autosharding xDS changes that will\nfollow.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "8c59ee6356bf92d0a5819b0cdbd3118876783028",
      "tree": "2f9a7bc95d64267be408254d213b36422ffc8e9b",
      "parents": [
        "5f1ccf56ea5ec964bbf447a10b561214f86387a6"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Sat Oct 10 09:41:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 09:41:07 2026"
      },
      "message": "gcpauthn: change the directory name to match the package name (#9491)\n\nThis PR changes the directory name to match the package name since that\nis what copybara assumes and is also go\n[convention](https://go.dev/doc/effective_go#package-names)\n\nRELEASE NOTES:\n- gcpauth: the directory name has ben changed to `gcpauthn` from\n`gcp_authn` to match the package name"
    },
    {
      "commit": "5f1ccf56ea5ec964bbf447a10b561214f86387a6",
      "tree": "a3ad653297541df3c0c403c5150c180a318ca38a",
      "parents": [
        "39ebc82c352a3302c3d7f748b4359e26689d9187"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Oct 09 06:21:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 06:21:36 2026"
      },
      "message": "*:update the x/net package dependency (#9492)\n\nRELEASE NOTES: None"
    },
    {
      "commit": "39ebc82c352a3302c3d7f748b4359e26689d9187",
      "tree": "6dd2f8c7812d102cba027d49e1d46530ce315a94",
      "parents": [
        "6c0c296ea81d7215176b35921fbeb90e2928ba94"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Thu Oct 08 10:03:58 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 10:03:58 2026"
      },
      "message": "transport: replace linked list with ring buffer (#9444)\n\nThis PR replaces the linked list used to store `controlbuf` items and\nqueued data frames for each stream with a deque backed by a ring buffer\n(inspired by [gammazero/deque](https://github.com/gammazero/deque)).\n\nThe ring buffer is cache-friendly and dynamically grows or shrinks to\namortize allocations and avoid pinning memory. Unary benchmarks\ndemonstrate a 10-15% improvement in QPS.\n\n## Benchmarks\nUnary 1 byte payloads\n```\nunary-networkMode_Local-bufConn_true-keepalive_false-benchTime_1m0s-trace_false-latency_0s-kbps_0-MTU_0-maxConcurrentCalls_100-reqSize_1B-respS\nize_1B-compressor_off-channelz_false-preloader_false-clientReadBufferSize_-1-clientWriteBufferSize_-1-serverReadBufferSize_-1-serverWriteBuffer\nSize_-1-sleepBetweenRPCs_0s-connections_1-recvBufferPool_simple-sharedWriteBuffer_true\n               Title       Before        After Percentage\n            TotalOps      9527821     11051923    16.00%\n             SendOps            0            0      NaN%\n             RecvOps            0            0      NaN%\n            Bytes/op      9259.21      9429.86     1.84%\n           Allocs/op       141.00       141.01     0.71%\n             ReqT/op   1270376.13   1473589.73    16.00%\n            RespT/op   1270376.13   1473589.73    16.00%\n            50th-Lat    563.834µs    493.905µs   -12.40%\n            90th-Lat    846.752µs     661.85µs   -21.84%\n            99th-Lat    1.56603ms   1.397267ms   -10.78%\n             Avg-Lat    629.086µs    541.744µs   -13.88%\n           GoVersion     go1.26.6     go1.26.6\n         GrpcVersion   1.86.0-dev   1.86.0-dev\n```\n\nUnary 1 KB\n```\nunary-networkMode_Local-bufConn_true-keepalive_false-benchTime_1m0s-trace_false-latency_0s-kbps_0-MTU_0-maxConcurrentCalls_120-reqSize_1024B-re\nspSize_1024B-compressor_off-channelz_false-preloader_false-clientReadBufferSize_-1-clientWriteBufferSize_-1-serverReadBufferSize_-1-serverWrite\nBufferSize_-1-sleepBetweenRPCs_0s-connections_1-recvBufferPool_simple-sharedWriteBuffer_true\n               Title       Before        After Percentage\n            TotalOps      6771768      7359035     8.67%\n             SendOps            0            0      NaN%\n             RecvOps            0            0      NaN%\n            Bytes/op     13180.98     13491.29     2.36%\n           Allocs/op       131.28       131.33     0.00%\n             ReqT/op 924572057.60 1004753578.67     8.67%\n            RespT/op 924572057.60 1004753578.67     8.67%\n            50th-Lat    988.646µs     911.04µs    -7.85%\n            90th-Lat   1.516118ms    1.38996ms    -8.32%\n            99th-Lat   2.375849ms   2.155515ms    -9.27%\n             Avg-Lat   1.062525ms    977.574µs    -8.00%\n           GoVersion     go1.26.6     go1.26.6\n         GrpcVersion   1.86.0-dev   1.86.0-dev\n```\n\nStreaming 1KB payloads\n```\nstreaming-networkMode_Local-bufConn_true-keepalive_false-benchTime_1m0s-trace_false-latency_0s-kbps_0-MTU_0-maxConcurrentCalls_120-reqSize_1024\nB-respSize_1024B-compressor_off-channelz_false-preloader_false-clientReadBufferSize_-1-clientWriteBufferSize_-1-serverReadBufferSize_-1-serverW\nriteBufferSize_-1-sleepBetweenRPCs_0s-connections_1-recvBufferPool_simple-sharedWriteBuffer_true\n               Title       Before        After Percentage\n            TotalOps     19635542     20592212     4.87%\n             SendOps            0            0      NaN%\n             RecvOps            0            0      NaN%\n            Bytes/op      4972.37      4987.34     0.30%\n           Allocs/op        19.40        19.38     0.00%\n             ReqT/op 2680906001.07 2811523345.07     4.87%\n            RespT/op 2680906001.07 2811523345.07     4.87%\n            50th-Lat    351.902µs    336.048µs    -4.51%\n            90th-Lat    489.036µs    472.488µs    -3.38%\n            99th-Lat   1.196465ms   1.149333ms    -3.94%\n             Avg-Lat    365.347µs    348.595µs    -4.59%\n           GoVersion     go1.26.6     go1.26.6\n         GrpcVersion   1.86.0-dev   1.86.0-dev\n```\n\nRELEASE NOTES:\n* transport: replace linked list with ring buffer for better\nperformance."
    },
    {
      "commit": "6c0c296ea81d7215176b35921fbeb90e2928ba94",
      "tree": "f89a4f46a107139349a71ccb6a112d6bc1d2c485",
      "parents": [
        "c6db9d29163564f4cc14febd3616b671378fc8a9"
      ],
      "author": {
        "name": "Elric",
        "email": "tbnsok40@gmail.com",
        "time": "Tue Oct 06 06:10:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 06:10:42 2026"
      },
      "message": "xds/xdsclient: use standard unit for connected metric (#9476)\n\n- Fixes #9461\n\n### problem\n- The `grpc.xds_client.connected` metric used `{connected}` instead of\nthe standard `{bool}` unit defined by gRFC A78. Updated the unit and\nadded a test to prevent recurrence.\n\n### solution\n- Change the unit of `grpc.xds_client.connected` from `{connected}` to\n`{bool}` to match gRFC A78. The metric name, values (0/1), and labels\nremain unchanged.\n\nRELEASE NOTES: \n- TODO"
    },
    {
      "commit": "c6db9d29163564f4cc14febd3616b671378fc8a9",
      "tree": "f8093f872f375528c310c4660ff073541a2dce6c",
      "parents": [
        "c1e600d02a6d4a5109fe97c5ed38717604748584"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Oct 06 04:14:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 04:14:07 2026"
      },
      "message": "xds: import gcp_authn filter in xds (#9471)\n\nThis PR adds a blank import for the gcp_authn http filter in the xds\npackage to register and enable the use of gcp_authn filter.\n\nRELEASE NOTES: None"
    },
    {
      "commit": "c1e600d02a6d4a5109fe97c5ed38717604748584",
      "tree": "b0a167b8cd74485934a3fc097b6b9b5b9ac4f9b3",
      "parents": [
        "de4775bffabedc6674c131d88212a510c32e1ab1"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Mon Oct 05 16:50:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 16:50:42 2026"
      },
      "message": "xds: fix uint32 overflow scaling rds route runtime_fraction (#9308)\n\nroutesProtoToSlice scales a route\u0027s runtime_fraction to\nparts-per-million by multiplying the numerator by 10000 (HUNDRED) or 100\n(TEN_THOUSAND) in uint32. The numerator comes from the control plane, so\na value like 429497 with a HUNDRED denominator computes 429497*10000 and\nwraps around to 2704. A route meant to match every request then matches\nroughly 0.27% of them, and the rest silently fall through to a different\nroute action.\n\nPer review feedback, fractional percent handling is now centralized in a\nnew xdsresource.FractionalPercent type. NewFractionalPercent converts\nthe proto, computes the parts-per-million value in uint64, caps it at\n1000000 (100%), and rejects unsupported denominators. The five places\nthat parsed the proto themselves now use it:\n- the rds runtime_fraction path stores the precomputed PPM (fixing the\noverflow above)\n- the eds drop policy parser stores a FractionalPercent in\nOverloadDropConfig\n- clusterimpl reads the PPM directly, replacing its local\ndropRequestsPerMillion\n- the fault filter\u0027s splitPct delegates to it (with a TODO to move\nvalidation to config parsing time)\n- ext_authz\u0027s parseFilterEnabled delegates to it, replacing the\npackage-local fraction type\n\nRELEASE NOTES:\n* xds: fix a uint32 overflow when scaling a route runtime_fraction that\ncould make a route match far fewer RPCs than configured, and centralize\nFractionalPercent parsing. A route runtime_fraction or an ext_authz\nfilter_enabled with an unrecognized denominator now causes the resource\nto be NACKed.\n\n---------\n\nCo-authored-by: Easwar Swaminathan \u003ceaswars@google.com\u003e"
    },
    {
      "commit": "de4775bffabedc6674c131d88212a510c32e1ab1",
      "tree": "fb9624a2cb6460ad704d1b79e51e47081a9ae506",
      "parents": [
        "29e9293548ed6e95d593e7ce4403176548c13e77"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Oct 01 17:50:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 17:50:33 2026"
      },
      "message": "autosharding: move some types into an internal package (#9466)\n\nThe newly introduced `sharding` package will be the one that will\ncontain the implementation of the `AutoshardingClient` eventually. This\nis required to ensure that balancer tests can be in a test only package\nand the `AutoshardingClient` can then be stubbed out.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "29e9293548ed6e95d593e7ce4403176548c13e77",
      "tree": "1dceeb50ea1a238be8174c8485282102188ea364",
      "parents": [
        "fa97e73d191aa30e7df5777e66ee242b8bc3067f"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Oct 01 17:50:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 17:50:10 2026"
      },
      "message": "autosharding: export the type that represents the LB config (#9468)\n\nA lot of existing LB policies export the type used to represent the LB\nconfig. This makes it easier to test from other packages.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "fa97e73d191aa30e7df5777e66ee242b8bc3067f",
      "tree": "dd389815b0f53d1612c8c4e0ded090a0f433dcd5",
      "parents": [
        "a7bda149b1e2d43ae00750e6e71c5f7855cf53a2"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Oct 01 17:49:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 17:49:43 2026"
      },
      "message": "experimental: support setting locality attribute on resolver state (#9469)\n\nThe functionality to read the locality label is required by the\nautosharding LB policy as well. Moving this to the experimental package\nalso means that `weightedroundrobin` no longer has to take a dependency\non `weightedtarget`.\n\nI ended up moving this to experimental instead of to an internal package\nto have the ability for someone to use the autosharding LB policy in a\nnon-xDS deployment and still use a locality label to perform string\nsubstitution on the autosharding_target.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "a7bda149b1e2d43ae00750e6e71c5f7855cf53a2",
      "tree": "f7fa79189c2e1eed230014f70ef3db16370e7c73",
      "parents": [
        "8056f79e87e474c169e43bdca87ede5bd15e4898"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Thu Oct 01 15:21:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 15:21:01 2026"
      },
      "message": "*: update dependencies for all modules (#9441)\n\nThis pr updates the dependencies for all modules. \nThis PR also changes the usages of `%q` with integers to `%d` since\nusage of `%q` with int has been disallowed and flagged since go 1.26 :\nhttps://github.com/golang/tools/commit/5be823e8041a7591b59c4f200bf05de958704df7\n\nThis also changes the usages of functions and fields of `x/net/http2`\npackage deprecated in v1.59.0 :\nhttps://pkg.go.dev/golang.org/x/net@v0.59.0/http2\n\nRELEASE NOTES:\n- Minimum supported Go version is now 1.26.\n\n---------\n\nCo-authored-by: gemini-code-assist[bot] \u003c176961590+gemini-code-assist[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8056f79e87e474c169e43bdca87ede5bd15e4898",
      "tree": "bb4a1f4dee7d23bf40cdf781fc900bdc68dd4ac1",
      "parents": [
        "acea4e37da079d802b77e414ce98f4a3a670a4bd"
      ],
      "author": {
        "name": "陈志谦",
        "email": "89645338+simpleqt@users.noreply.github.com",
        "time": "Thu Oct 01 06:34:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 06:34:36 2026"
      },
      "message": "ci: bump lock-threads to v6 to fix daily lock workflow failures (#9439)"
    },
    {
      "commit": "acea4e37da079d802b77e414ce98f4a3a670a4bd",
      "tree": "a632caf25ad4b3cedf556fabdd5d844de79488b5",
      "parents": [
        "abe0c506f15de689b36b9ef7c448b0edfcdd1c0d"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Oct 01 06:20:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 06:20:54 2026"
      },
      "message": "ringhash: add failing iteration to test error message (#9449)"
    },
    {
      "commit": "abe0c506f15de689b36b9ef7c448b0edfcdd1c0d",
      "tree": "dd4bb07238d6e3dd90319852fc2f86c7c0e4d29c",
      "parents": [
        "5f28b1dddd9a7b05f3f0ed80a530f3c0064659b0"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Sep 30 17:50:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 17:50:34 2026"
      },
      "message": "grpc: add support for Channel Factory, as per A119 (#9448)\n\nSee section titled \"Creating a gRPC Channel to the Autosharding Service\"\nin https://github.com/grpc/proposal/pull/551.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "5f28b1dddd9a7b05f3f0ed80a530f3c0064659b0",
      "tree": "4c251aa1fff4dd38fd641b3d6c0d5e9cded6ac58",
      "parents": [
        "d3d21edb881ae2cee8a4e0d6b25a2145b6a6d8b6"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Sep 30 17:39:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 17:39:31 2026"
      },
      "message": "autosharding: implement the picker (#9428)\n\nRELEASE NOTES: none"
    },
    {
      "commit": "d3d21edb881ae2cee8a4e0d6b25a2145b6a6d8b6",
      "tree": "95677da8ece27f701b295d6579514e0d0183f559",
      "parents": [
        "bf88ff49926161e718fcbd0640aa15263934d7bd"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Tue Sep 29 05:45:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 05:45:25 2026"
      },
      "message": "grpc: apply the config selector only after the LB policy is updated (#9442)\n\nPer [gRFC\nA31](https://github.com/grpc/proposal/blob/master/A31-xds-timeout-support-and-config-selector.md#implementation-for-xds-routeaction-support:~:text\u003dWhen%20new%20clusters,INTERNAL%20status%20code.),\nthe channel must update its LB policy before applying a new config\nselector, and the LB policy must synchronously provide a new picker\nbefore its update method returns. This ordering guarantees that a config\nselector never routes an RPC to a cluster unknown to the current picker.\n\nThis PR updates the channel to apply the config selector only after\n`updateClientConnState` returns. Because `updateClientConnState` blocks\nuntil the LB policy finishes processing the state update—and\n`xds_cluster_manager` produces its new picker before returning—the new\npicker is guaranteed to be in place first.\n\nThe config selector is then applied while holding `cc.mu`, and the\nupdate is skipped if the channel closed or entered idle mode while the\nlock was released. This preserves two invariants:\n- The selector reset in `Close()` remains the final write.\n- A stale update cannot overwrite the selector installed by a new\nresolver after the channel exits idle mode.\n\nConsistent with existing LB policy updates, this relies on the\n(undocumented) guarantee that resolvers do not invoke `UpdateState`\nconcurrently, as overlapping calls could still apply config selectors\nout of order.\n\nRELEASE NOTES: \n* xds: Fix a race where RPCs could fail with `UNAVAILABLE: unknown\ncluster selected for RPC` right after an xDS route configuration update\nstarted sending traffic to a new cluster."
    },
    {
      "commit": "bf88ff49926161e718fcbd0640aa15263934d7bd",
      "tree": "db99f27e2f3798d98cfaee9283b89436c37b1df2",
      "parents": [
        "acccf8cd101ae1eb33385f27e12740b3edd730f0"
      ],
      "author": {
        "name": "colinaumaty",
        "email": "colinaumaty@outlook.com",
        "time": "Mon Sep 28 10:49:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 10:49:45 2026"
      },
      "message": "opentelemetry: use strings.ReplaceAll in tracing (#9435)\n\nSigned-off-by: colinaumaty \u003ccolinaumaty@outlook.com\u003e"
    },
    {
      "commit": "acccf8cd101ae1eb33385f27e12740b3edd730f0",
      "tree": "efdb486167616765d062d84a88ea90349cd525e4",
      "parents": [
        "c0ef4986f448f9e975ab0283cf6cc1172e3c3b94"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Fri Sep 25 07:36:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 07:36:00 2026"
      },
      "message": "credentials/google: add utility to fetch ID tokens directly from Metadata Server. (#9385)"
    },
    {
      "commit": "c0ef4986f448f9e975ab0283cf6cc1172e3c3b94",
      "tree": "0473115d1d53cea33f6ace9b29ee8d3890cd3172",
      "parents": [
        "1a0d3c76f9fcc99e5c7b3440cd235ea46d819831"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Sep 24 23:15:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 23:15:46 2026"
      },
      "message": "transport: refine server controlBuf throttling items and increase limit to 10,000 (#9433)\n\nAddresses https://github.com/grpc/grpc-go/issues/9330\n\nThis PR contains the following changes:\n- Update `controlBuf` throttling on the server to only count items\nqueued in direct response to peer control or reset frames:\n  - An incoming SETTINGS frame that results in a SETTINGS ACK\n  - An incoming PING frame that results in a PING ACK\n- Rejecting incoming streams early due to a variety of error conditions\nwith a HEADERS frame (containing the status) and possibly a RST_STREAM\nframe\n- Rejecting or refusing streams for error conditions with a RST_STREAM\n(or when the client closes the stream)\n- Incoming WINDOW_UPDATE frames that could be used as part of a flood\nattack\n- Rename `cbItem.isThrottled()` back to `isTransportResponseFrame()` to\nreflect this distinction.\n- Increase the default\n`GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT` from 100 to 10,000\n(with a maximum of 100,000) so legitimate high-concurrency workloads do\nnot trigger server reader throttling while still bounding memory against\npeer initiated control frames and Rapid Reset floods.\n\nRELEASE NOTES:\n* transport: Refine server control buffer throttling to only count\npeer-induced control and reset frames, and increase the default\n`GRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT` from 100 to 10,000."
    },
    {
      "commit": "1a0d3c76f9fcc99e5c7b3440cd235ea46d819831",
      "tree": "4bd2fab6da33256b3eabd7d4c7b82c7c8fc57db8",
      "parents": [
        "f3ec8bba99346896c50ad109ba7d3bd3a5a39fec"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Sep 24 23:15:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 23:15:10 2026"
      },
      "message": "xds: handle RPC commit in the resolver\u0027s interceptorList (#9424)\n\nThis PR is part of a multi-PR change aimed to support call options like\nHeader, Trailer etc where the result can be mutated by an xDS HTTP\nfilter.\n\nThis PR specifically does the following:\n* Removes the `RPCConfig.OnCommitted` callback and the resulting xDS\nspecific code sprinkled in `stream.go`\n* Changes the xDS configSelector to add the `onCommit` callback as a\ncontext value, that is pulled out by the `interceptorList` and invoked\nwhen the commit is detected or the RPC completes\n* Implement the `ClientStream` interface in streams returned by the\n`interceptorList`. This wrapped stream contains the `onCommit` callback\nand invokes it at the appropriate time\n\nRELEASE NOTES: none"
    },
    {
      "commit": "f3ec8bba99346896c50ad109ba7d3bd3a5a39fec",
      "tree": "c139a7dc8bd754203f84892d4349dbb02b20f407",
      "parents": [
        "609c383fe92620f049092e6a00548219a14c44f2"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Thu Sep 24 21:07:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 21:07:15 2026"
      },
      "message": "xds: match virtual host domains case-insensitively (#9399)\n\nThe xDS virtual host matcher compared a RouteConfiguration domain\nagainst the request :authority with case-sensitive equality, prefix, and\nsuffix checks. Host names are case-insensitive and the :authority is\nchosen by the peer, so a mixed-case authority like FOO.BAR.COM never\nmatched a domain configured as foo.bar.com. On the server data plane the\nrequest then fell through to a broader domain such as \"*\", which can\ncarry weaker route or RBAC policy than the specific virtual host it\nshould have selected.\n\nThe domain matching logic was also duplicated between the xDS client\n(internal/xds/xdsclient/xdsresource/matcher.go) and the server\n(internal/xds/server/routing.go). This change consolidates it into a\nsingle exported xdsresource.FindBestMatchingVirtualHostIndex, which\nreturns the index of the best matching virtual host and folds the\nauthority to lower case once at entry. The xDS dependency manager uses\nthe index to pick the virtual host from the update. The server keeps the\nupdate\u0027s virtual hosts on usableRouteConfiguration alongside the\ninterceptor-carrying copies and indexes into those with the result, so\nthe per-RPC path does no allocation. Virtual host domains are folded to\nlower case once when the RouteConfiguration is unmarshaled, covering\nboth RDS and inline route configs from LDS, so the matcher itself no\nlonger touches case.\n\nRELEASE NOTES:\n* xds: match virtual host domains against the request authority\ncase-insensitively"
    },
    {
      "commit": "609c383fe92620f049092e6a00548219a14c44f2",
      "tree": "fbfb65ddf196c7ec98e204b8838d4074c5264ec1",
      "parents": [
        "784c8f2b54e847ab1cb5b58fd26f85560cb6f40b"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Thu Sep 24 20:51:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 20:51:17 2026"
      },
      "message": "balancer/ringhash: fix uint32 weight sum overflow in normalizeWeights (#9357)\n\n`normalizeWeights` sums endpoint weights into a `uint32`, so a total\nabove `math.MaxUint32` wraps and can land on zero. The `weight /\nweightSum` divide then yields `+Inf`, `newRing` sets `targetHashes` to\n`+Inf`, and its `for currentHashes \u003c targetHashes` loop never ends,\ngrowing the ring until the process is out of memory. Summing in `uint64`\ncannot wrap and stays non-zero, since every endpoint weight is at least\n1.\n\nRELEASE NOTES: \n- balancer/ringhash: Fix a bug where the sum of endpoint weights\nexceeding `math.MaxUint32` overflows by accumulating weights in a\nuint64."
    },
    {
      "commit": "784c8f2b54e847ab1cb5b58fd26f85560cb6f40b",
      "tree": "516aa82162dc8f92e4170364fce6a0ea55da492e",
      "parents": [
        "b6948c4b8d59be821d84b263b97f2ab05ab04aaa"
      ],
      "author": {
        "name": "Kartavya sonar",
        "email": "117206024+Kartavyasonar@users.noreply.github.com",
        "time": "Thu Sep 24 20:04:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 20:04:06 2026"
      },
      "message": "roundrobin: standardize and V(2)-gate log messages (#9419)\n\nBrings round_robin in line with the logging checklist from #5535 and the\nweightedroundrobin reference implementation (#8824).\n\nPart of #5535\n\nRELEASE NOTES: none\n\n---------\n\nSigned-off-by: Kartavyasonar \u003csonarkartavya@gmail.com\u003e"
    },
    {
      "commit": "b6948c4b8d59be821d84b263b97f2ab05ab04aaa",
      "tree": "dffcc50ff84d07083fdbd5509e29c22b8eb6c58d",
      "parents": [
        "1274845c21b3165ea1887675daadc0eacbda7224"
      ],
      "author": {
        "name": "Ran",
        "email": "ran-su@users.noreply.github.com",
        "time": "Thu Sep 24 20:02:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 20:02:27 2026"
      },
      "message": "xds: add internal accessor for the underlying gRPC server (#9422)\n\nAdd internal/xds/server.GetGRPCServer for integrations that require the\nconcrete *grpc.Server wrapped by xds.GRPCServer.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "1274845c21b3165ea1887675daadc0eacbda7224",
      "tree": "92a69c13b5fcecc1f0d676b57246a6e5f1c8af6d",
      "parents": [
        "55e0770cd84f22064680fec61b1758ef90079cd6"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Thu Sep 24 11:57:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 11:57:37 2026"
      },
      "message": "Change version to 1.86.0-dev (#9437)\n\nRELEASE NOTES: None"
    },
    {
      "commit": "55e0770cd84f22064680fec61b1758ef90079cd6",
      "tree": "7cdac973ce32bb14c09c735a4b3d2e000c45a9e3",
      "parents": [
        "1648161c2f6c1fbbaaa579e8320630abd4656bb3"
      ],
      "author": {
        "name": "Abhinav Kumar",
        "email": "abhinavkmr@google.com",
        "time": "Thu Sep 24 10:23:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 10:23:00 2026"
      },
      "message": "pemfile: Avoid redundant root certificate parsing and memory allocations when root cert file is unchanged (#9425)"
    },
    {
      "commit": "1648161c2f6c1fbbaaa579e8320630abd4656bb3",
      "tree": "12f406607ee6621229c9b136600a335a1544641b",
      "parents": [
        "1863b598b62e623f8d58305da7b068d8fee32d7b"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Sep 24 06:17:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 06:17:01 2026"
      },
      "message": "transport: stop read throttling due to controlBuf size, on the client (#9431)\n\nAddresses: https://github.com/grpc/grpc-go/issues/9330\n\nThere is no good reason to throttle reads on the client based on the\nnumber of items in the `controlBuf`.\n\nRELEASE NOTES:\n- transport: Stop throttling reads on the client based on the number of\nqueued control frames. Previously, this lead to a deadlock because the\nserver can also throttle reads, and when this happens, neither side can\nmake progress."
    },
    {
      "commit": "1863b598b62e623f8d58305da7b068d8fee32d7b",
      "tree": "693b99a1f06cea18729e713b814256042ef63862",
      "parents": [
        "d331f110832063845e0ec79482b338e86f195661"
      ],
      "author": {
        "name": "Jason Lunn",
        "email": "jason.lunn@gmail.com",
        "time": "Wed Sep 23 12:52:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 12:52:17 2026"
      },
      "message": "protoc-gen-go-grpc: Update supported Edition to 2026 (#9426)"
    },
    {
      "commit": "d331f110832063845e0ec79482b338e86f195661",
      "tree": "1278fe5ba9c08717d9ffd3379631bc9e8f9b3b11",
      "parents": [
        "d41d9b3a4dccfb454279bc39f4e1110d7769106d"
      ],
      "author": {
        "name": "Stan Hu",
        "email": "stanhu@gmail.com",
        "time": "Tue Sep 22 03:19:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 03:19:38 2026"
      },
      "message": "server: release mutex while waiting for handlers in stop() (#9394)\n\nFixes #9393\n\n`Stop()` deadlocks when called after `GracefulStop()` while a handler is\nstill running.\n\n#### Root cause\n\nBoth `Stop()` and `GracefulStop()` call `stop()`, which acquires `s.mu`\nand holds it for the entire function, including across\n`s.handlersWG.Wait()`. If a handler ignores context cancellation,\n`GracefulStop()` blocks in that wait while still holding `s.mu`. A\nconcurrent `Stop()` (the documented way to abort a `GracefulStop()` that\nis taking too long) then blocks forever on `s.mu.Lock()` and can never\nforce the server to shut down.\n\n#### Fix\n\nRelease `s.mu` around `s.handlersWG.Wait()` and reacquire it afterwards,\nmirroring the connection-drain loop that already releases the lock via\n`s.cv.Wait()`.\n\nThis is safe because none of the state guarded by `s.mu` is accessed\nduring the wait: by that point listeners are closed, all transports are\ndrained/closed, `s.conns` is `nil`, and the worker channel is closed.\n`handlersWG.Wait()` only touches the `WaitGroup`, which has its own\nsynchronization and was never guarded by `s.mu`. A concurrent `Stop()`\ncan now acquire the lock and return promptly.\n\n#### Testing\n\nAdded `TestStopAfterGracefulStopWithRunningHandler`, which starts a\nhandler that ignores context cancellation, closes the client connection\nso the transport drains, runs `GracefulStop()` in a goroutine, and\nasserts that a subsequent `Stop()` returns promptly. Verified the test\ntimes out (deadlocks) without the fix and passes with it.\n\n\n\nRELEASE NOTES:\n* server: fix deadlock where `Stop()` blocks indefinitely when called\nconcurrently with an in-progress `GracefulStop()` waiting on a handler\nthat does not return promptly"
    },
    {
      "commit": "d41d9b3a4dccfb454279bc39f4e1110d7769106d",
      "tree": "16fa36a54e314ed50a72658a3959ee088008acc4",
      "parents": [
        "059a3022db217da742d0689ebfcbaf9c6f4ed74d"
      ],
      "author": {
        "name": "Foster Lockwood",
        "email": "Foslock@gmail.com",
        "time": "Tue Sep 22 02:55:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 02:55:12 2026"
      },
      "message": "server: Remove service from updates if no streams remain [leakfix] (#9411)\n\n## The bug\n\n`health/server.go` (v1.73.0, lines 107-111):\n\n```go\ndefer func() {\n    [s.mu](http://s.mu/).Lock()\n    delete(s.updates[service], stream)\n    [s.mu](http://s.mu/).Unlock()\n}()\n```\nCurrently we accept a service name and unconditionally add it as a key\nto an in memory nested map (that is maintained for the lifetime of the\nprocess). Upon receiving an unauthenticated watch request, we\nimmediately add that hitherto unvalidated service name into the map.\nUpon disconnection, we remove the stream objects from the inner map, but\nfail to remove the keys from the outer map, leaving behind those\nunvalidated strings as keys in the outer map for the lifetime of the\nprocess..\n\nPotential impact:\nUnauthenticated users can leave behind very large strings that the\nprocess will maintain references to until the process restarts. The\nstrings can be up to 4 MiB in size per request, leading to very rapid\nmemory exhaustion of the service in the event of an attack from a\nmalicious actor.\n\n## Fix\n\nDelete the inner map when it empties, in the cleanup that already holds\nthe\nlock:\n\n```go\ndefer func() {\n    [s.mu](http://s.mu/).Lock()\n    delete(s.updates[service], stream)\n    if len(s.updates[service]) \u003d\u003d 0 {\n        delete(s.updates, service)\n    }\n    [s.mu](http://s.mu/).Unlock()\n}()\n```\n\nVerified against a patched v1.73.0: the same 200 cycles end at\n`services\u003d0`\nwith ~4 MiB of growth, down from 200 and 208.4 MiB.\n\nRELEASE NOTES:\n* `health/server.go`: Address resource leak, remove service entry in map\nwhen empty."
    },
    {
      "commit": "059a3022db217da742d0689ebfcbaf9c6f4ed74d",
      "tree": "0b42fb0854aa7b98c030ef9848eaf80e4c3b8643",
      "parents": [
        "9f639818165ad2fe91a8fb9c62b4ab403ea2b05f"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Mon Sep 21 06:26:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 06:26:57 2026"
      },
      "message": "xds/internal : Fix Connected metric test (#9181)"
    },
    {
      "commit": "9f639818165ad2fe91a8fb9c62b4ab403ea2b05f",
      "tree": "53fa9d05b55773561b2c467644da3e7324d23c7c",
      "parents": [
        "dd51b1c90aaf9b7ee0b07b1d14fa8e3a89132bef"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Sat Sep 19 15:04:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 19 15:04:47 2026"
      },
      "message": "transport: update maxStreamID on truncated HEADERS frame (#9414)"
    },
    {
      "commit": "dd51b1c90aaf9b7ee0b07b1d14fa8e3a89132bef",
      "tree": "5c7e88e8c0b773fe7549a90b8a5cb30c111ae158",
      "parents": [
        "4e49413dcab793ba19d466636d0535674928747a"
      ],
      "author": {
        "name": "Marcin Swierczek",
        "email": "mswierczek@google.com",
        "time": "Thu Sep 17 22:58:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 22:58:54 2026"
      },
      "message": "A75: Implement the new LB policy topology for the non-aggregate cluster (#9234)\n\nImplements\n[A75](https://github.com/grpc/proposal/blob/master/A75-xds-aggregate-cluster-behavior-fixes.md)\nfor the non-aggregate cluster.\n\nThis change implements the new LB policy topology for the non-aggregate\nclusters only, the aggregate cluster uses the legacy approach.\nRefactoring of the new topology for the aggregate cluster case will be\ndelivered in a follow-up PR. This change does not break non-aggregate to\naggregate (and vice versa) switch.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "4e49413dcab793ba19d466636d0535674928747a",
      "tree": "1b24cc70f82f798789b27def206c0629efe58df0",
      "parents": [
        "4335852005e0b3e3d08ae6afed30ef71307e6b6d"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Sep 15 18:39:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 18:39:14 2026"
      },
      "message": "authz: prevent cache poisoning on file watcher reload failures (#9413)"
    },
    {
      "commit": "4335852005e0b3e3d08ae6afed30ef71307e6b6d",
      "tree": "9b32fbaa4f4655f94f5de4910ac7b0bd148ef5c0",
      "parents": [
        "cd137b27ec86a6c21a8a6df71ca0cb22786f0e4b"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Sep 15 18:39:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 18:39:00 2026"
      },
      "message": "transport: fix data race on `bdpEstimator.sentAt`. (#9415)"
    },
    {
      "commit": "cd137b27ec86a6c21a8a6df71ca0cb22786f0e4b",
      "tree": "13a625fa0229370186aadee510b29c8b0a3295ab",
      "parents": [
        "40ef73b45d196b1fccae2c23a4f42a46635663b8"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Tue Sep 15 17:48:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 17:48:26 2026"
      },
      "message": "grpc: simplify invoke() by sharing code with streaming RPCs (#9417)\n\nThis PR is part of a multi-PR change aimed to support call options like\nHeader, Trailer etc where the result can be mutated by an xDS HTTP\nfilter.\n\nThis PR specifically does the following:\n- Gets rid of the `defaultStreamInterceptor` function and stops chaining\na default interceptor to all streaming RPCs\n- Instead it creates a `clientStreamWrapper` from `newClientStream` and\nthereby ensures that this functionality can be shared between unary and\nstreaming RPCs\n- Simplifies the implementation of `invoke()` in call.go\n\nNo tests are being added since no new functionality is being added and\nthis is simply a refactor.\n\nIn the following PR, I will add functionality to change the `after`\nmethod in the `CallOption` interface to work with `ClientStream` instead\nof `csAttempt`.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "40ef73b45d196b1fccae2c23a4f42a46635663b8",
      "tree": "e7937d60195ffc547885022452eb46a04b153d02",
      "parents": [
        "e4711283ae08b8ec0fb7378c0ff58a130c366bcd"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Sep 15 13:51:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 13:51:51 2026"
      },
      "message": "binarylog: omit the \"authorization\" header from logged metadata (#9412)"
    },
    {
      "commit": "e4711283ae08b8ec0fb7378c0ff58a130c366bcd",
      "tree": "4e2b4e9170493c8ea298e2e614c024707486d466",
      "parents": [
        "3b0f7581196fcc9f1ac745040455d1e1627a652a"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Sep 11 07:33:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 07:33:00 2026"
      },
      "message": "transport : cancel ctx after swapping the state in server\u0027s cancelStream and finishStream (#9382)\n\nFixes: https://github.com/grpc/grpc-go/issues/5344\n\nRace condition :\nIn\n[http2Server.closeStream](https://github.com/grpc/grpc-go/blob/4793ad0474669eafbd5346c8a3d098fdfa542498/internal/transport/http2_server.go#L1355),\ns.cancel() was invoked before s.swapState(streamDone) and\n[deleteStream](https://github.com/grpc/grpc-go/blob/master/internal/transport/http2_server.go#L1310).\n\n\nFix :\nReordered operations in\n[http2Server.closeStream](https://github.com/grpc/grpc-go/blob/master/internal/transport/http2_server.go#L1355)\nso that s.cancel() is called after s.swapState(streamDone) and\nt.deleteStream(s, eosReceived).\n\nRELEASE NOTES: None"
    },
    {
      "commit": "3b0f7581196fcc9f1ac745040455d1e1627a652a",
      "tree": "3b238db0110f69026dd5f9389f5c2fdc716ec8e1",
      "parents": [
        "2fbc8839f646417cb39e4e58cfe3d94dec68ac38"
      ],
      "author": {
        "name": "Marcin Swierczek",
        "email": "mswierczek@google.com",
        "time": "Thu Sep 10 21:46:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 21:46:04 2026"
      },
      "message": "A75: Add missing E2E test cases for xDS aggregate cluster (#9278)\n\nAdd end-to-end test cases for xDS aggregate clusters:\n\n1. **LRS Load Reporting (`TestAggregateCluster_LRS`)**: Verifies that\nwhen an aggregate cluster (`Root -\u003e [PrimaryEDS, SecondaryEDS]`) has LRS\nenabled on both leaf clusters, load is initially reported only for the\nprimary cluster, and dynamically shifts to the secondary cluster upon\nprimary failover.\n2. **Telemetry Labels (`TestTelemetryLabels_AggregateCluster`)**:\nVerifies that CSM telemetry labels from CDS cluster metadata reflect the\nactive leaf cluster receiving traffic and switch to the secondary\ncluster\u0027s labels when failing over.\n\nThis PR is part of\n[A75](https://github.com/grpc/proposal/blob/master/A75-xds-aggregate-cluster-behavior-fixes.md)\nimplementation. However, these test cases work for both the legacy and\nnew LB policy tree.\n\nRELEASE NOTES: n/a\n\n---------\n\nCo-authored-by: Easwar Swaminathan \u003ceaswars@google.com\u003e"
    },
    {
      "commit": "2fbc8839f646417cb39e4e58cfe3d94dec68ac38",
      "tree": "222ab7ebd1aac731a5f35b3f0bc7799926c8a137",
      "parents": [
        "d2c52f09240164947994c73e544b697a878cee3c"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Sep 10 18:04:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 18:04:37 2026"
      },
      "message": "grpc: place defaultStreamInterceptor after user interceptors (#9404)\n\nThe `defaultStreamInterceptor` was introduced in #9226.\n\nThis change places the `defaultStreamInterceptor` which performs certain\ncommon logic for all non-unary RPCs to live after the user interceptors\nand before the xDS filters. This ensures that the work of the\n`defaultStreamInterceptor` stays invisible to the user interceptors.\nSpecifically, it calls `RecvMsg` twice for non server-streaming RPCs and\ncalls `CloseSend` after sending the only message for non\nclient-streaming RPCs.\n\nRELEASE NOTES: none\n\n---------\n\nCo-authored-by: eshitachandwani \u003cemchandwani@google.com\u003e"
    },
    {
      "commit": "d2c52f09240164947994c73e544b697a878cee3c",
      "tree": "c9ccf8092e15805194cf8a2a4efdc7ce3df7ce78",
      "parents": [
        "a9cbf17a2ad108cdaded0d1f37d35098733ee462"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Wed Sep 09 08:37:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 08:37:03 2026"
      },
      "message": "transport: fix server Recv hang on initial HEADERS with EndStream (#9391)\n\nFix server-side Recv hang when client sends HEADERS with EndStream set.\n\nWhen a client initiates a stream with a HEADERS frame that has\nEndStream\u003dtrue, the server-side stream state is set to streamReadDone,\nbut the reader was not notified. This caused server-side Recv() calls to\nhang indefinitely waiting for data.\n\nThis change writes an io.EOF error to the stream\u0027s receive buffer when\nthe stream is created with EndStream\u003dtrue, ensuring Recv() returns\nimmediately with io.EOF. A new transport test has been added to verify\nthis behavior, and existing tests have been updated.\n\nRELEASE NOTES:\n* transport: fix an issue where server-side `Recv()` hung indefinitely\nwhen a client initiated a stream with `HEADERS` having `EndStream` set."
    },
    {
      "commit": "a9cbf17a2ad108cdaded0d1f37d35098733ee462",
      "tree": "f0b6d0ffda0a9dabc98db7d31911953819e6d19b",
      "parents": [
        "c313caa31ab23e7b7604873fe5a138037a736976"
      ],
      "author": {
        "name": "Leonid Bugaev",
        "email": "leonsbox@gmail.com",
        "time": "Wed Sep 09 06:42:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 06:42:10 2026"
      },
      "message": "transport: return unexpected EOF for partial reads (#9204)\n\nFixes #9200\n\nTrack cumulative bytes read while filling a gRPC message header or body.\nIf EOF occurs after any partial progress, return `io.ErrUnexpectedEOF`\neven when the final read call itself returned zero bytes. Preserve plain\n`io.EOF` when EOF occurs before any data is read.\n\nRegression tests split partial headers and bodies from EOF across\nseparate receive-buffer messages. They verify that partial reads return\n`io.ErrUnexpectedEOF` while zero-progress reads retain `io.EOF`.\n\nRELEASE NOTES:\n* transport: Truncated gRPC message headers and bodies now return\n`io.ErrUnexpectedEOF` after partial data is received."
    },
    {
      "commit": "c313caa31ab23e7b7604873fe5a138037a736976",
      "tree": "5b388f994d688e8655c523cb5d85b72a9ffeba03",
      "parents": [
        "b17fe3740d95adbd2926c5857d234361ae5d8b32"
      ],
      "author": {
        "name": "Lazizbek Ergashev",
        "email": "lazerg2@gmail.com",
        "time": "Wed Sep 09 06:37:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 06:37:09 2026"
      },
      "message": "advancedtls: apply client defaults before version check (#9403)\n\nFixes #9402\n\nPrior to this change, creating an Options like\n\n    tlsOpts :\u003d \u0026advancedtls.Options{\nIdentityOptions:\nadvancedtls.IdentityCertificateOptions{IdentityProvider: certProvider},\n        // Note: Only MinTLSVersion is set, not MaxTLSVersion\n        MinTLSVersion: tls.VersionTLS13,\n    }\n\nand passing it to NewClientCreds fails with:\n\n    the minimum TLS version is larger than the maximum TLS version\n\nThe Options docs say MaxTLSVersion defaults to TLS 1.3, but on the\nclient side the default was applied after the MinTLSVersion \u003e\nMaxTLSVersion check, so an unset MaxTLSVersion was still zero at that\npoint. The defaults are now applied first, the same way #8684 fixed\nserverConfig.\n\nRELEASE NOTES:\n* advancedtls: Fix `NewClientCreds` failing with \"the minimum TLS\nversion is larger than the maximum TLS version\" when `MinTLSVersion` is\nset without `MaxTLSVersion`."
    },
    {
      "commit": "b17fe3740d95adbd2926c5857d234361ae5d8b32",
      "tree": "b854f974b63ccdb225d4288508b852be9d6e5150",
      "parents": [
        "5c58ceeebbbdc29766f884a7ec1f88ba39c0e0dd"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Sep 09 06:30:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 06:30:46 2026"
      },
      "message": "autosharding: implement the sliceMap (#9380)\n\nThis PR only contains the implementation of the `sliceMap`. My plan is\nto make a few small PRs initially with things that can be separated out,\nbefore a bigger PR that contains the rest of the implementation of the\nLB policy. The implementation of the `sliceMap` follows the spec very\nclosely, so should be reviewable even without the rest of the changes.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "5c58ceeebbbdc29766f884a7ec1f88ba39c0e0dd",
      "tree": "2275f9e2ff1a8df425c6efefc28efc6d7775fdc9",
      "parents": [
        "298389d61dd6f3071da1fa34d2fdf3f726d4aa36"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Tue Sep 08 08:52:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 08:52:08 2026"
      },
      "message": "grpc: remove unused callInfo field (#9397)\n\nRemove unused \"on RPC commit\" callbacks from `callInfo`. Callers of\n`OnFinish` call option type-assert and invoke the closure directly.\n\nRELEASE NOTES: N/A"
    },
    {
      "commit": "298389d61dd6f3071da1fa34d2fdf3f726d4aa36",
      "tree": "f5f25d24cbac9d76cc00eace413dd67edc7063ea",
      "parents": [
        "2cb3789fccf481c7126e3a62074ca2a4e66dbe96"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Sep 04 08:18:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 08:18:15 2026"
      },
      "message": "Revert \"grpc: change existing dial/server options that set initial window size to not disable BDP estimation\" (#9392)\n\nThis PR reverts #9078 \nSince #9078 had a behaviour change where the behaviour of dialOption\n`grpc.WIthInitialWindowSize` and `grpc.WithInitialConnWindowSize` and\nserver option `grpc.InitialWindowSize` and `grpc.InitialConnWIndowSize`\nchanged to enable bdp by default , it is breaking the internal users of\nthese options and blocking import. We will first change the callers\ninternally in g3 and then make this change.\n\nRELEASE NOTES: None"
    },
    {
      "commit": "2cb3789fccf481c7126e3a62074ca2a4e66dbe96",
      "tree": "6f285eb64f396ce705432ea3e78c7f7ea047f60e",
      "parents": [
        "9f8027448a64b6446d0c7256a1efe907b1cb6b1b"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Thu Sep 03 09:06:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 09:06:27 2026"
      },
      "message": "xds: add unified API for server-side HTTP filter interceptors. (#9351)"
    },
    {
      "commit": "9f8027448a64b6446d0c7256a1efe907b1cb6b1b",
      "tree": "28267abf4a82d04d574c1df4f113e77f68b1751f",
      "parents": [
        "91f43d64ba38fa25111f9198192baa93dadbb4fb"
      ],
      "author": {
        "name": "Madan kumar",
        "email": "winklemad@outlook.com",
        "time": "Tue Sep 01 07:00:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 07:00:07 2026"
      },
      "message": "xds: lowercase RDS route header matcher names before matching (#9353)\n\nFixes #9352\n\nxDS RDS route header matchers store the header name verbatim from the\nconfig in `routesProtoToSlice`:\n\n```go\nheader.Name \u003d h.GetName()\n```\n\nThe matcher engine looks that name up against `metadata.MD`, whose keys\nare always lowercase, so a matcher configured with a mixed-case name\nsuch as `X-Role` matches no header and the route never fires.\n\nThis is the last consumer of that matcher engine that does not normalize\nthe name. The RBAC HTTP filter started lowercasing it at parse time in\n#9332 (`normalizeHeaderMatcher`), and `authz/rbac_translator.go` does\nthe same on the non-xDS path. Envoy stores `HeaderMatcher.name` in a\n`Http::LowerCaseString`, so this is valid config that works on other\nproxies.\n\nThe fix lowercases the name where the route header matcher is built,\nmatching the sibling paths. Added a table test covering a mixed-case\nname against lowercased metadata, and asserting the parsed matcher\nstores the lowercased name; it fails on `master` and passes with the\nchange.\n\nRELEASE NOTES:\n* xds: fix RDS route header matchers with non-lowercase names never\nmatching"
    },
    {
      "commit": "91f43d64ba38fa25111f9198192baa93dadbb4fb",
      "tree": "c687b26a0a0717645a598bfc28f48a45d64ae80c",
      "parents": [
        "6d697e4b65eb0dcfaf326b5b1fcdc66913872442"
      ],
      "author": {
        "name": "Sushan Bhattarai",
        "email": "susan.bhattarai@bison.howard.edu",
        "time": "Mon Aug 31 18:48:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 18:48:24 2026"
      },
      "message": "xds/resolver: drop field references on Close to prevent retention across ClientConn recycle (#9301)\n\nRetention is via multiple field references off `*xdsResolver` that\nsurvive `Close`:\n\n- `r.cc` → the `ClientConn`, whose `ServiceConfig` still transitively\nreferences the resolver\n- `r.curConfigSelector` → captured by the `ClientConn`\u0027s `ServiceConfig`\nvia `UpdateState`\n- `r.dm` / `r.xdsClient` → watcher metadata held by the shared\n`xdsclient.DefaultPool` singleton, which survives every ClientConn\nlifetime\n\nIndividually each field is a benign back-reference; together they form\nmultiple independent retention chains through externally-anchored state.\nGo\u0027s tracing GC handles cycles fine, but these aren\u0027t cycles — they\u0027re\nchains rooted at package-global state (the shared xdsClient pool) and\nother ClientConns that stay alive.\n\nExplicitly dropping the field references at the end of `Close` leaves\nthe resolver struct with no outbound edges. The entire per-channel\nresolver + CDS balancer subtree (roughly 40 `CallbackSerializer`s,\nJSON-parsed service configs, `attributes.Attributes` chains, cloned\n`[]resolver.Address` slices per channel) becomes GC-collectible.\n\n\n\nRELEASE NOTES: None\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "6d697e4b65eb0dcfaf326b5b1fcdc66913872442",
      "tree": "413d884d4f86895f7614fa2d6baa9034e6f337a4",
      "parents": [
        "d3c47cc677f4128636dcdd2944cf61aa5a9332db"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Thu Aug 27 13:16:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 13:16:15 2026"
      },
      "message": "extproc : implement flow control for A93 (#9343)\n\nThis PR implements flow control for ext proc filter. THis PR also has\nversion change for `envoyproxy/go-control-plane/envoy` since the new\nflow control protocol changes are in master and not in ay release.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "d3c47cc677f4128636dcdd2944cf61aa5a9332db",
      "tree": "430c7dc82cd5e02113588b2e99ce5927a1adb77b",
      "parents": [
        "664e87d82d845735702de6ab41f6ab3fe7550674"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Thu Aug 27 11:39:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 11:39:40 2026"
      },
      "message": "xds: Implement GrpcService parsing and shared side channels (gRFC A102) (#9319)\n\nImplements gRFC [A102](https://github.com/grpc/proposal/pull/510)\n`GrpcService` support, wired into ext_proc as the first consumer.\n\nRELEASE NOTES: \n* xds: Implement GrpcService parsing and shared side channels (gRFC\nA102)"
    },
    {
      "commit": "664e87d82d845735702de6ab41f6ab3fe7550674",
      "tree": "9109c488b62993d9a1d88c648be06a9e75708b5e",
      "parents": [
        "31ccdcc05efbe86f7b4ce80fedcb02adf23c83e8"
      ],
      "author": {
        "name": "Gido ten Cate",
        "email": "engida96@gmail.com",
        "time": "Thu Aug 27 04:11:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 04:11:48 2026"
      },
      "message": "stream: group bool fields at tail of csAttempt to reduce allocator size class 240B→224B (#9359)"
    },
    {
      "commit": "31ccdcc05efbe86f7b4ce80fedcb02adf23c83e8",
      "tree": "c16b75637b1b29949a6f2d39e6154f8272304fa4",
      "parents": [
        "eff9d6fe9f3b07d7d784f9cd401165fdeea3eb57"
      ],
      "author": {
        "name": "Gido ten Cate",
        "email": "engida96@gmail.com",
        "time": "Thu Aug 27 04:09:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 04:09:48 2026"
      },
      "message": "stream: group bool fields at tail of serverStream to eliminate false sharing with mu (#9361)"
    },
    {
      "commit": "eff9d6fe9f3b07d7d784f9cd401165fdeea3eb57",
      "tree": "afa31cafbf24c2689edb48ec43bf5f6f4ead2cd2",
      "parents": [
        "93e31b48545e2a8aaeb6e06b47fb249f94e6297f"
      ],
      "author": {
        "name": "Gido ten Cate",
        "email": "engida96@gmail.com",
        "time": "Wed Aug 26 22:06:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 22:06:12 2026"
      },
      "message": "stream: group bool fields at tail of addrConnStream to reduce allocator size class 256B→240B (#9360)\n\nReorder \\`addrConnStream\\` fields so all 4 bool fields are grouped at\nthe tail of the struct, and move \\`mu\\` to a separate cache line from\nthe tail bools.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "93e31b48545e2a8aaeb6e06b47fb249f94e6297f",
      "tree": "408892c0152b085981dd46f6d664ee47566acd05",
      "parents": [
        "9d1988d75f2167ef8dce5bd4defbc5968af568e3"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Aug 25 07:25:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 07:25:37 2026"
      },
      "message": "transport: reject requests missing :authority and host headers (#9365)\n\nFixes : https://github.com/grpc/grpc-go/issues/9354\n\nThis PR updates the HTTP/2 transport layer to reject requests missing\nboth :authority and Host headers early. Also adds a defensive check in\nxds server to ensure authority header is present.\n\nRELEASE NOTES: \n- server: Reject requests missing both `:authority` and `Host` headers\nwith HTTP 400 and status `Internal`\n\n---------\n\nCo-authored-by: Madan Kumar \u003cwinklemad@outlook.com\u003e"
    },
    {
      "commit": "9d1988d75f2167ef8dce5bd4defbc5968af568e3",
      "tree": "501e4e2bacfec85e29dd27a1a152dc12ac7a6dd5",
      "parents": [
        "cecd55ad52bfde159478d230fad57f5c7d666f31"
      ],
      "author": {
        "name": "Gido ten Cate",
        "email": "engida96@gmail.com",
        "time": "Mon Aug 24 15:28:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 15:28:08 2026"
      },
      "message": "stream: group bool fields at tail of clientStream to reduce allocator size class 288B→256B (#9281)"
    },
    {
      "commit": "cecd55ad52bfde159478d230fad57f5c7d666f31",
      "tree": "a54d850d76975329c51b9ab27d7113b758b44891",
      "parents": [
        "abf0c53de82e6eb3148a98dc91ecfec278e53b23"
      ],
      "author": {
        "name": "Aryan Singh K.",
        "email": "70511529+aryansk@users.noreply.github.com",
        "time": "Mon Aug 24 15:26:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 15:26:43 2026"
      },
      "message": "stats: expose client authority in OutHeader (#9296)"
    },
    {
      "commit": "abf0c53de82e6eb3148a98dc91ecfec278e53b23",
      "tree": "84a6def0e3c9e59babe8743efc74fbc706e7e9df",
      "parents": [
        "4793ad0474669eafbd5346c8a3d098fdfa542498"
      ],
      "author": {
        "name": "Ran",
        "email": "ran-su@users.noreply.github.com",
        "time": "Mon Aug 24 10:43:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 10:43:32 2026"
      },
      "message": "xds: add internal ResourceNameFunc server option (#9288)\n\nAdds an internal `ResourceNameFunc` server option that allows override\nthe LDS listener resource name.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "4793ad0474669eafbd5346c8a3d098fdfa542498",
      "tree": "76aea2c9f409049e87efb1401c6b4c20b1775e70",
      "parents": [
        "3284af7e654993f7b9de31996ebc8fa81e375d8a"
      ],
      "author": {
        "name": "Nilesh Patil",
        "email": "128893479+nileshpatil6@users.noreply.github.com",
        "time": "Fri Aug 21 20:29:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 20:29:11 2026"
      },
      "message": "credentials/alts: preserve boundAccessToken in altsTC.Clone (#9345)\n\n`altsTC.Clone` does not copy `boundAccessToken`, so a cloned ALTS\ncredential silently loses the token and performs its handshake without\nit.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "3284af7e654993f7b9de31996ebc8fa81e375d8a",
      "tree": "4d17599512f0f329db6545417436db00eee455a4",
      "parents": [
        "75d9091e20fb3e255179a2177f39a09014426c6c"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Fri Aug 21 20:27:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 20:27:30 2026"
      },
      "message": "grpc: change existing dial/server options that set initial window size to not disable BDP estimation (#9078)\n\nFixes https://github.com/grpc/grpc-go/issues/7923\n\nSpecifically, this PR handles part two of the proposal:\nhttps://github.com/grpc/grpc-go/issues/7923#issuecomment-2549600066\n\nIt also fixes existing tests that relied on BDP estimation being turned\nOFF to use the `WithStaticXxx` and `StaticXxx` options, and adds new\ntests that verify the behavior of all options in a e2e fashion.\n\nRELEASE NOTES:\n* grpc: Deprecate `WithInitialWindowSize` and `InitialWindowSize`. These\nare replaced by `WithInitialStreamWindowSize` and\n`InitialStreamWindowSize` respectively.\n* grpc: Change behavior of existing options that set initial window size\non client and server to not disable BDP estimation."
    },
    {
      "commit": "75d9091e20fb3e255179a2177f39a09014426c6c",
      "tree": "7283b4b2fb963e20eaeb50b688471809234165af",
      "parents": [
        "ef79129ecf052af449531301ef99440f6a82a352"
      ],
      "author": {
        "name": "Ran",
        "email": "ran-su@users.noreply.github.com",
        "time": "Fri Aug 21 18:38:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 18:38:49 2026"
      },
      "message": "xds: allow wildcard listener port on server (#9341)\n\nThis implements https://github.com/grpc/proposal/pull/559\n\nRELEASE NOTES:\n- xds/server: Support listener resource with a wildcard port that\nenables deployments where server ports are assigned dynamically."
    },
    {
      "commit": "ef79129ecf052af449531301ef99440f6a82a352",
      "tree": "3471d04b2e8e48d0ac43dc7dc133235743a0660a",
      "parents": [
        "965a6bf33b41b55b280d38e5c757362ac36fb496"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Aug 21 08:10:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 08:10:38 2026"
      },
      "message": "stats/opentelemetry: dynamically calculate compressed message size in tests (#9346)\n\nTests in `stats/opentelemetry` and `stats/opentelemetry/csm` asserted a\nhardcoded compressed message size of `57` bytes for a 10,000-byte zero\npayload with gzip compression.\nIn Go 1.27, standard library `compress/gzip` compression improvements\nchanged the output size of this payload from 57 bytes to 54 bytes,\ncausing metric and trace size assertions to fail when executed under\nnewer Go toolchains.\n\nAdded `GzipCompressedMessageSize` helper in to compute the expected\ncompressed byte length dynamically via `compress/gzip`. Updated metric\nand trace assertions to use the same.\n\nRELEASE NOTES: None"
    },
    {
      "commit": "965a6bf33b41b55b280d38e5c757362ac36fb496",
      "tree": "98670faa4e42e482e03a7a7240bb0f3a7d43a8b4",
      "parents": [
        "955851b776ba623de315d8c7aa0e7260f600b9f5"
      ],
      "author": {
        "name": "Doug Fawley",
        "email": "dfawley@google.com",
        "time": "Wed Aug 19 21:31:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 21:31:01 2026"
      },
      "message": "CONTRIBUTING.md: add generative AI policy section (#9339)"
    },
    {
      "commit": "955851b776ba623de315d8c7aa0e7260f600b9f5",
      "tree": "1f47d046cd14883e98a6874458ff599848210295",
      "parents": [
        "ce9c11298be928fdac25146f5d7ac47ff9081873"
      ],
      "author": {
        "name": "Yuyang Guo",
        "email": "mistyguo@gmail.com",
        "time": "Wed Aug 19 20:34:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 20:34:26 2026"
      },
      "message": "metadata: Add ValueFromOutgoingContext (#9282)\n\nPartially Fixes: #8860\n\n### Why\n\nThere are use cases where only a single value needs to be read from\noutgoing gRPC metadata. Today the only way to do that is\n`metadata.FromOutgoingContext`, which merges and copies every header\nalready staged into a brand-new map, even though the caller only wants\none of them. The cost of that copy grows with however many headers have\nalready accumulated in outgoing context — exactly the complaint raised\nin #8860.\n\n### What\n\nThis PR adds `metadata.ValueFromOutgoingContext(ctx, key) []string`,\nsymmetric to the existing `ValueFromIncomingContext`, for reading a\nsingle header from outgoing gRPC metadata without merging and copying\nevery other header already staged via `AppendToOutgoingContext`.\n\nThis is the API @easwars suggested in\nhttps://github.com/grpc/grpc-go/issues/8860#issuecomment-3975157332:\n\n\u003e Would adding a `ValueFromOutgoingContext` that is similar to\n`ValueFromIncomingContext` work for you? Please note that\n`ValueFromOutgoingContext` will not be as fast as\n`ValueFromIncomingContext` as the implementation would have check\nentries from the `map` **and** the `added` entries.\n\nper https://github.com/grpc/grpc-go/issues/8860#issuecomment-5121951898.\n\nThat tradeoff is exactly what this implementation does: it checks\n`rawMD.md` (case-insensitively, matching `ValueFromIncomingContext`\u0027s\nsemantics) and then walks `rawMD.added`, accumulating matches in the\nsame order `FromOutgoingContext` would, without allocating a new map or\ncopying unrelated keys/values.\n\nMatching `rawMD.added` entries case-insensitively via\n`strings.EqualFold`, rather than assuming they\u0027re already lowercased by\n`AppendToOutgoingContext`, makes no assumption about how `rawMD.added`\nwas populated — the same guarantee `FromOutgoingContext` already makes\nfor both `rawMD.md` and `rawMD.added`.\n\nThe allocation of `vals` is deferred until a match is actually found in\n`rawMD.added` (per `gemini-code-assist`\u0027s review suggestion), rather\nthan always calling `copyOf` as soon as `rawMD.md` matches. When the key\nis found in both `rawMD.md` and `rawMD.added`, this avoids paying for a\n`copyOf` allocation that would otherwise immediately be discarded by the\nfirst `append`\u0027s growth — roughly halving allocations for that case (see\n`key-found-in-md-and-added` in the benchmark below).\n\nThe `rawMD.added` loop also tries a direct `\u003d\u003d` before falling back to\n`strings.EqualFold` (a second `gemini-code-assist` suggestion), since\n`AppendToOutgoingContext` already lowercases keys in practice.\nBenchmarked with realistic-length keys (e.g. `\"grpc-timeout\"`, not\n`\"k1\"`), this is a modest win when the key is found (~2-7% faster) at\nthe cost of a small regression when it isn\u0027t (~6% slower — one extra\ncomparison with no payoff) — a reasonable trade since looking up a\nheader you expect to be present is the common case.\n\n### Benchmark\n\n`n` is the number of unrelated headers already staged (one\n`NewOutgoingContext` call plus one `AppendToOutgoingContext` call)\nbefore reading the target key:\n\n```\ngoos: darwin\ngoarch: arm64\npkg: google.golang.org/grpc/metadata\ncpu: Apple M4 Pro\nFromOutgoingContext/n\u003d1         141.7 ns/op    432 B/op    4 allocs/op\nValueFromOutgoingContext/n\u003d1     56.0 ns/op     16 B/op    1 allocs/op\nFromOutgoingContext/n\u003d10        404.9 ns/op    968 B/op   15 allocs/op\nValueFromOutgoingContext/n\u003d10   107.2 ns/op     16 B/op    1 allocs/op\nFromOutgoingContext/n\u003d50       1596.0 ns/op   3592 B/op   55 allocs/op\nValueFromOutgoingContext/n\u003d50   314.7 ns/op     16 B/op    1 allocs/op\n```\n\n(measured with `b.Loop`, per review feedback, which also removes the\nneed for the manual anti-optimization `b.Fatal` checks the previous\nnumbers were measured with)\n\nAt n\u003d50, roughly 5x faster with 55x fewer allocations. This is still\nO(n) in the number of already-staged headers in the worst case, since\n`rawMD.added` isn\u0027t indexed by key, but it avoids the wasted work of\ncopying and lowercasing every header the caller doesn\u0027t want.\n\nSeparately, `BenchmarkValueFromOutgoingContext` (now using\nrealistic-length keys like `\"grpc-timeout\"`/`\"content-type\"` instead of\n`\"k1\"`/`\"k3\"`, which understated `strings.EqualFold`\u0027s cost) shows both\n`rawMD.added` optimizations above:\n\n```\nkey-found                    59.6 ns/op    16 B/op   1 allocs/op\nkey-not-found                50.7 ns/op     0 B/op   0 allocs/op\nkey-found-in-md-and-added    38.7 ns/op    32 B/op   1 allocs/op\n```\n\n### Testing\n\n- `TestValueFromOutgoingContext` covers exact match, case-insensitive\nmatch, a value present in `rawMD.md` accumulated with two later\n`AppendToOutgoingContext` calls (must match `FromOutgoingContext`\u0027s\norder, per `TestAppendToOutgoingContext`), values split solely across\nmultiple `AppendToOutgoingContext` calls, not-found, and\nno-outgoing-metadata-at-all.\n- `TestValueFromOutgoingContext_AddedCaseInsensitive` constructs\n`rawMD.added` directly with a mixed-case key (bypassing\n`AppendToOutgoingContext`\u0027s lowercasing) to verify the match is still\nfound.\n- `TestValueFromOutgoingContext_PanicsOnOddPairs` covers the defensive\npanic on a malformed `rawMD.added` entry, mirroring the identical guard\nalready present in `FromOutgoingContext`.\n- `BenchmarkValueFromOutgoingContext` mirrors the existing\n`BenchmarkValueFromIncomingContext` shape (key-found / key-not-found),\nplus a `key-found-in-md-and-added` case covering the deferred-allocation\npath above.\n- `BenchmarkValueFromOutgoingContextVsFromOutgoingContext` produced the\ncomparison table above.\n- `ValueFromOutgoingContext` itself is at 100% statement coverage (`go\ntest -cover`).\n- `go test ./metadata/...`, `go vet ./metadata/...`, and `gofmt` are all\nclean. This branch is rebased on current `master`.\n\nThis is additive only — no existing exported behavior changes.\n\nRELEASE NOTES:\n* metadata: Add ValueFromOutgoingContext, which reads a single metadata\nvalue from outgoing context without copying the entire outgoing metadata\ninto a new map.\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ce9c11298be928fdac25146f5d7ac47ff9081873",
      "tree": "84d5844f404242d2a6a9d63057eb09f2f273909a",
      "parents": [
        "db9482836c298f234c896cf82ab68cafc78237f8"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Aug 19 19:56:26 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 19:56:26 2026"
      },
      "message": "autosharding: add config parsing functionality (#9323)\n\nRELEASE NOTES: none"
    },
    {
      "commit": "db9482836c298f234c896cf82ab68cafc78237f8",
      "tree": "73c746b57f2af5d5abd0730927dbfbba940e8f42",
      "parents": [
        "7354d9c8debb4bcf2225bf429857078de310c176"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Aug 19 06:02:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 06:02:08 2026"
      },
      "message": "xds/rbac: lowercase header matcher names before matching (#9332)\n\nThe RBAC filter passes the name of a header matcher to the matching\nengine unchanged. The metadata that the engine matches against always\nhas lowercase keys. A name that contains an uppercase character\ntherefore matches no header, and the rule that holds it never fires. The\npolicy parses, reports no error and looks active. A DENY policy written\nthis way fails open.\n\nThe A41 validation reads the same unnormalized name, so the rejection of\n:scheme and grpc- prefixed matchers misses the name Grpc-Status. A Host\nmatcher also keeps its name, although A41 makes host and :authority\nequivalent.\n\nLowercase the name in normalizeHeaderMatcher. That function already owns\nthe A41 rules and already rewrites the name in place, so the matching\nengine, the :scheme and grpc- rejection, and the host alias all read one\nnormalized name. Envoy holds each header matcher name in a\nLowerCaseString, grpc-java lowercases the name before it looks the\nheader up, and authz/rbac_translator.go lowercases the name on the\nnon-xDS path.\n\nThe new test in test/xds shows the effect on an end user. A DENY policy\non the header name User-Agent returns OK for every RPC before the change\nand PermissionDenied after it. The unit tests cover the name that the\nparse gives to the engine, the case of the :scheme and grpc- rejection,\nand the host alias, at the top level and inside a nested rule.\n\nRELEASE NOTES:\n\n- xds/rbac: Fix a bug where a header matcher whose name was not\nlowercase, such as `X-Role`, matched no header, which could cause DENY\nrules to fail open.\n- xds/rbac: Fix a bug where a `:scheme` or `grpc-` prefixed header\nmatcher was accepted when its name was not lowercase.\n- xds/rbac: Fix a bug where a `Host` header matcher was not replaced\nwith `:authority`.\n\nCo-authored-by: Markus Magnuson \u003c331091+alimony@users.noreply.github.com\u003e"
    },
    {
      "commit": "7354d9c8debb4bcf2225bf429857078de310c176",
      "tree": "30305800baad3d5e5eece30e61542ca0933597bc",
      "parents": [
        "c92e985770b7194d4a4f433c84d42c6c195e8ce5"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Wed Aug 19 06:00:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 06:00:56 2026"
      },
      "message": "transport: restrict memory overhead of buffering small data frames (#9331)\n\nRELEASE NOTES:\n* transport: restrict memory overhead of buffering small data frames."
    },
    {
      "commit": "c92e985770b7194d4a4f433c84d42c6c195e8ce5",
      "tree": "6008dfb561e18665ccd109141453d3fc40c89a88",
      "parents": [
        "0ef3b0ccbe9739c69b57fe994dbf0e3adbc0f55c"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Tue Aug 18 19:39:31 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 19:39:31 2026"
      },
      "message": "server: remove code to suppress duplicate writing of status (#9322)\n\nFollow-up from https://github.com/grpc/grpc-go/pull/9309.\n\nThe transport currently handles duplicate status write suppression.\nThere is no need to add a further check in the gRPC layer without having\nan explicit reason for it. Maybe there is some edge case that requires\nit. So, removing it.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "0ef3b0ccbe9739c69b57fe994dbf0e3adbc0f55c",
      "tree": "6bf5a883161c2a647e97461f68629bbaacbecd9b",
      "parents": [
        "b6f4ff622ced23ea5854d2db26841748a481352b"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Tue Aug 18 19:38:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 19:38:49 2026"
      },
      "message": "client: don\u0027t reuse a pick\u0027s authority override on a later attempt (#9277)\n\n`csAttempt.newStream` writes the gRFC A81 authority override from the\npick result into `cs.callHdr`, which is allocated once per\n`clientStream` and shared by every `attempt`. Nothing clears `Authority`\nbetween attempts, so once an attempt is picked to an endpoint that\ncarries a hostname, a retry whose own pick supplies no override still\ngoes out with the earlier endpoint\u0027s authority. An xDS cluster using\n`auto_host_rewrite` whose endpoints do not all set hostname hits this on\nany retry, and `:authority` is what selects the virtual host and what\nRBAC host matchers run against on the receiving side.\n\nCopy the call header per attempt so the override, like\n`PreviousAttempts`, stays with the attempt that produced it. The value\nis derived from that attempt\u0027s pick result, so the attempt is the right\nscope for it; leaving it on the stream lets one endpoint\u0027s rewrite\noutlive the pick that asked for it.\n\nRELEASE NOTES:\n* client: Fix a bug where a retried RPC could be sent with the\n`:authority` value belonging to the endpoint chosen by an earlier\nattempt, when a load balancer supplies an authority override (e.g. xDS\n`auto_host_rewrite`)"
    },
    {
      "commit": "b6f4ff622ced23ea5854d2db26841748a481352b",
      "tree": "0afb437aeb0930f7f27765cda6521e17ff256adf",
      "parents": [
        "b6685c50ff9858588298cf9b53515febe1c41f0e"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Aug 18 07:26:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 07:26:08 2026"
      },
      "message": "deps: update dependencies for all modules (#9327)\n\nThis PR updates dependencies for all modules as part of 1.84 branch cut.\n\nAlso,\n\nFixes: https://github.com/grpc/grpc-go/issues/9177\n\nRELEASE NOTES: None"
    },
    {
      "commit": "b6685c50ff9858588298cf9b53515febe1c41f0e",
      "tree": "9c372142c6a1baf88f69c6ccc0d71c06b3fac676",
      "parents": [
        "30ce1d594fa9d7b86ff9d3d7dd7873ef0c161acf"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Aug 18 05:00:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 05:00:25 2026"
      },
      "message": "Change version to 1.85.0-dev (#9326)\n\nRELEASE NOTES: None"
    },
    {
      "commit": "30ce1d594fa9d7b86ff9d3d7dd7873ef0c161acf",
      "tree": "bfb45f32abcc7f88cafc0bf531b0b48f995289f7",
      "parents": [
        "54c743e4e9829208f264e092160d2b0768a01bf2"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Sat Aug 15 09:37:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 15 09:37:16 2026"
      },
      "message": "xds: support injecting bootstrap and server config into HTTP filter config parsing (A102) (#9315)"
    },
    {
      "commit": "54c743e4e9829208f264e092160d2b0768a01bf2",
      "tree": "58c0ecd54bc003b1652a2c5f21d05db442fa3414",
      "parents": [
        "538bb2f7af6e36be46ec1d2ae90f65b972f14083"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Sat Aug 15 04:52:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 15 04:52:37 2026"
      },
      "message": "extproc : wait for async RPC to complete in test (#9311)\n\nFixes: https://github.com/grpc/grpc-go/issues/9310\n\nThis PR has the following changes: \n1. Waits for the RPC in TestExtProcChannelRetention_XDSConfigUpdate to\ncomplete before checking interceptor close. The test was flaking because\nthe test was ending and the background RPC\u0027s was not complete and\ncontext was being cancelled.\n2. Pass direct errors to error handling functions instead of wrapping\nthem to ensure correct stream bypass or failure.\n\nRELEASE NOTES: None"
    },
    {
      "commit": "538bb2f7af6e36be46ec1d2ae90f65b972f14083",
      "tree": "1882a95d3512c59bb7527e0878e514ea3676c0d4",
      "parents": [
        "bf9e7cd3430df40d0732ba42eb88bd5f2cc63407"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Fri Aug 14 20:33:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 20:33:32 2026"
      },
      "message": "endpointsharding: decouple locking, and simplify ChildState API (#9290)\n\nThis change refactors `balancer/endpointsharding` by having a two-level\nlocking strategy: one for the state in the `endpointSharding` balancer\nand one for the state that is maintained for every endpoint. It\ncontinues to guarantee the mutual exclusion requirements of the\n`balancer.Balancer` API methods while keeping the code simple and\ndeadlock-free.\n\nSummary of Changes:\n- Decoupled \u0026 Safe Locking Model:\n- Per-Child Isolation (`childMu`): Guarantees strict mutual exclusion\nfor all `balancer.Balancer` API calls to a specific child balancer. This\nprotects against races when `ExitIdle` is triggered asynchronously by\nthe picker or auto-reconnection.\n- Parent Aggregation (`mu`): Protects the global endpoints map and\naggregated state.\n- Deadlock Prevention: Establishes a strict lock hierarchy where parent\nlocks are never held when calling into a child.\n- Simplify the `ChildState` API:\n- Replaced the single-method `ExitIdler` interface with with a\nfirst-class function `ExitIdle func()`.\n  - Removed `ExitIdler` from package `endpointsharding`.\n- Updated `balancer/ringhash` to consume the function callback directly.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "bf9e7cd3430df40d0732ba42eb88bd5f2cc63407",
      "tree": "bab264640c43cacb91ccd948d4155f78679c9a19",
      "parents": [
        "1b9cfe8b07292974500e0178055cca6e8e9a7b85"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Thu Aug 13 20:16:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 20:16:37 2026"
      },
      "message": "xds: parse allowed_grpc_services from the bootstrap config (A102) (#9194)\n\nAdds parsing and credential resolution for the allowed_grpc_services\nbootstrap field (gRFC A102), used to validate side-channel targets\nreceived from untrusted xDS servers. Channel credentials stop at the\nfirst supported type.\n\n\nRELEASE NOTES: n/a"
    },
    {
      "commit": "1b9cfe8b07292974500e0178055cca6e8e9a7b85",
      "tree": "6677fe505d4b4cfb888d8100abea152b294bdcfd",
      "parents": [
        "ec035398ca140ed857ecd151ebc35f9511f32847"
      ],
      "author": {
        "name": "Roshan Singh",
        "email": "35294369+lopster568@users.noreply.github.com",
        "time": "Thu Aug 13 19:31:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 19:31:01 2026"
      },
      "message": "test: tolerate OutPayload/InTrailer reorder in RetryStats (#9272)\n\nFixes #5881\n\n`Test/RetryStats` flakes about 1 in 10k runs. The test already tolerates\na payload/trailer race for the final attempt (positions 13 and 14),\nwhere the InPayload and InTrailer stats can arrive out of order. The\nsame race applies to the transparent retry attempt: its OutPayload and\nInTrailer stats (positions 6 and 7) can also be recorded out of order,\nwhich the test does not yet tolerate. The reported failure is `at\nposition 6: got *stats.InTrailer; want *stats.OutPayload`.\n\nThis extends the existing tolerance to the retry attempt\u0027s\nOutPayload/InTrailer pair, using the same swap technique already applied\nat positions 13 and 14.\n\nRELEASE NOTES: N/A"
    },
    {
      "commit": "ec035398ca140ed857ecd151ebc35f9511f32847",
      "tree": "415184e3f3efeada8be29876ae2b3e9a0a0d9465",
      "parents": [
        "44332dbf87932fadad92acbf032780f0e41c5243"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Aug 13 07:38:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 07:38:01 2026"
      },
      "message": "server: unify handling of unary and streaming RPCs (#9309)\n\nThis change unifies the processing for unary and streaming RPCs on the\ngRPC-Go server. By treating all RPCs fundamentally as streams\ninternally, this change simplifies the codebase and eliminates duplicate\nlogic.\n\nSummary of changes:\n* Merged `processUnaryRPC` and `processStreamingRPC` into a single\n`processRPC` method by wrapping unary handlers as stream handlers.\n* Removed the methods map from `serviceInfo`, storing all descriptors in\nthe streams map.\n* Ensured interceptor segregation is maintained so that unary\ninterceptors only run for unary RPCs and stream interceptors only run\nfor streaming RPCs.\n* Introduced thread-safe, exactly-once status writing in `serverStream`\nusing an atomic boolean to prevent duplicate status writes.\n* Added tests to verify interceptor segregation and concurrent status\nwriting behavior.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "44332dbf87932fadad92acbf032780f0e41c5243",
      "tree": "40043eae5276fdbc3859c8dc972f79a279000307",
      "parents": [
        "7b26667c4947a90ec3f34dfe8b99f717adc8c8e3"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Wed Aug 12 06:55:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 06:55:47 2026"
      },
      "message": "extproc: increase timeout for TestStreamTimeoutBodyPhaseAllow and remove incorrect refcount decrement (#9306)\n\nFixes: https://github.com/grpc/grpc-go/issues/9305\n\nThis PR : \n- Increases the timeout for TestStreamTimeoutBodyPhaseAllow\n- Removes refcount decrement after rpc init returns error because that\nis already taken care by https://github.com/grpc/grpc-go/pull/9140\n\nRELEASE NOTES: None"
    },
    {
      "commit": "7b26667c4947a90ec3f34dfe8b99f717adc8c8e3",
      "tree": "fc0456df7f63813545b6b4c59531a910da8798c0",
      "parents": [
        "0c51461d27177d997e14c642fe18c11668fc09a3"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Wed Aug 12 04:14:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 04:14:08 2026"
      },
      "message": "grpcsync: change refcounted utility to use value (#9303)\n\nThis PR changes the refcounted utility to take and store value instead\nof a pointer to make sure we can simply store interfaces too.\n\nThis PR also changes \n- The usages of the refcounted utility for `HandshakeInfo` to use its\npointer for refcount.\n- The signature of the refcounted route cluster\n- Getting value for the ext proc client\n\n\nRELEASE NOTES: None"
    },
    {
      "commit": "0c51461d27177d997e14c642fe18c11668fc09a3",
      "tree": "77aefd6848b9942f77736791db8457abb4fee698",
      "parents": [
        "36bd7c97b48cf0a18d281d5122d0c903cfeab8a1"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Tue Aug 11 13:59:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 13:59:09 2026"
      },
      "message": "credentials/sts: do not follow redirects during token exchange (#9299)"
    },
    {
      "commit": "36bd7c97b48cf0a18d281d5122d0c903cfeab8a1",
      "tree": "37db4788e2a96b96bf4c18560e02df9059e12a96",
      "parents": [
        "a2cc858436d4d1ba0aef3b736b64e0c990f15383"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Aug 11 13:54:39 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 13:54:39 2026"
      },
      "message": "randomsubsetting: ignore endpoints without addresses (#9259)"
    },
    {
      "commit": "a2cc858436d4d1ba0aef3b736b64e0c990f15383",
      "tree": "afb2648f83358002d935c00c7d0091bce6ca4c24",
      "parents": [
        "5380ae2c018f61a520f5142f714d229458c4b11c"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Aug 11 13:26:19 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 13:26:19 2026"
      },
      "message": "extproc: implement channel retention as part of A93 (#9285)\n\nThis PR implements the channel retention for ext proc filter. It has the\nfollowing changes:\n1. Adds refcounting to route cluster to ensure interceptors remain open\nif there are any inflight RPCs or the config selector is active instead\nof closing the interceptors unconditionally on XDS Config update.\n2. Adds refcounting for ext proc channel which is incremented when\ninterceptor is built and for every RPC and decremented when interceptor\ncloses and proc RPC finishes.\n3. Call RecvMsg on the dataplane stream if not called whenever the\ncontext is cancelled to handle cases where the dataplane stream is\ncreated but the RPC fails without every invoking any function on the\ndataplane stream\nThis is a problem for unary RPC because it does not spawn a goroutine\nwaiting for ctx cancellation to do the cleanup.\n4. Error checking on `cc.UpdateState` in sendNewServiceConfig was\nremoved\n\nReason : Previously, if `cc.UpdateState(s)` returned an error (e.g.,\nwhen a sub-balancer reported a removed cluster or NACK), xdsResolver\ncalled `cs.stop()` on the new ConfigSelector and continued tracking the\nold one. However, `ClientConn.UpdateState(s)` unconditionally installs\nthe new ConfigSelector (cs) before updating the LB policy—even if\n`updateClientConnState` subsequently errors.\nThis caused `ClientConn` and `xdsResolver` to become desynchronized:\nClientConn actively routed RPCs using cs, while xdsResolver had already\nstopped it. With routeCluster now refcounted, calling `cs.stop()`\ndecrements its refcount to 0, causing any RPC calling `SelectConfig` on\ncs to hit a dead resource and fail with \"Resource already closed or\ndead\".\nRemoving the error check ensures xdsResolver unconditionally adopts cs,\nkeeping both components in sync, preserving cs\u0027s refcount, and allowing\nRPCs to cleanly reach error pickers configured by cluster_manager LB\npolicy.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "5380ae2c018f61a520f5142f714d229458c4b11c",
      "tree": "2fd48f744ff7e30f42e91d26da56f645b0ac935c",
      "parents": [
        "1f4c6f36b067b48625280cc7f54cd6c29f058fc5"
      ],
      "author": {
        "name": "Deep Golani",
        "email": "54791570+deepgolani4@users.noreply.github.com",
        "time": "Tue Aug 11 13:03:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 13:03:59 2026"
      },
      "message": "balancer: remove grpc.lb.pick_first.* metrics (#9215)\n\nRELEASE NOTES: TBD"
    },
    {
      "commit": "1f4c6f36b067b48625280cc7f54cd6c29f058fc5",
      "tree": "621e2d7bb386ef5cfe96d147ed6b1d3730a9e858",
      "parents": [
        "39156ac2e972afa72e177acad5db8f3060150471"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Mon Aug 10 18:35:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 18:35:24 2026"
      },
      "message": "xds/rbac: apply header matcher checks to nested and/or/not rules (#9258)\n\nparseConfig only walks the top-level Permissions and Principals of each\nRBAC policy when it applies the A41 header-name rules, so a header\nmatcher nested inside an and_rules, or_rules, or not_rule is never\nchecked. A control plane can put a `:scheme` or `grpc-` prefixed matcher\ninside a nested rule to slip past the validation A41 says must reject\nit, and a nested `host` matcher never gets rewritten to `:authority`, so\nit silently fails to match the header grpc-go actually carries (a deny\npolicy on a nested host matcher fails open).\n\nWalk the full permission and principal trees so both the :scheme/grpc-\nrejection and the host to :authority rewrite reach matchers at any\ndepth. Doing it in parseConfig keeps the check in the one place that\nalready owns A41 validation, and folds the two former top-level passes\ninto a single recursive walk shared by permissions and principals.\n\nRELEASE NOTES:\n- xds/rbac: Fix a bug where nested `Principal` or `Permission` rules\nwith `:scheme` or `grpc-` prefixed header matchers were not rejected,\nwhich could cause DENY rules to fail open.\n- xds/rbac: Fix a bug where the `host` header matcher was not being\nreplaced with `:authority` in nested `Principal` or `Permission` rules."
    },
    {
      "commit": "39156ac2e972afa72e177acad5db8f3060150471",
      "tree": "4a58ee94e9ceef7fe4f435341e88df97ee9dd06f",
      "parents": [
        "1ecbd8695d9df1e20c042ca8b9bea246815f73b5"
      ],
      "author": {
        "name": "Gregory Cooke",
        "email": "gregorycooke@google.com",
        "time": "Mon Aug 10 17:11:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 17:11:20 2026"
      },
      "message": "security: Pipe ConnectionState to custom verification (#9293)\n\nThis PR pipes the `ConnectionState` to the custom verification API.\nIn particular, this allows the implementer of the custom verification\nAPI to see the `CurveID` representing the negotiated key exchange group.\n\nRELEASE NOTES:\n* Add `ConnectionState` to `HandshakeVerificationInfo`"
    },
    {
      "commit": "1ecbd8695d9df1e20c042ca8b9bea246815f73b5",
      "tree": "d28e098c0f7fb4d6289e791ee6a11bbff0584755",
      "parents": [
        "58bca5aadbe2a1b6e2663e90d3dc9f5d4aba4cf2"
      ],
      "author": {
        "name": "Gregory Cooke",
        "email": "gregorycooke@google.com",
        "time": "Fri Aug 07 19:48:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 19:48:21 2026"
      },
      "message": "security: Allow passing `CurvePreferences` in advancedtls (#9292)\n\nThis PR adds a passthrough for `tls.Config.CurvePreferences` in\n`advancedtls.Options`.\n\nRELEASE NOTES:\n* Add passthrough for `tls.Config.CurvePreferences` in\n`advancedtls.Options`."
    },
    {
      "commit": "58bca5aadbe2a1b6e2663e90d3dc9f5d4aba4cf2",
      "tree": "611db2e4d4a4364ba566cfdf7f78bb320aa3c6b8",
      "parents": [
        "61b71be11d78679a92cc349eb776399db2794ac6"
      ],
      "author": {
        "name": "Leonid Bugaev",
        "email": "leonsbox@gmail.com",
        "time": "Fri Aug 07 18:46:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 18:46:09 2026"
      },
      "message": "internal/transport: validate per-RPC credential metadata (#9202)\n\nFixes #9198\n\nValidate metadata returned by transport-level and call-level\n`PerRPCCredentials` before appending it to HTTP/2 request headers. The\nvalidation happens after keys are lowercased, matching the existing\noutgoing metadata rules used for application metadata.\n\nThe regression tests cover invalid credential keys and values for both\ndial-level and call-level credentials.\n\nRELEASE NOTES:\n* credentials: Invalid metadata returned by per-RPC credentials is\nrejected before HTTP/2 request headers are created."
    },
    {
      "commit": "61b71be11d78679a92cc349eb776399db2794ac6",
      "tree": "3411c963c46363d81530fe4b22f43fd7965313aa",
      "parents": [
        "03255a9237b6eb32710f6bc4f2de9a675b99fe36"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Fri Aug 07 18:23:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 18:23:32 2026"
      },
      "message": "extproc: reject invalid header names and values in header mutations (#9286)\n\nApplyAdditions and ApplyRemovals screen a mutation on the key being\nnon-empty, lowercase, not a pseudo-header, not `host`, and under 16384\nbytes, but never on the key being a valid gRPC header name or the value\nbeing a valid gRPC header value. gRPC validates application-supplied\noutgoing metadata in `newStream`, which runs before the config selector\ninstalls the filter chain, so nothing revalidates what this filter adds\nafterwards, and `createHeaderFields` and the hpack encoder both take the\npair as given. An ext_proc server can set `x-user:\nalice\\r\\nauthorization: Bearer \u003ctoken\u003e` and have the CRLF land verbatim\nin the outgoing HEADERS block, or use a key such as\n`x-user\\r\\nauthorization`, neither of which the application itself is\npermitted to send.\n\nRoute both mutation paths through the validators already in\n`internal/metadata` and drop the reserved `grpc-` key space, matching\nthe `HeaderValue` read rules in A102.\n\nPer review, a mutation that fails validation now fails the RPC rather\nthan being silently skipped, and that applies to the screening that was\nalready there too (pseudo-header, `host`, non-lowercase, oversized key\nor value). The shared key checks moved into a `validateHeaderKey` helper\nso both paths report the same thing. The allow and disallow expressions\nare unchanged and still keyed off `DisallowIsError`, since that is a\nconfig decision rather than a validation failure.\n\nRELEASE NOTES:\n* xds: fail the RPC when an ext_proc server returns a header mutation\nwhose header name or value is not valid for gRPC"
    },
    {
      "commit": "03255a9237b6eb32710f6bc4f2de9a675b99fe36",
      "tree": "f0db088809d24647165c3afb94f24c74b5e47a28",
      "parents": [
        "17d5aaf2ae377d4629c50f49a42a3fb47bbc1e29"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Thu Aug 06 07:34:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 07:34:29 2026"
      },
      "message": "extproc: fix TestObservabilityMidStreamFailDeny race (#9295)\n\nFixes: https://github.com/grpc/grpc-go/issues/9289\n\nThis PR changes `TestObservabilityMidStreamFailDeny` to send and recv\nmessage until it gets an error. The test was failing because send and\nrecv call directly in dataplane stream without waiting for error from\nproc stream. Error from proc stream is received async in\n`recvAndDiscardResponses` loop. SO it can happen that 10 send and recv\nhappen very fast before the proc server send error frame.\n\nRELEASE NOTES: None\n\n#ext-proc-a93"
    },
    {
      "commit": "17d5aaf2ae377d4629c50f49a42a3fb47bbc1e29",
      "tree": "69c8f7b2c826a5ef35c5fbb56226ab316e5a77f9",
      "parents": [
        "c200c2d1e0b6ba75130e28c21d4bf34b888ef922"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Thu Aug 06 06:19:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 06:19:51 2026"
      },
      "message": "xds: pass correct context metadata in client and server route matching. (#9291)"
    },
    {
      "commit": "c200c2d1e0b6ba75130e28c21d4bf34b888ef922",
      "tree": "2fb9190c48cb3799e9e414f3670a5870e0dd3b19",
      "parents": [
        "fa603ec26e697cf94db719db21a38d7dde24c033"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Wed Aug 05 16:28:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 16:28:09 2026"
      },
      "message": "extproc: fix usages of testgrpc in test (#9294)"
    }
  ],
  "next": "fa603ec26e697cf94db719db21a38d7dde24c033"
}
