)]}'
{
  "log": [
    {
      "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)"
    },
    {
      "commit": "fa603ec26e697cf94db719db21a38d7dde24c033",
      "tree": "0c19b7777a69b01ca4df9177078bc39165655ab6",
      "parents": [
        "8518a5284bdf6604140c1f4b9702b7d0a3e0011f"
      ],
      "author": {
        "name": "Leonid Bugaev",
        "email": "leonsbox@gmail.com",
        "time": "Tue Aug 04 15:41:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 15:41:14 2026"
      },
      "message": "internal/transport: validate balancer and address metadata (#9203)\n\nFixes #9199\n\nValidate metadata supplied by balancer `PickResult.Metadata` before\nmerging it into the outgoing context, and validate resolver/address\nmetadata before converting it to HTTP/2 header fields.\n\nThe tests cover invalid address metadata at the transport boundary and\ninvalid balancer metadata through an end-to-end RPC path.\n\nRELEASE NOTES:\n* transport: Invalid metadata supplied by balancers or resolver\naddresses is rejected before request headers are created."
    },
    {
      "commit": "8518a5284bdf6604140c1f4b9702b7d0a3e0011f",
      "tree": "d9dc4c9290999db8f27bec4c4e79f7feb5b6a583",
      "parents": [
        "f7eb50cde3bc728e422922b251d6c5b1f38dfdab"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Aug 04 06:15:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 06:15:22 2026"
      },
      "message": "extproc: Implement client-side normal mode metrics (#9267)\n\nThis PR adds metrics for the normal mode implementation.\n\nAlso fixes:https://github.com/grpc/grpc-go/issues/9289 by adding\nResponseMode as Send so that we are able to catch the proc stream\nfailure because send can add all the messages to buffer and succeed\nbefore the proc server can send End_Stream frame.\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "f7eb50cde3bc728e422922b251d6c5b1f38dfdab",
      "tree": "c8908eec7708cbc64d945428fcbee4a5c11fd4f8",
      "parents": [
        "3ad1be50c723d4c25437492c0348752eede36782"
      ],
      "author": {
        "name": "Thuan Truong",
        "email": "tqthuan@gmail.com",
        "time": "Tue Aug 04 03:23:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 03:23:11 2026"
      },
      "message": "credentials/alts: support max frame size negotiation via env var (#9268)\n\nBecause grpc-go currently does not dynamically negotiate the max frame\nsize, the connection silently falls back to a default frame size of\n4KiB. Moving the default gRPC write-buffer chunk (32KiB) through ALTS at\n4KiB forces 9 small encryption calls per chunk. Raising the frame size\nto 64KiB lets that 32KiB chunk fit in a single frame, cutting per-chunk\nencrypt calls roughly 8x.\n\nTo roll this out safely and allow GCS testing before changing the\ndefault behavior, this PR:\n\n- Adds GRPC_GO_EXPERIMENTAL_ALTS_MAX_FRAME_SIZE environment variable:\nAllows configuring the maximum ALTS record frame size (default: 4096\nbytes / 4KiB, max: 512KiB). Once GCS validates 64KiB in testing, a\nfollow-up PR will flip the default value to 65536 (64KiB).\n\n- Adds frame size negotiation in handshaker.go: After handshake\ncompletion, we negotiate the frame size by clamping\nGRPC_GO_EXPERIMENTAL_ALTS_MAX_FRAME_SIZE against any peer-advertised\nmax_frame_size from the handshake result (min(peerMax, ourMax)), so we\nnever write frames larger than a peer can accept.\n\n- Aligns clamping with C++ and Java gRPC: Uses max(4KiB,\nnegotiatedMaxFrameSize) so NewConn never returns an error when talking\nto peers with small or unset max frame sizes.\n\nBenchmark/Profiling: \nsee attached files\n[consolidated_benchmark_report.md](https://github.com/user-attachments/files/30359695/consolidated_benchmark_report.md)\n[consolidated_profiling_report.md](https://github.com/user-attachments/files/30359696/consolidated_profiling_report.md)\nThe performance gains are more consistent under concurrent workloads (8\nand 16 workers), where 64KB shows a stable 2% to 3% average latency\nreduction and 3% to 6% P99 reduction.\n\nRELEASE NOTES:\n* `credentials/alts`: add `GRPC_GO_EXPERIMENTAL_ALTS_MAX_FRAME_SIZE`\nenvironment variable (default 4KiB, max 512KiB) to control ALTS record\nframe size and honor peer-advertised `max_frame_size` from the ALTS\nhandshake result."
    },
    {
      "commit": "3ad1be50c723d4c25437492c0348752eede36782",
      "tree": "2653f715f9d9e3ff12c5cc1538d306feb1a4cb58",
      "parents": [
        "a620350f3eb2090b518063377c7ad859f252e611"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Aug 04 02:51:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 02:51:12 2026"
      },
      "message": "extauthz: parse base and override config for A92. (#9221)"
    },
    {
      "commit": "a620350f3eb2090b518063377c7ad859f252e611",
      "tree": "95f7b8a2cbcf66a7902ca401f34573397374fc8f",
      "parents": [
        "cc234554fb363aea445a838b341bb8a65c8305b0"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Mon Aug 03 20:04:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 20:04:20 2026"
      },
      "message": "  xds: fix certificate provider closure race during concurrent TLS handshakes (#9248)\n\nFixes https://github.com/grpc/grpc-go/issues/9015\n\nRoot cause for the race:\n- As part of handling configuration updates, the `clusterimpl` LB policy\ncalls `Close` on its cached certificate providers. The `type` of these\ncertificate providers, as returned by the provider store, is\n`singleCloseWrappedProvider`, which contains a pointer to a reference\ncounted provider of type `wrappedProvider`.\n- `singleCloseWrappedProvider.Close()` mutates the internal pointer to\nan instance of `closedProvider` that always returns an error when asked\nfor key material.\n- Any concurrent transport creation for a subchannel that had loaded the\nprevious `HandshakeInfo` snapshot and was executing a call to\n`KeyMaterial` as part of `ClientHandshake` would end up calling\n`closedProvider.KeyMaterial`, causing the TLS handshake to fail with:\n`provider instance is closed`.\n- While `HandshakeInfo` was accessed via an `atomic.Pointer` inside\n`clusterimpl` and across the load balancer and transport boundaries, the\nfact that `clusterimpl` was retaining mutable references to state inside\nthe `HandshakeInfo` allowed it to mutate internal in a way that lead to\ndata races.\n  \nChanges made here:\n- `HandshakeInfo` now owns the lifetime of the provider instances within\nit.\n- It provides APIs to retrieve the `tls.Config` and internally tracks\nthe number of active handshakes\n- The certificate providers are only closed after the `HandshakeInfo` is\nclosed and all active handshakes have completed.\n- `clusterimpl` keeps track of the most recent security configuration\nand suppresses creation of new certificate providers if the config does\nnot change\n\nRELEASE NOTES:\n- xds: Fixed a bug that caused transient handshake failures when TLS\nhandshakes and xDS Cluster updates happened concurrently."
    },
    {
      "commit": "cc234554fb363aea445a838b341bb8a65c8305b0",
      "tree": "0ae9aa056ab7dce1b1cfcc67ff64944ad69ed0fd",
      "parents": [
        "268c99a7676c052154f0bd9ecd0c473960580cb9"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Mon Aug 03 19:47:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 19:47:40 2026"
      },
      "message": "xdsclient: store per-resource error in resource state instead of overall error (#9283)\n\nFollow-up from this discussion:\nhttps://github.com/grpc/grpc-go/pull/9185#discussion_r3640269716\n\nRELEASE NOTES: none"
    },
    {
      "commit": "268c99a7676c052154f0bd9ecd0c473960580cb9",
      "tree": "458586d718431e86e2bbbe1fd14a528935572187",
      "parents": [
        "c841c90b272444bd46b92740bc71544083fbcf46"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Fri Jul 31 19:05:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 19:05:48 2026"
      },
      "message": "extproc: fix import naming (#9284)"
    },
    {
      "commit": "c841c90b272444bd46b92740bc71544083fbcf46",
      "tree": "3e3c833abb4e4a78c6ec560b3403435087b2b8be",
      "parents": [
        "d7025c519f504dea1e1fec058449cffdc4beb3a5"
      ],
      "author": {
        "name": "Marcin Swierczek",
        "email": "mswierczek@google.com",
        "time": "Fri Jul 31 18:06:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 18:06:33 2026"
      },
      "message": "xds: suppress the duplicate errors at the client side (#9185)\n\nFixes #8994\n\nThis change suppresses duplicate errors on the xds client side by\nskipping calling watchers for the duplicates. This also prevents\ngenerating new child names for the same broken EDS resource (EDS\nresource has no localities) that is being re-send by the control plane.\n\nRELEASE NOTES:\n- xds: handle receipt of duplicated errors at the client side by\nsuppressing them in the same manner the duplicate updates are suppressed"
    },
    {
      "commit": "d7025c519f504dea1e1fec058449cffdc4beb3a5",
      "tree": "9300b9f20bbb0df6281dbcdcd32b5ce77d51f6cd",
      "parents": [
        "378072a6752dd546416938b0878266c78d10cc03"
      ],
      "author": {
        "name": "Chengxi Luo",
        "email": "chengxi.luo2004@gmail.com",
        "time": "Fri Jul 31 17:38:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 17:38:25 2026"
      },
      "message": "transport: surface data when received non-grpc header, end stream without trailers (#9217)\n\nFollow up: #8929\n\nRelated to:\nhttps://github.com/grpc/grpc-go/issues/7406#issuecomment-4851757967 . I\ndon\u0027t have the captured packages for reference. But according to the\ncode, I think what I fixed is the only code path that produces\ncodes.Internal / \"server closed the stream without sending trailers\"\nwhen nonGRPCStatus is set.\n\nWith this change, if we were collecting non-gRPC response data, and\nreceived an end of stream while there is no trailers, finalize the\nstatus with whatever body we\u0027ve buffered so far instead of discarding\nit. I added tests in both `internal/transport_test.go` and\n`test/end2end_test.go` to test it.\n\n\nRELEASE NOTES:\n* client: Fix non-gRPC error being discarded when END_STREAM arrives\nwithout trailers"
    },
    {
      "commit": "378072a6752dd546416938b0878266c78d10cc03",
      "tree": "4042d8e467c44dc1c83eb863cc1a24f4453ea0a0",
      "parents": [
        "0e45140ef07a51fd746da380e6d7ab60add24088"
      ],
      "author": {
        "name": "ulas",
        "email": "45449532+ulascansenturk@users.noreply.github.com",
        "time": "Fri Jul 31 17:32:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 17:32:30 2026"
      },
      "message": "stats/opentelemetry: add e2e test for baggage propagation (#9160)\n\n### Summary\n\nFixes #8520.\n\nOpenTelemetry baggage already propagates correctly through the gRPC\npipeline when the W3C Baggage propagator is configured — the tracing\ncarriers (`IncomingCarrier`/`OutgoingCarrier`) are generic\n`TextMapCarrier`s used by the configured propagator\u0027s\n`Inject`/`Extract`, so baggage rides in the `baggage` metadata header\nexactly like trace context. No production code change is needed; the gap\nwas the lack of a test proving it.\n\nThis PR adds `TestRPC_BaggagePropagation`, which:\n\n- Sets baggage (`key1\u003dvalue1`, `key2\u003dvalue2`) on the client context.\n- Configures `propagation.Baggage{}` in the trace options.\n- Asserts the **server handler** observes the same baggage, for both a\nunary and a streaming RPC.\n\n### Verification\n\n- Passes with `-race`.\n- Confirmed meaningful: removing `propagation.Baggage{}` makes the test\nfail (server sees empty baggage), so it exercises propagation rather\nthan passing vacuously.\n- `go vet` and `gofmt` clean.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "0e45140ef07a51fd746da380e6d7ab60add24088",
      "tree": "bb9d18f6c468b6719ac3f9fc785a07d9f2b69d0c",
      "parents": [
        "6f508fa56defb27c00e5d67d8b7533528c987780"
      ],
      "author": {
        "name": "Zaidoon Abd Al Hadi",
        "email": "43054535+zaidoon1@users.noreply.github.com",
        "time": "Fri Jul 31 09:59:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 09:59:46 2026"
      },
      "message": "transport: avoid allocation when releasing shared write buffers (#9233)\n\nShared write buffers currently add one heap allocation whenever\n`bufWriter` returns a buffer to the pool. This PR removes that\nallocation. It does not change when buffers are shared or released, and\nit does not change Go\u0027s GC pacing.\n\nAfter upgrading a service with many long lived gRPC connections and\nstreaming responses, we saw more time spent in garbage collection. The\ninvestigation found two separate effects:\n\n1. Shared write buffers reduce retained heap, which can cause Go to\ncollect more frequently depending on the application\u0027s GC settings.\n2. `bufWriter.Flush` copies the buffer\u0027s slice header into a local\nvariable and passes its address to the pool. That local variable escapes\nto the heap, adding one 24-byte allocation to every write and flush\ncycle.\n\nThis PR only fixes the second issue.\n\nThe writer now keeps the pointer returned by the pool while the buffer\nis in use and returns that same pointer after flushing. It also releases\nthe buffer when a network write fails before the normal `Flush` path.\n\nThe benchmark added in this change can be run with:\n\n```console\ngo test ./internal/transport -run \u0027^$\u0027 -bench \u0027^BenchmarkBufWriter/Shared/WriteAndFlush$\u0027 -benchmem -count\u003d10\n```\n\nResults on an Apple M4 Pro with Go 1.26.5:\n\n```text\nbefore: 24.2-26.2 ns/op, 24 B/op, 1 alloc/op\nafter:  13.5-13.9 ns/op,  0 B/op, 0 alloc/op\n```\n\nTests run:\n\n```console\ngo test -cpu 1,4 -timeout 7m ./internal/transport\ngo test -race -cpu 1,4 -timeout 7m ./internal/transport\n```\n\nRELEASE NOTES:\n* transport: Avoid a heap allocation when flushing the write buffer."
    },
    {
      "commit": "6f508fa56defb27c00e5d67d8b7533528c987780",
      "tree": "ea57543f465203a7df69cca259cf89d5f9ee3653",
      "parents": [
        "ff0b87f86bc6ce096b77cf6a1c3797c2e3ec7934"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Thu Jul 30 07:24:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 07:24:52 2026"
      },
      "message": "xds/extproc: adds ClientInterceptor and ClientStream implementation for observability mode for gRFC A93 (#9180)\n\nThis PR does the following :\n- Abstract out common struct fields and functions for normal and\nobservability mode into `commonStream` and methods on `commonStream`\n- Add implementation of NewStream and ClientStream for observability\nmode for [A93:\nxds-ext-proc](https://github.com/grpc/proposal/blob/master/A93-xds-ext-proc.md).\n- Add metrics for observability mode\n- Move the storing of true for `HeaderSent` and `trailerSent` to just\nbefore calling the send on proc stream to avoid races where the message\nis sent on the stream and received by other goroutine but the flag is\nnot flipped to true , this fails the stream , even when it should not.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "ff0b87f86bc6ce096b77cf6a1c3797c2e3ec7934",
      "tree": "e6352195cb034202593606650b1215c4aded4ab2",
      "parents": [
        "4fdb83e4a48b3a29b8d9b592fc20362b80da9cfb"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Thu Jul 30 06:07:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 06:07:07 2026"
      },
      "message": "transport: Fix data race on loopyWriter.estdStreams in AccountCheck tests (#9241)\n\n#### Root Cause:\n- When ping-pong loops finished, `testFlowControlAccountCheck` accessed\n`st.loopy.estdStreams[id]` and `client.loopy.estdStreams[id]` directly.\n- Because `loopyWriter.estdStreams` is private and unsynchronized\n(`loopyWriter.run(`) assumes sole ownership), reading from this map\nacross goroutines raced with `cleanupStreamHandler` deleting streams\nduring timeouts or stream shutdown.\n- Furthermore, when client stream goroutines encountered errors (e.g.\nDeadlineExceeded) during ping-pongs, wg.Wait() returned while t.Errorf()\nallowed the main test goroutine to continue inspecting broken streams.\n\n#### Solution:\n- Added `outStreamRequestForTesting` to `controlBuf`. This allows tests\nto retrieve `*outStream` pointers safely from within `loopyWriter.run()`\nwithout racing on `estdStreams`.\n- Fail early on ping-pong goroutine failures.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "4fdb83e4a48b3a29b8d9b592fc20362b80da9cfb",
      "tree": "6e0d72bdd01fd125f4820b2d58d85ef3e6a3e6ac",
      "parents": [
        "89d4d61eef38276f3f91954fb81013c888478db6"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Thu Jul 30 04:38:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 04:38:28 2026"
      },
      "message": "xds/rbac: avoid nil deref on unset CidrRange prefix_len (#9250)\n\n`newRemoteIPMatcher` and `newLocalIPMatcher` build the CIDR string from\n`cidrRange.PrefixLen.Value`, dereferencing the `PrefixLen` wrapper field\ndirectly. An RBAC policy from the control plane whose\n`destination_ip`/`direct_remote_ip`/`source_ip`/`remote_ip` CidrRange\nsets `address_prefix` but leaves `prefix_len` unset makes `PrefixLen \u003d\u003d\nnil`, so `NewChainEngine` panics while the resource is parsed. Nothing\nrecovers on the xdsclient decode path, so the process goes down.\n\nRELEASE NOTES:\n- xds/rbac: Fix a potential panic when parsing a CIDR range that does\nnot contain a prefix length."
    },
    {
      "commit": "89d4d61eef38276f3f91954fb81013c888478db6",
      "tree": "f09c956070be2b9d7e5fad0f858a364de76f22ab",
      "parents": [
        "622a41d35dcbd9df987023d292bbca18812311c7"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Jul 28 05:47:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 05:47:07 2026"
      },
      "message": "xds/resolver: ensure OnCommitted is invoked on early stream creation failure to prune unreferenced clusters. (#9140)"
    },
    {
      "commit": "622a41d35dcbd9df987023d292bbca18812311c7",
      "tree": "43f792c765e029c946f87577730484130371d7c7",
      "parents": [
        "216640cad7394846427b78a276dc5371cdca840d"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Mon Jul 27 21:55:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 21:55:17 2026"
      },
      "message": "xds/clusterimpl: fix uint32 overflow computing EDS drop ratio (#9257)\n\nhandleClusterConfigLocked turns each EDS drop_overload into a\nper-million rate with `Numerator * million / Denominator` in uint32. The\nnumerator comes from the control plane and reaches a million for a 100%\ndrop, so with the million denominator the product overflows a uint32\nonce the numerator hits 4295 (a 0.43% drop), and the rate then collapses\ntoward zero: a 50% drop computes to 0.18% and a 100% drop to 0.36%. A\nfraction above 100% instead lands `RequestsPerMillion` above a million,\nwhich underflows `million - RequestsPerMillion` in newDropper.\n\nMove the computation into `dropRequestsPerMillion`, which multiplies in\nuint64 and caps the ratio at a million. Keeping the clamp next to the\narithmetic that builds DropConfig leaves the raw numerator and\ndenominator on the parsed resource and applies drops at the configured\nrate.\n\nRELEASE NOTES:\n* xds: fix xDS EDS drop policies being applied at a much lower rate than\nconfigured due to an integer overflow"
    },
    {
      "commit": "216640cad7394846427b78a276dc5371cdca840d",
      "tree": "956fa60f3a13d2ad2595dcd5036c0962b980b155",
      "parents": [
        "2cb274b7aafb7bd54891ede276c6da0dad7f3c54"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Fri Jul 24 20:52:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 20:52:24 2026"
      },
      "message": "metadata: re-add MD.String with redaction of sensitive metadata (#9231)\n\nFixes #7395\n\nMD.String was removed in #7372 because it could leak credentials orother\nsensitive metadata when an MD was logged (e.g. via log(md)).etcd, the\nmain consumer relying on the old behavior, has since stoppeddepending on\nit, so it is safe to re-add. This restores MD.String in aredacting form:\nit prints keys and values only for a fixed allowlist ofnon-sensitive\ngRPC/HTTP2 protocol headers, and omits (best effort) every other\nkeyentirely (key name included, since a key name may itself be\nsensitive),reporting only the count as \u003cN redacted\u003e.\n\nRELEASE NOTES:\n* metadata: re-add MD.String, which now prints only an allowlist of\nnon-sensitive protocol headers and redacts all other metadata, to help\navoid accidentally logging credentials or other sensitive data"
    },
    {
      "commit": "2cb274b7aafb7bd54891ede276c6da0dad7f3c54",
      "tree": "175321a417bd84350efd2af47fe88144f30571f8",
      "parents": [
        "29193c50a47bced2f0f866a2476c34ccf5608f22"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Jul 24 20:22:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 20:22:22 2026"
      },
      "message": "extproc: retrieve correct error status when Send fails with io.EOF (#9270)\n\nFixes: https://github.com/grpc/grpc-go/issues/9269\n\nWhen the proc server fails abruptly , if it fails before the Send for\nrequest header is called , we will get an io.EOF error which needs to be\nretrived using Recv.\nIf the proc server fails after the Send for request header, i.e. the\nSend returns nil, the correct error will automatically be retrieved by\nRecv run in the background loop in `recvFromProcServer`.\nSo , because of this race between the proc server failing and Send being\ncalled for request header , the test was flaking.\nWe need to get the correct error when Send for header req fails with\nio.EOF.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "29193c50a47bced2f0f866a2476c34ccf5608f22",
      "tree": "63b82be1c609c43ce633b8f1922e7e3a91356074",
      "parents": [
        "db324f15f4ffb7f32bcf7b5830d20f84ad4ec3e5"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Fri Jul 24 20:18:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 20:18:34 2026"
      },
      "message": "github: Add a workflow to the govulncheck (#9242)\n\nContext: https://words.filippo.io/dependabot/\n\nRELEASE NOTES: none"
    },
    {
      "commit": "db324f15f4ffb7f32bcf7b5830d20f84ad4ec3e5",
      "tree": "46c5fd5c31803df97f0d91963c168088c44d1168",
      "parents": [
        "2cc55737ec5c75304d3408b40d62d24a6caee2de"
      ],
      "author": {
        "name": "Elric",
        "email": "tbnsok40@gmail.com",
        "time": "Fri Jul 24 17:17:29 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 17:17:29 2026"
      },
      "message": "outlierdetection: convert pick_first health listener test to e2e (#9252)\n\nAddresses #8658\n\nRELEASE NOTES: N/A"
    },
    {
      "commit": "2cc55737ec5c75304d3408b40d62d24a6caee2de",
      "tree": "dd731d5e6dcf35abdfc2a6f521ea4bfc41b41ef9",
      "parents": [
        "e57a05f0ecdcfaeae917795b9ed4cacce9254e61"
      ],
      "author": {
        "name": "Krishna Swaroop K",
        "email": "kkrishnaswaroop99@gmail.com",
        "time": "Fri Jul 24 09:44:40 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 09:44:40 2026"
      },
      "message": "transport: presize header slice for outgoing metadata (#9243)\n\n`createHeaderFields` pre-sizes the `headerFields` slice, but the\nestimate omits the outgoing metadata (`md` and `added` from the outgoing\ncontext, plus `t.md`). For RPCs that propagate context headers (tracing,\ntenancy, routing, etc.), the slice starts at capacity ~8 and grows once\nor twice via `append` on nearly every call.\n\nThis change fetches the raw outgoing metadata once, adds its field count\nto `hfLen`, and reuses the fetched maps in the append loop below.\nReserved headers are dropped when writing, so this may slightly\nover-count, which is preferable to growing the slice.\n\nRELEASE NOTES: none\n\nSigned-off-by: Krishna Swaroop \u003ckrishna.swaroop@uber.com\u003e"
    },
    {
      "commit": "e57a05f0ecdcfaeae917795b9ed4cacce9254e61",
      "tree": "257201bdd42c2a2adddbaa3c753a2acf1aa818d4",
      "parents": [
        "2ac9758690501187e3f181e3ff1580ac6d6fd934"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Fri Jul 24 09:36:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 09:36:08 2026"
      },
      "message": "xds: convert rds header exact/prefix/suffix/contains matches to StringMatcher (#9223)\n\nThe RDS parser stored a header matcher\u0027s exact_match, prefix_match, or\nsuffix_match without checking for the empty string, so a route carrying\n`exact_match: \"\"` (a valid proto oneof selection) was accepted.\nRouteToMatcher later tested those fields with `*h.X !\u003d \"\"` and treated\nan empty value as unset, so it fell through every arm of its header\nswitch to `panic(\"illegal route: missing header_match_specifier\")`. That\nruns when the client resolver builds a config selector and when the\nserver processes an inline route config, neither behind a recover, so a\nmanagement server could crash the client or an xds-enabled server with a\nsingle route.\n\nPer review feedback, instead of adding per-field empty checks the parser\nnow converts the deprecated exact_match, prefix_match, suffix_match, and\ncontains_match fields to the equivalent StringMatcher and runs them\nthrough matcher.StringMatcherFromProto, so validation for all of them is\nconsolidated in one place. As a result:\n\n* an empty prefix_match, suffix_match, or contains_match is rejected and\nthe resource is NACKed\n* an empty exact_match is accepted and matches an empty header value,\nper StringMatcher semantics, instead of panicking\n* contains_match is now supported for route header matching\n* RouteToMatcher drops its per-field `!\u003d \"\"` special casing, and the\nExactMatch/PrefixMatch/SuffixMatch fields are removed from the internal\nHeaderMatcher type\n\nRELEASE NOTES:\n* xds: fix a panic parsing a route whose header matcher has an empty\nexact_match, prefix_match, or suffix_match, and add support for\ncontains_match in route header matchers"
    },
    {
      "commit": "2ac9758690501187e3f181e3ff1580ac6d6fd934",
      "tree": "0bc013dcd6a2fc99048d2eee3198bd347d08e60e",
      "parents": [
        "62a23f6f891c2f536daf1c2aab36bdc2cc024458"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Jul 24 08:49:16 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 08:49:16 2026"
      },
      "message": "extproc: fix usages of testgrpc in test (#9266)\n\nRELEASE NOTES: None"
    },
    {
      "commit": "62a23f6f891c2f536daf1c2aab36bdc2cc024458",
      "tree": "33faa71cae3457c57f8d381b6572aee019acc0fa",
      "parents": [
        "9c1cbb13875ecf21eb6d49ce12537eaae9168db7"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Jul 24 08:09:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 08:09:03 2026"
      },
      "message": "extproc: fix usages of v3extprocservicegrpc in test (#9265)\n\nRELEASE NOTES: None"
    },
    {
      "commit": "9c1cbb13875ecf21eb6d49ce12537eaae9168db7",
      "tree": "61f3b4a90e30629eb04ff42001c1ed492b992252",
      "parents": [
        "118203eb3a2e7b13056102cfd198be57a53d71fc"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Fri Jul 24 07:44:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 07:44:28 2026"
      },
      "message": "opentelemetry: initialize attemptInfo with fields set  (#9262)\n\nFixes: #9097\n\nPreviously, if only tracing was enabled, the server-side span name would\nnot be correctly populated (falling back to \"Recv.\") because the method\nname population logic was only present in the metrics handler\u0027s TagRPC\nmethod.\n\nThis change fixes this by:\n* Moving the common client RPC info initialization (including start time\nand method name) to `getOrCreateClientRPCInfo`.\n* Moving the common server RPC info initialization (including start\ntime, method name, and method filtering/validation logic) to\n`getOrCreateServerRPCInfo`.\n* Updating both client and server metrics and tracing handlers to use\nthese shared helper functions. This ensures that\nthe RPC info is correctly initialized by whichever handler executes\nfirst.\n\nRELEASE NOTES:\n* opentelemetry: ensure method names are correctly set in trace spans\nwhen metrics are disabled."
    },
    {
      "commit": "118203eb3a2e7b13056102cfd198be57a53d71fc",
      "tree": "9d17f6ae9f730a2df8c5e7589515314b2a7c97b8",
      "parents": [
        "116e945bb68b03851b971a3547d4a606c2feadf8"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Jul 24 06:23:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 06:23:47 2026"
      },
      "message": "extproc: fix the v3procservicegrpc usage (#9264)\n\nRELEASE NOTES: None"
    },
    {
      "commit": "116e945bb68b03851b971a3547d4a606c2feadf8",
      "tree": "ada339c43b468bd775b18a04768ba11a5aa520ae",
      "parents": [
        "66565359b648193558c87148a43449a1b81b7cde"
      ],
      "author": {
        "name": "Luca Cucchetti",
        "email": "43192486+lucacucchetti@users.noreply.github.com",
        "time": "Fri Jul 24 05:12:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 05:12:53 2026"
      },
      "message": "resolver: log resolver state updates at verbosity 2 (#9261)\n\nFixes #9210\n\naddChannelzTraceEvent logs the full resolver.State (via pretty.ToJSON)\non every UpdateState/NewAddress. The #7437 guard `!logger.V(0) \u0026\u0026\n!channelz.IsOn()` does not fire at the default verbosity (logger.V(0) is\ntrue), so with channelz off the whole state is marshalled on every\nupdate only to be discarded by the default ERROR-level logger. See #9210\nfor benchmarks and analysis.\n\nV(2) is the verbosity used for detailed logs throughout the tree (this\nwas the only V(0) gate). channelz, when enabled, still records the\nevent.\n\nBehavior change: at the default verbosity the \"Resolver state updated\"\nmessage no longer logs; it now requires -v 2.\n\nRELEASE NOTES:\n* resolver: only log resolver state updates at verbosity 2 or higher,\navoiding a full marshal of the resolver state on every update when\nchannelz is off and verbose logging is disabled"
    },
    {
      "commit": "66565359b648193558c87148a43449a1b81b7cde",
      "tree": "123a47975cad6a46b12d34c082306c94173462ad",
      "parents": [
        "b6eac429d7b60eb080346a21ecc631c60df603fe"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Thu Jul 23 21:48:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 21:48:46 2026"
      },
      "message": "xds/extproc: adds ClientInterceptor and ClientStream implementation for normal mode for gRFC A93 (#9174)\n\nThis PR add implementation of NewStream and ClientStream for normal mode\nfor [A93:\nxds-ext-proc](https://github.com/grpc/proposal/blob/master/A93-xds-ext-proc.md).\nThis PR does not include channel retention , metrics and observability\nmode.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "b6eac429d7b60eb080346a21ecc631c60df603fe",
      "tree": "d1a9651e957009044c7fa81c0754374ceadc2e8a",
      "parents": [
        "25387aabbf6861b80db644465e823c2e8b427090"
      ],
      "author": {
        "name": "Yusuf İhsan Görgel",
        "email": "developeryusuf@icloud.com",
        "time": "Thu Jul 23 09:34:37 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 09:34:37 2026"
      },
      "message": "grpc: fix plan9 build by moving errno matching to a !plan9 file (#9255)\n\nFixes #9253\n\n`disconnectErrorString` (added for gRFC A94 in #8973) references\n`syscall.Errno`, `syscall.ECONNRESET` and `syscall.ECONNABORTED`, none\nof which exist on plan9, so `GOOS\u003dplan9 go build` fails on every release\nsince v1.81.0.\n\nThis moves the error-to-label classification into `disconnectErrorLabel`\nwith two implementations: a `!plan9` file with the existing errno\nmatching, unchanged in behavior, and a plan9 file that keeps the\nportable classifications (`subchannel shutdown`, `connection timed out`,\n`unknown`). Only plan9 is excluded so the errno granularity on js/wasm\nand wasip1, where `syscall.Errno` exists, stays as it is today.\n\nVerified `GOOS\u003dplan9 GOARCH\u003damd64 go build ./...` fails on master and\npasses with this change, and `go build` plus the root package tests\nstill pass on linux and darwin.\n\nRELEASE NOTES:\n\n* grpc: fix compilation on plan9, broken since v1.81.0."
    },
    {
      "commit": "25387aabbf6861b80db644465e823c2e8b427090",
      "tree": "b36e8414a988e3ac0aaa4c2e21f384e8cc76b083",
      "parents": [
        "081051cebab0e4e0a7dc3fbd35c67770959cdb67"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Jul 22 16:28:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 16:28:35 2026"
      },
      "message": "all: update deps after 1.83 branch cut (#9232)\n\nUpdated the dependencies by performing the following steps:\n\n- Use the latest toolchain\n```\nLATEST_GO_VERSION\u003d$(go list -m go@latest | awk \u0027{print $2}\u0027)\nexport GOTOOLCHAIN\u003d\"go${LATEST_GO_VERSION}+auto\"\n```\n\n- Run the following twice \n```\n# The sort is needed to make \u0027.\u0027 happen before subdirectories.\nfor x in $(find . -name \u0027go.mod\u0027 | xargs dirname | sort); do\n  pushd \"${x}\"\n  go get -u ./...\n  go mod tidy -compat\u003d1.25\n  popd\ndone\n```\n\nTested using:\n```\n./scripts/vet.sh\n```\n\nRELEASE NOTES: none"
    },
    {
      "commit": "081051cebab0e4e0a7dc3fbd35c67770959cdb67",
      "tree": "5eafe09eac83eec029ce33ffaa8f8401422c3e77",
      "parents": [
        "506edc46b7a4e516fc7c2e07e7f72a72abe000e3"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Wed Jul 22 05:22:43 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 05:22:43 2026"
      },
      "message": "grpc: move different type RPC handling out of underlying stream implementations (#9226)\n\nThis PR refactors and extracts stream-type-specific logic into a\ndedicated interceptor and stream wrapper to simplify the underlying\nstream transport implementations and also simplify these xDS http filter\nimplementations.\n\n- Introduced `clientStreamWrapper`: Added a wrapper in `stream.go` that\nintercepts `SendMsg`, `CloseSend`, and `RecvMsg`. It inspects the\n`StreamDesc` to conditionally apply specific behaviors, like converting\n`io.EOF` to nil on `SendMsg` for non-client-streaming RPCs, auto-calling\nCloseSend, and checking for cardinality violations after receiving a\nmessage in non-server-streaming RPCs.\n\n- Added `defaultStreamInterceptor`: Created a default interceptor that\napplies this wrapper to all client streams.\n\n- Registered the Default Interceptor: Updated\n`chainStreamClientInterceptors` in `clientconn.go` to prepend\n`defaultStreamInterceptor` to the interceptor chain.\n\n- Cleaned up `call.go` and internal streams: Removed the now-redundant\nEOF checking, Recv calls and cardinality checks from the lower-level\ntransport functions in `stream.go`\n\nRELEASE NOTES: None"
    },
    {
      "commit": "506edc46b7a4e516fc7c2e07e7f72a72abe000e3",
      "tree": "5718f9f645e0f39ca789e07e519dd6daa920d95a",
      "parents": [
        "75f3c0bb28669b4ba74dd57d836a568dd1b250ac"
      ],
      "author": {
        "name": "Arjan Singh Bal",
        "email": "46515553+arjan-bal@users.noreply.github.com",
        "time": "Tue Jul 21 17:48:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 17:48:56 2026"
      },
      "message": "pickfirstleaf: remove deprecated package (#9254)\n\nThe experimental and deprecated package contained aliases designed to\nhelp users migrate to symbols of the same name in the `pickfirst`\npackage. These deprecated symbols have been in place since #8672, which\nwas included in the gRPC-Go 1.77 release.\n\nRELEASE NOTES:\n* pickfirstleaf: remove the deprecated\n[`pickfirstleaf`](https://pkg.go.dev/google.golang.org/grpc@v1.82.1/balancer/pickfirst/pickfirstleaf)\npackage. Please use symbols with the same name from the\n[`pickfirst`](https://pkg.go.dev/google.golang.org/grpc@v1.82.1/balancer/pickfirst)\npackage instead."
    },
    {
      "commit": "75f3c0bb28669b4ba74dd57d836a568dd1b250ac",
      "tree": "f752c9f5e1c9756320e537a88c0fb2198a8fd17f",
      "parents": [
        "7d870454ecb24dcadfa542ea6e5ab77c80a1db80"
      ],
      "author": {
        "name": "Utku Özdemir",
        "email": "utkuozdemir@gmail.com",
        "time": "Fri Jul 17 17:06:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 17:06:06 2026"
      },
      "message": "client: avoid finishing a stream twice when stream creation fails (#9191)\n\nIn `clientStream.withRetry`, when `newAttemptLocked` fails before an\nattempt is created, `withRetry` called `cs.finish` and then returned the\nerror. `newClientStream` also runs `endOfClientStream` from its deferred\ncleanup on an error return, so the stream was finished twice and every\n`grpc.OnFinish` callback ran twice for a single RPC, breaking its\ndocumented \"called only once\" contract.\n\nOne of those callbacks is the idleness manager\u0027s `OnCallEnd`. The extra\n`OnCallEnd` pushes the manager\u0027s int32 `activeCallsCount` one below its\n`-math.MaxInt32` idle sentinel and corrupts the counter. After that the\nchannel can get permanently stuck in IDLE, and later RPCs fail with\n\"context deadline exceeded while waiting for connections to become\nready\" even though the backend is reachable. It happens when RPCs are\ncanceled around the idle-timeout boundary.\n\nOn this path no attempt is created, so there is nothing to finish: the\ncontext is canceled by `newClientStreamWithParams`\u0027s deferred cleanup,\nand `newClientStream`\u0027s deferred `endOfClientStream` finishes the stream\nexactly once. Replace the `cs.finish` call with `cs.commitAttemptLocked`\nso the stream is still committed, releasing resources held for retries\nsuch as the config selector\u0027s `OnCommitted` callback, without being\nfinished a second time. This mirrors the `retryLocked` give-up path.\n\nAdd a regression test that fails before this change and passes after it.\n\nRELEASE NOTES:\n* client: Fix a bug where a ClientConn could get permanently stuck in\nIDLE after an RPC was canceled while the channel was exiting idle mode"
    },
    {
      "commit": "7d870454ecb24dcadfa542ea6e5ab77c80a1db80",
      "tree": "d51aa6d07bf974d5cff77d57ec5405aafaf2e7d9",
      "parents": [
        "a3ce08c70b14888b0855af96e6814edecf6ef808"
      ],
      "author": {
        "name": "Saloni Gupta",
        "email": "60051513+gh4683@users.noreply.github.com",
        "time": "Wed Jul 15 23:57:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 23:57:06 2026"
      },
      "message": "security/advancedtls: add SkipServerAuthEKU option to bypass server EKU verification (#9222)\n\nThis adds `SkipServerAuthEKU` option to `Options`. When set to `true`,\nthe client will verify server certificates using `x509.ExtKeyUsageAny`\ninstead of requiring `x509.ExtKeyUsageServerAuth`. This is useful when\nthe server\u0027s certificate does not possess the Server Auth EKU.\n\nBUG\u003d528004991\n\nRELEASE NOTES:\n* security/advancedtls: Add `SkipServerAuthEKU` option to skip EKU check\nduring server authentication."
    },
    {
      "commit": "a3ce08c70b14888b0855af96e6814edecf6ef808",
      "tree": "47d7b00db619fc215826ef0bf19c2bdfb296a283",
      "parents": [
        "be1b06d6315b660321f3e3e5734184ddab78ba95"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Jul 15 22:08:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 22:08:00 2026"
      },
      "message": "transport: delete unused field \"wq\" in \"serverHeaders\" (#9237)\n\nRELEASE NOTES: none"
    },
    {
      "commit": "be1b06d6315b660321f3e3e5734184ddab78ba95",
      "tree": "8eefeed2c93086cbc804700b7a0d3bfa7580f569",
      "parents": [
        "f8a85fa4d1dec72ace513a97ff27c60252de7c4d"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Wed Jul 15 21:00:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 21:00:20 2026"
      },
      "message": "Merge commit from fork\n\nSee individual commits for details.\n\nCommit #1\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\ntransport: Enforce overall limit on controlBuffer size\n\nThis change introduces an overall limit on the number of items in the\ncontrolBuffer. Once this limit is reached, reading from the wire is\nstopped to give the transport enough time to process items in the\ncontrolBuffer.\n\nHEADERS and DATA frames don\u0027t count towards the throttling limit.\n\nEarlier, throttling was only applied to frames that were considered to\nresult in control frames being written on the transport. But this was\nfound insufficient in some cases involving RapidReset and MadeYouReset.\n\nOther changes:\n* Split the client and server headers into separate structs\n* Increase the throttling limit to 100 (since more items are being\n  throttled now)\n\nCommit #2\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nxds/rbac: Fix multiple deviations in implementation from A41 spec\n\nSummary of changes:\n* Handle Metadata and RequestedServerName permissions.\n* Fix panic in xDS RBAC engine when parsing unsupported fields in\n  NotRule/NotId permissions in matchers.go.\n* Support the deprecated `source_ip` principal identifier by\n  treating it as equivalent to `direct_remote_ip`."
    },
    {
      "commit": "f8a85fa4d1dec72ace513a97ff27c60252de7c4d",
      "tree": "c545c60c25a2d29b92375eb3e6c89a22027a312e",
      "parents": [
        "6032468578ead3cc0f79bb52b69014d25fb20b71"
      ],
      "author": {
        "name": "Naveed",
        "email": "naveed@bugqore.com",
        "time": "Tue Jul 14 20:53:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 20:53:22 2026"
      },
      "message": "xds: reject EDS drop policy with unsupported denominator (#9218)\n\n`parseDropPolicy` maps a `FractionalPercent` denominator to a divisor\nwith a switch that has no default, so an EDS `drop_overload` carrying an\nunknown denominator enum value leaves the divisor at 0. That value\nreaches `clusterimpl`, which evaluates `d.Numerator * million /\nd.Denominator`, and a management server sending such a resource crashes\nthe client with an integer divide-by-zero.\n\nReject the unsupported denominator while parsing the resource so it is\nNACKed, matching how `parseEDSRespProto` already errors on other\nmalformed fields. Validating in the parser keeps the balancer free of\ndivisor checks and stops one bad resource from taking down the client.\n\nRELEASE NOTES:\n- xds: Prevent divide-by-zero client crashes on unsupported EDS drop\npolicy denominators"
    },
    {
      "commit": "6032468578ead3cc0f79bb52b69014d25fb20b71",
      "tree": "c9c4b8b11786ee84fcd8e4fb9767f4c43fc79acd",
      "parents": [
        "e109b60ceaea4f85784134c11e312f50e78c4071"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Jul 14 20:25:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 20:25:08 2026"
      },
      "message": "internal: adds utility for refcounting and cleanup (#9189)\n\nThis PR adds the utility for refcounting objects and cleanups when the\nreferences go to zero.\n\nFor now it will be used for channel retention in A93 :Ext proc.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "e109b60ceaea4f85784134c11e312f50e78c4071",
      "tree": "2b0ad7f1e59dd8ef16f232440e2afe1f0676e94a",
      "parents": [
        "b07d146bf8477ff83edcc1429ba720ad06943688"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Jul 14 19:43:18 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 19:43:18 2026"
      },
      "message": "internal/buffer: make Unbounded buffer use generic type (#9196)\n\nRefactors internal/buffer.Unbounded (and its clone under\ninternal/xds/clients) to use generics ([T any]) instead of any. This\nimproves type safety and removes type assertions across consumers.\n\nRELEASE NOTES: None"
    },
    {
      "commit": "b07d146bf8477ff83edcc1429ba720ad06943688",
      "tree": "4fe4e0b5a88d361476184fb3c20fb0897e720b52",
      "parents": [
        "2a112a82f5c53ab3b89b5aa4a02b4195e2706879"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Tue Jul 14 06:08:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 06:08:36 2026"
      },
      "message": "Change version to 1.84.0-dev (#9230)\n\nRELEASE NOTES: none"
    },
    {
      "commit": "2a112a82f5c53ab3b89b5aa4a02b4195e2706879",
      "tree": "5d3c25d3dab5841daa06a329f3f0198e50e7e265",
      "parents": [
        "1a80fca960d39ae4d7d6f2d9323ca2d243fd44bb"
      ],
      "author": {
        "name": "Keith Collister",
        "email": "hnefatl@users.noreply.github.com",
        "time": "Wed Jul 08 11:25:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 11:25:41 2026"
      },
      "message": "authz: add onPolicyUpdate callback to authz file watcher (#9142)\n\nSmall additional capability, so user code can tell when a new policy has\nbeen loaded.\n\nOur current usecase is updating an opentelemetry metric to reflect the\npolicy version (~\u003d file mtime). We could just run a goroutine polling\nthe file separately, but then there\u0027s no guarantee that the authz policy\nhas actually been loaded - it could have failed parsing, or the process\ncould be CPU-starved, etc.\n\nRELEASE NOTES:\n* TBD"
    },
    {
      "commit": "1a80fca960d39ae4d7d6f2d9323ca2d243fd44bb",
      "tree": "6128fa1177ee5ecec22b5f235c8af113bb611669",
      "parents": [
        "26ffdb33175d6fb4e56bcb598fb1a56162397091"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Fri Jul 03 08:05:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 08:05:09 2026"
      },
      "message": "vet: adds a check to disallow usage of regex.Compile in xDS code (#9216)\n\nFixes : https://github.com/grpc/grpc-go/issues/9153\nThis PR adds a check to disallow usage of `regex.Compile` in xDS code. \nExcludes the following from check :\n- all test files\n- internal/xds/matcher/string_matcher.go : because this is where\n`SafeRegex` function lives\n- unmarshal_rds.go - becuase `hashPoliciesProtoToSlice` needs to use it\nbecause it requires partial matches too , to replace the substring.\n\n\n\n\nRELEASE NOTES: None"
    },
    {
      "commit": "26ffdb33175d6fb4e56bcb598fb1a56162397091",
      "tree": "8eea9c760db6c050f4f9d239e2978dbec8e31956",
      "parents": [
        "50139749cb5bc50dd672689549340fceac494c1b"
      ],
      "author": {
        "name": "Gregory Cooke",
        "email": "gregorycooke@google.com",
        "time": "Wed Jul 01 19:36:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 19:36:45 2026"
      },
      "message": "[tls] Add safety check in custom cert verification that peer cert chain is non-empty (#9214)\n\nAdd checks for no certs\n\nRELEASE NOTES: none"
    },
    {
      "commit": "50139749cb5bc50dd672689549340fceac494c1b",
      "tree": "7ccfa779e8488a9c597a3f82218f89a622d728eb",
      "parents": [
        "bd58bc07c4bc552859f758594a6605b5b27cd041"
      ],
      "author": {
        "name": "ulas",
        "email": "45449532+ulascansenturk@users.noreply.github.com",
        "time": "Wed Jul 01 11:37:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 11:37:25 2026"
      },
      "message": "internal/grpcsync: add ScheduleAndWait to CallbackSerializer (#9162)\n\nAdds `ScheduleAndWait` to `CallbackSerializer`. It schedules a callback\nand blocks until the callback has run. If the serializer was already\nclosed before the callback could be scheduled, it returns\n`ErrSerializerClosed`, so callers can tell whether the callback actually\nran.\n\nThis replaces the common pattern of calling `ScheduleOr` with a `done`\nchannel just to wait for a callback to finish.\n\nImplements the design discussed in #8501.\n\nFixes #8501\n\nRELEASE NOTES: none"
    },
    {
      "commit": "bd58bc07c4bc552859f758594a6605b5b27cd041",
      "tree": "88e4f642fcba8d5b45bf42ceb8dd46bfd4009bbb",
      "parents": [
        "484f1502aea22dbf8dc54df9aff26214b9c35e1a"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Wed Jul 01 11:36:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 11:36:21 2026"
      },
      "message": "internal/transport: increase test timeout locally in TestAccountCheckWindowSizeWithLargeWindow (#9182)\n\nFixes #9061 \n\n## Description\nThis PR addresses flaky timeout failures in the flow control\nverification test (`TestAccountCheckWindowSizeWithLargeWindow`).\n\n### Root Cause\nThe `testFlowControlAccountCheck` helper processes 5 concurrent streams\nwith 5 pingpong cycles of 1 MB messages (total 25 MB payload transfer).\nOn slow or resource-constrained environments, this concurrent network\noverhead can exceed the hardcoded 10-second `defaultTestTimeout`,\ncausing context timeouts, connection drops, and test failures.\n\n### Fix\nInstead of modifying the package-wide `defaultTestTimeout` (which could\ndelay detection of genuine deadlock failures in keepalive tests), this\nchange overrides the timeout locally:\n* Added helper functions `setUpServerOnlyWithTimeout` and\n`setUpWithOptionsAndTimeout` to support custom deadlines.\n* Overrode the timeout to `30 * time.Second` locally within\n`testFlowControlAccountCheck` for both connection setups and stream\ncontexts.\n\n### Verification\n* **Reproduction**: Artificially sleeping 3s per pingpong (requiring\n\u003e15s total) with the original 10s timeout reproduced the identical\ntimeout failures.\n* **Fix**: Retaining the 3s delay with the new 30s timeout allowed the\ntest to pass successfully in 15.10s. All other package tests pass\nsuccessfully.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "484f1502aea22dbf8dc54df9aff26214b9c35e1a",
      "tree": "af4f95e8d9c4df4d111f7a7c79df75287b75904e",
      "parents": [
        "1eb52d9b6ee11ba952f2d2127402c4e7b4ab379b"
      ],
      "author": {
        "name": "eshitachandwani",
        "email": "59800922+eshitachandwani@users.noreply.github.com",
        "time": "Tue Jun 30 12:57:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 12:57:35 2026"
      },
      "message": "httpfilter/extproc: add check to ensure that response trailer mode must be SEND if response body mode is GRPC (#9209)\n\nAdds a check to ensure response trailer mode is Send if response body\nmode is GRPC as part of parsing the extproc filter config.\n\n#ext-proc-a93\n\nRELEASE NOTES: None"
    },
    {
      "commit": "1eb52d9b6ee11ba952f2d2127402c4e7b4ab379b",
      "tree": "c3d34736500094604f57f9dc1726475a439012a2",
      "parents": [
        "d74861eb76cc713fae3ffd381e4f25c5d1324111"
      ],
      "author": {
        "name": "Easwar Swaminathan",
        "email": "easwars@google.com",
        "time": "Mon Jun 29 18:02:13 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 18:02:13 2026"
      },
      "message": "gcp_authn: remove unnecessary import rename (#9212)\n\nThe import script doesn\u0027t like this.\n\nRELEASE NOTES: none"
    },
    {
      "commit": "d74861eb76cc713fae3ffd381e4f25c5d1324111",
      "tree": "6e359165697ff67a6e31ada7775f72f14f07b25c",
      "parents": [
        "83728f5ca723fa46aade15675594418f396db991"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Thu Jun 25 20:20:06 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 20:20:06 2026"
      },
      "message": "xds/gcp_authn: implement GCP Authentication filter (gRFC A83). (#9119)\n\nThis PR implements the xDS GCP Authentication HTTP filter for gRPC-Go,\nas specified in [gRFC\nA83](https://github.com/grpc/proposal/blob/master/A83-xds-gcp-authn-filter.md).\n\nThe implementation provides a mechanism for attaching service account\nidentity JWT tokens as gRPC call credentials on GCP, featuring a\ntwo-level caching strategy (filter-level cache of credentials objects\nand credential-level cache of tokens) to minimize latency and metadata\nserver load.\n\nRELEASE NOTES:\n* xds: add support for the GCP Authentication HTTP Filter. It\nautomatically fetches and attaches GCP Service Account Identity JWT\ntokens to outgoing RPCs. This feature is currently gated behind the\n`GRPC_EXPERIMENTAL_XDS_GCP_AUTHENTICATION_FILTER` environment variable."
    },
    {
      "commit": "83728f5ca723fa46aade15675594418f396db991",
      "tree": "29dc718fc6aa452bf177b6303728a7133f23b028",
      "parents": [
        "11d0baf8345f0867201e2d1e78292e68ac05bd30"
      ],
      "author": {
        "name": "Luwei Ge",
        "email": "lwge@google.com",
        "time": "Thu Jun 25 16:40:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 16:40:17 2026"
      },
      "message": "credentials/alts: fix alts record ensures the frame size is bigger than the message type field size (#9197)\n\nRELEASE NOTES: \n* credentials/alts/internal/conn: ALTS record protocol correctly checks\nthe length of the message frame to ensure it\u0027s bigger than the message\ntype field size.\n\n---------\n\nCo-authored-by: Easwar Swaminathan \u003ceaswars@google.com\u003e"
    },
    {
      "commit": "11d0baf8345f0867201e2d1e78292e68ac05bd30",
      "tree": "af48e3e629248a1132de85cfa369cb7cc102f42c",
      "parents": [
        "8d66cfc36ad17184269e7dfe62da865921f0773a"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Wed Jun 24 08:07:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 08:07:47 2026"
      },
      "message": "credentials/google: make a non-blocking and context-aware call to fetch token. (#9184)\n\nThis PR is a follow-up to [PR\n#9118](https://github.com/grpc/grpc-go/pull/9118), refactoring the newly\nadded GCP Service Account Identity call credentials to fetch tokens\nasynchronously and pass a 60 sec context timeout.\n\nPreviously, if a valid token was not cached, GetRequestMetadata\nperformed a blocking synchronous call to\n`creds.TokenProvider.Token(context.Background())`. This block occurred\nwhile holding the c.mu mutex lock, which blocked all other concurrent\nmetadata retrievals. Additionally, the token fetch did not have a\ntimeout and relies on the 15 sec timeout that metadata server works\nwith.\n\nThis PR refactors the credential to:\n* Run the token fetch in a background goroutine, releasing the mutex\nlock during the network call.\n* Deduplicate concurrent fetches using a channel broadcast pattern.\n* Allow waiting RPCs to unblock immediately if their context is canceled\nor expires.\n* Bound the background fetch itself with a defensive 60-second timeout.\n\nRELEASE NOTES: N/A\n\n---------\n\nCo-authored-by: Easwar Swaminathan \u003ceaswars@google.com\u003e"
    },
    {
      "commit": "8d66cfc36ad17184269e7dfe62da865921f0773a",
      "tree": "ee4fa8a51e5a576369f7f781786478d4c8b88f84",
      "parents": [
        "5c7f93679ec9a831acce68b7368c1cb555484a9c"
      ],
      "author": {
        "name": "Marcin Swierczek",
        "email": "mswierczek@google.com",
        "time": "Mon Jun 22 05:37:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 05:37:34 2026"
      },
      "message": "xds: handle receipt of server-side listener resource on the client, and vice-versa (#9152)\n\nFixes https://github.com/grpc/grpc-go/issues/8114\n\nThis PR provides:\n1. Fix for an xDS client that should move to TRANSIENT FAILURE state\nwhen receive a server-side listener (`TCPListener` is not `nil`) and do\nnot receive a client-side listener (`APIListener` is `nil`).\n2. Test case for a client receiving a server-side configuration.\n3. **Additionally**: The server-side moves into NON-SERVING mode when\n`TCPListener` is `nil`.\n4. **Additionally**: Test cases for server-side moving into NON-SERVING\nmode due to misconfiguration.\n\nRELEASE NOTES:\n- xds: handle receipt of server-side listener resource on the client by\nmoving the grpc channel to TRANSIENT_FAILURE\n- xds: handle receipt of client-side listener resource on the server by\nmoving the server into NON-SERVING mode"
    },
    {
      "commit": "5c7f93679ec9a831acce68b7368c1cb555484a9c",
      "tree": "05cde5e6a8937a5c9a1c6c4f1fa49785d55808fa",
      "parents": [
        "9a130aad0775eec6d573e1c83a558f9039073b9c"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Fri Jun 12 12:03:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 12:03:10 2026"
      },
      "message": "xds: refactor xDS Client Interceptor API to support CallOption propagation. (#9168)\n\nThis PR refactors the client-side xDS HTTP filter interceptor API to\nsupport direct propagation of call options. This is a prerequisite for\nimplementing [gRFC\nA83](https://github.com/grpc/proposal/blob/master/A83-xds-gcp-authn-filter.md#a83-xds-gcp-authentication-filter),\nwhich requires filter interceptors to append new call credentials to the\nexisting call options during stream creation.\n\nRELEASE NOTES: N/A"
    },
    {
      "commit": "9a130aad0775eec6d573e1c83a558f9039073b9c",
      "tree": "7edabc184f6dd65867fca47f3b69c588ad7692fc",
      "parents": [
        "f1864955bbb48efa131f6652933fa8b2189d9305"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Thu Jun 11 18:52:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 18:52:30 2026"
      },
      "message": "xds: implement xDS-Based HTTP CONNECT support (gRFC A86). (#9151)\n\nThis PR implements support for xDS-Based HTTP CONNECT proxy [gRFC\nA86](https://github.com/grpc/proposal/blob/master/A86-xds-http-connect.md).\nThis enables configuring use of an HTTP CONNECT proxy dynamically via\nthe xDS control plane, allowing clients to tunnel connection requests\nthrough designated proxies before reaching backend destination\nendpoints.\n\nThe xDS HTTP CONNECT proxy is configured using the\n`Http11ProxyUpstreamTransport` transport socket wrapper, which is\ndelivered in the CDS transport_socket field. The proxy address is\nextracted dynamically from EDS metadata (endpoint or locality level).\n\n### Changes\n* CDS Upstream Transport Socket unwrapping (unmarshal_cds.go):\nAdded support to unwrap the `Http11ProxyUpstreamTransport transport`\nsocket wrapper inside `validateClusterAndConstructClusterUpdate()` when\nthe feature flag is enabled. Extracts and parses the nested\ntransport_socket (typically UpstreamTlsContext or nil/plaintext) to\nconfigure security exactly as if it had been defined directly on the\ncluster.\n\n* Dynamic Proxy Resolution \u0026 Routing (configbuilder.go): \nResolves the HTTP CONNECT proxy address by checking endpoint-level\nmetadata first, falling back to locality-level metadata if not found.\nWhen a proxy address is resolved, the CDS balancer injects proxy\nattributes (ConnectAddr) into the endpoint’s resolved address. This\ninstructs gRPC’s transport layer to dynamically establish an HTTP\nCONNECT tunnel through the resolved proxy instead of connecting directly\nto the backend.\n\nThis feature is guarded by the temporary environment variable\nGRPC_EXPERIMENTAL_XDS_HTTP_CONNECT.\n\nRELEASE NOTES: N/A"
    },
    {
      "commit": "f1864955bbb48efa131f6652933fa8b2189d9305",
      "tree": "695ec89374db935b65f779cbb75d517f0821092e",
      "parents": [
        "c76cc7f3920879703e4991b2ed32fd40ecebaefe"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Jun 09 19:44:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 19:44:28 2026"
      },
      "message": "credentials: add `GcpServiceAccountIdentityCallCredentials` call credentials type (gRFC A83). (#9118)\n\nThis PR implements `GcpServiceAccountIdentityCallCredentials`, a new\ncall credentials type required by [gRFC A83: xDS GCP Authentication\nFilter](https://github.com/grpc/proposal/blob/master/A83-xds-gcp-authn-filter.md#call-credentials).\nThis credential fetches and manages GCP Service Account Identity tokens\nfor a given audience, allowing gRPC services running on GCP to\nauthenticate RPCs.\n\n**Implementation Details \u0026 gRFC Deviations**\n\nThe gRFC provides detailed specifications for how this credential should\nmanually fetch tokens from the GCE metadata server, extract the exp\nfield, and manually calculate refresh intervals (e.g., refreshing 30\nseconds early).\n\nHowever, we have decided to use google auth library to fetch the token.\n\nIn Go, the standard Google API authentication packages\n(golang.org/x/oauth2/google) only provide access tokens, which are\nfundamentally different from the identity tokens required here.\n\nTo fetch identity tokens, we have decided to use the officially\nsupported Google Auth library for Go:\n`cloud.google.com/go/auth/credentials/idtoken`.\n\nThe library causes the following behavioral difference from gRFC.\n* Hardcoded early expiry: The idtoken package has its own internal logic\nand hardcoded values for when to proactively refresh a token (currently,\nit expires tokens 5 minutes early, not 30 seconds early as suggested by\nthe gRFC).\n* Execution: We rely on idtoken.NewCredentials to handle the HTTP\nrequests to the metadata server, extraction of the JWT, and cache\ninvalidation.\n\nNote: This PR is exact copy of #8974.\n\nRELEASE NOTES: N/A"
    },
    {
      "commit": "c76cc7f3920879703e4991b2ed32fd40ecebaefe",
      "tree": "c1270d1d818846016e4d8835fad19c87850fe8bf",
      "parents": [
        "bd197fbb2fdbc7c3a8c1664279521234d4661fc7"
      ],
      "author": {
        "name": "Pranjali-2501",
        "email": "87357388+Pranjali-2501@users.noreply.github.com",
        "time": "Tue Jun 09 18:47:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 18:47:52 2026"
      },
      "message": "xds/googlec2p: enable DirectPath over Interconnect support for on-prem clients (#9133)\n\nThis PR add support for on-premises clients using Google Cloud\nInterconnect to connect to GCP services via DirectPath by enabling a\nforced xDS/C2P resolver path.\n  \nChanges:\n- **Query Parameter Handling:** Updates the `google-c2p` resolver to\nparse call target URLs for the `force-xds` query parameter.\n- **Metadata Server Bypass:** When executing off-GCP, GCE Metadata\nServer queries for locality zone and IPv6 capability are bypassed.\n  - **Bootstrap Config:**\n- Omits the GCE locality zone structure from the bootstrap\nconfiguration.\n- Hardcodes the `TRAFFICDIRECTOR_DIRECTPATH_C2P_IPV6_CAPABLE` node\nmetadata flag to `true` since Interconnect is planned exclusively for\nIPv6 clients.\n- Formats the xDS Client Node ID using a prefix: `\"C2P-non-gcp-UUID\"`.\n    \nRELEASE NOTES:\n- xds/googlec2p: enable DirectPath over Interconnect support for\non-premises clients via the `force-xds` query parameter in target URI."
    },
    {
      "commit": "bd197fbb2fdbc7c3a8c1664279521234d4661fc7",
      "tree": "d3e9e4b4dc28ca206521f7225ff402e7c49bfa63",
      "parents": [
        "faa34bf170ceef07b9ada9bcd44dc6e16a55d1f4"
      ],
      "author": {
        "name": "Madhav Bissa",
        "email": "48023579+mbissa@users.noreply.github.com",
        "time": "Tue Jun 09 12:02:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 12:02:45 2026"
      },
      "message": "deps: update dependencies for all modules (#9173)\n\nRELEASE NOTES: N/A"
    }
  ],
  "next": "faa34bf170ceef07b9ada9bcd44dc6e16a55d1f4"
}
