)]}'
{
  "log": [
    {
      "commit": "8b5bbcf192aaac782e2fcf1ea2a6c7c90d9e3e1c",
      "tree": "99795b387f9210f8db9c77c62266a42ac861e629",
      "parents": [
        "01e36dacadb6ba4009c7ca5c8858a37336f95c77"
      ],
      "author": {
        "name": "Xuetao Li",
        "email": "m134679102365478@163.com",
        "time": "Thu Jun 25 01:29:23 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 09:29:23 2026 +0800"
      },
      "message": "[config] Decouple config reader and remove config package (#3449)\n\n* decouple config reader\n\n* complete delete config package"
    },
    {
      "commit": "01e36dacadb6ba4009c7ca5c8858a37336f95c77",
      "tree": "2e2a50f57491fdeed355299734bee95c648ed0e4",
      "parents": [
        "e0e291cd53f7eded6319b265e96362263969e382"
      ],
      "author": {
        "name": "翎",
        "email": "1820661379@qq.com",
        "time": "Mon Jun 22 12:40:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 12:40:58 2026 +0800"
      },
      "message": "refactor: remove root config compatibility bridge (#3448)"
    },
    {
      "commit": "e0e291cd53f7eded6319b265e96362263969e382",
      "tree": "40ff6805ae7899c84af6bdaa4b1c9d4e05e23cb1",
      "parents": [
        "ccb2f6609ac48c67659a1b48115118f85ab2bf75"
      ],
      "author": {
        "name": "Xuetao Li",
        "email": "m134679102365478@163.com",
        "time": "Mon Jun 22 01:22:47 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 09:22:47 2026 +0800"
      },
      "message": "docs: update filter README (#3447)"
    },
    {
      "commit": "ccb2f6609ac48c67659a1b48115118f85ab2bf75",
      "tree": "c2dac75f9bd6ab11faec3d0050af29081471e301",
      "parents": [
        "9fcee8d6907548cdec9614972d91b0f4bbf3c0bd"
      ],
      "author": {
        "name": "Oxidaner",
        "email": "80675726+Oxidaner@users.noreply.github.com",
        "time": "Fri Jun 19 22:42:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 22:42:42 2026 +0800"
      },
      "message": "refactor: migrate graceful shutdown config to global (#3386)\n\n* refactor: migrate graceful shutdown config to global\n\n* refactor: remove config dependency from graceful shutdown\n\n* refactor: centralize shutdown config defaults\n\n* fix: align graceful shutdown config logging\n\n* fix: protocol/triple/triple_protocol/triple_ext_test.go gRPC streaming does not support HTTP/1"
    },
    {
      "commit": "9fcee8d6907548cdec9614972d91b0f4bbf3c0bd",
      "tree": "2cb65f8b157aa9081b41d35610ff560877eb670f",
      "parents": [
        "0d97613232c3936d20d31c86e83fe969b5509be0"
      ],
      "author": {
        "name": "ヴァニラシ",
        "email": "2755364178@qq.com",
        "time": "Fri Jun 19 16:03:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 16:03:18 2026 +0800"
      },
      "message": "feat(triple): expose unary response metadata via call options (#3443)\n\n* feat(triple): expose unary response metadata via call options\n\n* fix(triple): capture unary response metadata on error\n\n* docs(client): clarify response metadata capture on errors\n\n* fix(triple): validate response metadata capture attributes\n\nSigned-off-by: Vanillaxi \u003c2755364178@qq.com\u003e\n\n* style(triple): format client test imports\n\n---------\n\nSigned-off-by: Vanillaxi \u003c2755364178@qq.com\u003e"
    },
    {
      "commit": "0d97613232c3936d20d31c86e83fe969b5509be0",
      "tree": "1df34c2f77c31a4a8b120a6a72f2d10d2e1040dc",
      "parents": [
        "43348b4b341ef024bb1139b4408380d8e80dd18d"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Thu Jun 18 19:39:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 19:39:26 2026 +0800"
      },
      "message": "fix(triple): skip unsupported compat trailer attachments (#3418)\n\n* fix(triple): skip unsupported compat trailer attachments\n\n* test(triple): format compat attachment test imports\n\n* test(triple): satisfy compat attachment lint"
    },
    {
      "commit": "43348b4b341ef024bb1139b4408380d8e80dd18d",
      "tree": "50dcc4c08ca7148dc99e195e8bbb8c32d4cfadeb",
      "parents": [
        "04b27a9bf6ea5f6ec58406234473863345065097"
      ],
      "author": {
        "name": "aias00",
        "email": "liuhongyu@apache.org",
        "time": "Thu Jun 18 12:36:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 12:36:32 2026 +0800"
      },
      "message": "fix(getty): check error before using buf in server Write (#3434)\n\nIn RpcServerPackageHandler.Write, both EncodeResponse and EncodeRequest\nwere using buf.Len() before checking err. If the encode call returns an\nerror, buf could be nil, causing a nil pointer panic. The client-side\nWrite already checks err first; this aligns server-side to the same\npattern.\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "04b27a9bf6ea5f6ec58406234473863345065097",
      "tree": "caf7e4a1d03161d6e1d8b674011228bcd762d46a",
      "parents": [
        "fcbbd092031d3b9e7f165fc2973c277a0d6791fa"
      ],
      "author": {
        "name": "aias00",
        "email": "liuhongyu@apache.org",
        "time": "Thu Jun 18 12:29:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 18 12:29:26 2026 +0800"
      },
      "message": "fix(loadbalance): fix data race in RoundRobin setWeight and increaseCurrent (#3435)\n\nThe weightedRoundRobin struct had mixed atomic and non-atomic access\nto the weight and current fields:\n- setWeight() used plain writes while Weight() used atomic.LoadInt64\n- increaseCurrent() read weight with a plain read while other methods\n  used atomic operations on the same field\n\nReplace all non-atomic accesses with atomic operations:\n- setWeight: use atomic.StoreInt64 for both weight and current\n- increaseCurrent: use atomic.LoadInt64 to read weight\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "fcbbd092031d3b9e7f165fc2973c277a0d6791fa",
      "tree": "d77f8a07340bfbf32a2bd92f27da006354a86522",
      "parents": [
        "93fe03a4962bb4f3e02e172141dd538df33be951"
      ],
      "author": {
        "name": "Stefano Maffeis",
        "email": "lesbass@gmail.com",
        "time": "Wed Jun 17 12:17:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 18:17:46 2026 +0800"
      },
      "message": "fix: toKey now uses configured hash.arguments indexes instead of slice positions (#3432)\n\n* fix: toKey now uses configured hash.arguments indexes instead of slice positions\n\nPreviously toKey iterated with `for i :\u003d range c.argumentIndex` which\nused the slice index (0,1,2,...) as the argument position to read from\nargs. With a configuration like hash.arguments\u003d1, this still read\nargs[0] instead of args[1], making consistent hashing route by the\nwrong argument.\n\nAlso replaced the unsafe args[i].(string) type assertion with\nfmt.Fprint to avoid panicking on non-string arguments.\n\nFixes: #3431\n\nSigned-off-by: RepoScout \u003creposcout@ai-newsroom.ai\u003e\nCo-Authored-By: Paperclip \u003cnoreply@paperclip.ing\u003e\n\n* fix: toKey now uses configured hash.arguments indexes and avoids fmt.Fprint for strings\n\nPreviously toKey iterated with `for i :\u003d range c.argumentIndex` which\nused the slice index (0,1,2,...) as the argument position to read from\nargs. With a configuration like hash.arguments\u003d1, this still read\nargs[0] instead of args[1].\n\nAdded a type switch so the common string case uses the cheaper\nsb.WriteString instead of fmt.Fprint.\n\nFixes: #3431\n\nSigned-off-by: RepoScout \u003creposcout@ai-newsroom.ai\u003e\nCo-Authored-By: Paperclip \u003cnoreply@paperclip.ing\u003e\n\n---------\n\nSigned-off-by: RepoScout \u003creposcout@ai-newsroom.ai\u003e\nCo-authored-by: RepoScout \u003creposcout@ai-newsroom.ai\u003e\nCo-authored-by: Paperclip \u003cnoreply@paperclip.ing\u003e"
    },
    {
      "commit": "93fe03a4962bb4f3e02e172141dd538df33be951",
      "tree": "7a2f692a7469bd674f84120593b143f07d553f68",
      "parents": [
        "e741e0e7e54ce1f7acda67e919eacb1e3519b440"
      ],
      "author": {
        "name": "aias00",
        "email": "liuhongyu@apache.org",
        "time": "Wed Jun 17 13:41:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 13:41:10 2026 +0800"
      },
      "message": "fix(loadbalance): prevent panic in consistent hash toKey for non-string args (#3430)\n\nThe hard type assertion args[i].(string) panics for any non-string\nargument (int, struct, etc.), while Java Dubbo uses toString() which\nnever fails. Replace with fmt.Fprint(\u0026sb, args[i]) which safely\nconverts any type to its string representation."
    },
    {
      "commit": "e741e0e7e54ce1f7acda67e919eacb1e3519b440",
      "tree": "8bfa047630057fa8091fdf183ffa4119d9d240fc",
      "parents": [
        "fd4dea4f8ccef79a3190ba1d4a60af775d615135"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Tue Jun 16 15:42:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 15:42:10 2026 +0800"
      },
      "message": "fix(triple): canonicalize context metadata headers (#3428)\n\n* fix(triple): canonicalize context metadata headers\n\nSigned-off-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e\n\n* test(triple): cover reserved header normalization\n\n* fix(triple): clone incoming context headers\n\n* test(triple): avoid noncanonical header key lookup\n\n* docs(triple): clarify metadata header casing\n\n---------\n\nSigned-off-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "fd4dea4f8ccef79a3190ba1d4a60af775d615135",
      "tree": "991013034f207b787f0fc1383e8356f011c797c8",
      "parents": [
        "7165f97bbbdd6a16cb89b7ce25be27adb29a4e8e"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Tue Jun 16 12:52:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 12:52:33 2026 +0800"
      },
      "message": "fix(router): avoid script process panic on invalid config (#3417)\n\n* fix(router): avoid script process panic on invalid config\n\n* fix(router): handle script delete without config body\n\n* test(router): cover active script delete event"
    },
    {
      "commit": "7165f97bbbdd6a16cb89b7ce25be27adb29a4e8e",
      "tree": "b3442ef29ff5e0699b24314968b1ebdd155951e1",
      "parents": [
        "d4ce453382a0e6ea18c9840e3a69ac8264790f60"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Mon Jun 15 16:32:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 16:32:48 2026 +0800"
      },
      "message": "build: update grpc dependencies (#3427)\n\nSigned-off-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "d4ce453382a0e6ea18c9840e3a69ac8264790f60",
      "tree": "cbe9276f836de577f7f8d1c9acc93a0467372f22",
      "parents": [
        "54b65bdef41abad81eef5ef4de768b5ac5c86dba"
      ],
      "author": {
        "name": "Harsh Mehta",
        "email": "harshmehta010102@gmail.com",
        "time": "Sun Jun 14 18:57:52 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 21:27:52 2026 +0800"
      },
      "message": "perf(triple): add fast paths for common content-type canonicalization (#3416)\n\n* perf(triple): add fast paths for common content-type canonicalization\n\nSigned-off-by: Harsh Mehta \u003charshmehta010102@gmail.com\u003e\n\n* perf(protocol): implement fast path for content-type canonicalization\n\nSigned-off-by: Harsh Mehta \u003charshmehta010102@gmail.com\u003e\n\n---------\n\nSigned-off-by: Harsh Mehta \u003charshmehta010102@gmail.com\u003e"
    },
    {
      "commit": "54b65bdef41abad81eef5ef4de768b5ac5c86dba",
      "tree": "dc81083158e9708ff7da817e85a5d20418cf8816",
      "parents": [
        "0139a9bad92b941b93fed8bce08e2e7389a6f9e7"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Sun Jun 14 15:40:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 15:40:42 2026 +0800"
      },
      "message": "refactor(extension): use registry for shutdown callbacks (#3388)\n\n* refactor(extension): use registry for shutdown callbacks\n\n* refactor(extension): simplify shutdown callback registration"
    },
    {
      "commit": "0139a9bad92b941b93fed8bce08e2e7389a6f9e7",
      "tree": "5711330a25b98d849c1e89408ba6cb731d93ed88",
      "parents": [
        "bd1c9f1ea11ebb60e407aba4678a459f4b691d4e"
      ],
      "author": {
        "name": "ヴァニラシ",
        "email": "2755364178@qq.com",
        "time": "Sun Jun 14 15:20:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 15:20:23 2026 +0800"
      },
      "message": "perf(loadbalance): reduce temporary selection allocations (#3415)"
    },
    {
      "commit": "bd1c9f1ea11ebb60e407aba4678a459f4b691d4e",
      "tree": "fc3c76747558261d08556e623775ff5353ad46c5",
      "parents": [
        "885bc36c37e727fa68bde7a34429d665a35c0e17"
      ],
      "author": {
        "name": "Harsh Mehta",
        "email": "harshmehta010102@gmail.com",
        "time": "Sun Jun 14 11:42:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 14:12:01 2026 +0800"
      },
      "message": "feat(loadbalance): introduce GetWeightAt for consistent weight calculation using Unix timestamp (#3410)\n\nSigned-off-by: Harsh Mehta \u003charshmehta010102@gmail.com\u003e"
    },
    {
      "commit": "885bc36c37e727fa68bde7a34429d665a35c0e17",
      "tree": "6e233c56ece44c1094706ec01df30c399b658003",
      "parents": [
        "56fe55baa6a8db2d17a0149567a27235171dba84"
      ],
      "author": {
        "name": "wm_03",
        "email": "3134058368@qq.com",
        "time": "Sun Jun 14 13:14:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 13:14:41 2026 +0800"
      },
      "message": "perf(registry): pre-size service-discovery maps and slices on instance changes (#3414)"
    },
    {
      "commit": "56fe55baa6a8db2d17a0149567a27235171dba84",
      "tree": "ef1e401fff52dad9c140e4d5677895c02622630f",
      "parents": [
        "4e030749525195ae4824bd7a88d9a33d33b8b2e5"
      ],
      "author": {
        "name": "ヴァニラシ",
        "email": "2755364178@qq.com",
        "time": "Sun Jun 14 13:12:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 13:12:47 2026 +0800"
      },
      "message": "refactor: remove legacy config handling from variadicrpccheck (#3413)"
    },
    {
      "commit": "4e030749525195ae4824bd7a88d9a33d33b8b2e5",
      "tree": "3bff79e3bb4cf660080426e599cc0a3466c691a0",
      "parents": [
        "4d93c115a2ac2b75d104dc6c93e40448b0955185"
      ],
      "author": {
        "name": "wm_03",
        "email": "3134058368@qq.com",
        "time": "Sat Jun 13 20:33:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 20:33:52 2026 +0800"
      },
      "message": "perf(common): optimize URL key string construction (#3412)"
    },
    {
      "commit": "4d93c115a2ac2b75d104dc6c93e40448b0955185",
      "tree": "8e0462675c4271b3c9638f8608ddfe90b0a97e3a",
      "parents": [
        "ad0c578be22dbdb20f5b45fac001733aec270d04"
      ],
      "author": {
        "name": "Nene7ko_",
        "email": "141395478+XnLemon@users.noreply.github.com",
        "time": "Sat Jun 13 19:23:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 19:23:00 2026 +0800"
      },
      "message": "fix(metadata): harden remote MetadataInfo loading with fallback, nil guards and error chain (#3395)\n\n* test(metadata): update cache key format and add GetMetadataInfo tests\n\n* fix(metadata): add fallback and nil URL guards for remote MetadataInfo loading\n\n* fix(metadata): address review issues in fallback and nil URL guard changes\n\n* fix(metadata): address PR review issues — error chain, context, comments, tests\n\n- Wrap combined fallback error with perrors.Wrapf instead of Errorf so the\n  rpcErr chain is preserved for errors.Is/As callers (issue #1)\n- Annotate the reportErr\u003d\u003dnil fallback failure path with [Metadata-Fallback]\n  context instead of returning a bare RPC error (issue #2)\n- Wrap local/default path RPC error with app/registry/revision context,\n  consistent with the remote path (issue #3)\n- Mark unused ctx parameters as _ with TODO(context-propagation) comments\n  in both getMetadataInfo implementations and the interface (issue #4)\n- Update GetMetadataInfo doc comment to accurately describe cache, fallback,\n  and nil guard behavior (issue #5)\n- Align \u0027treat as local\u0027 comment and \u0027defaulting to RPC\u0027 log to use consistent\n  \u0027local\u0027 storage-type vocabulary (issue #6)\n- Clarify \u0027// local / default storage path\u0027 comment to say RPC is used (issue #7)\n- Fix listenerMockMetadataReport.GetAppMetadata to use comma-ok assertion,\n  preventing panic when Return(nil, err) is used in future tests (issue #8)\n- Add TestGetMetadataInfo_ReportReturnsNil_RPCSucceeds covering the\n  report-(nil,nil) -\u003e RPC fallback path (gap #9)\n- Add TestGetMetadataInfo_RPCReturnsNilMetadata covering the nil-meta\n  guard in the RPC result path (gap #10)\n- Add TestGetMetadataInfo_NilMetadataMap covering the nil-Metadata-map\n  guard at line 264, reachable only via direct call not OnEvent (gap #11)\n\n* fix ci fail\n\n* fix(metadata): isolate metadata cache by provider app and add port guard\n\nAddress PR review feedback:\n\n- Scope the metadata cache key by provider application instead of the\n  subscribing consumer app. OnEvent keyed revisionToInstances,\n  revisionToMetadata and the disk cache on revision alone (or consumer\n  app + revision), so two provider apps sharing a revision could\n  overwrite each other. Key on metadataCacheKey(providerApp, registryId,\n  revision) throughout; pass instance.GetServiceName() to GetMetadataInfo.\n\n- buildStandardMetadataServiceURL now returns (*common.URL, error) and\n  reports missing protocol and missing port at the URL layer, instead of\n  only guarding a nil URL in the caller.\n\n- Align test names/comments with what they actually cover and fix error\n  assertions to use require (testifylint require-error).\n\n* fix ci fail\n\n---------\n\nCo-authored-by: xnlemon \u003cxianingawa@gmail.com\u003e"
    },
    {
      "commit": "ad0c578be22dbdb20f5b45fac001733aec270d04",
      "tree": "3989b41b3f1434ecded9852c7b89e27f6f198d3a",
      "parents": [
        "a7b6ee632a2d2e4c908cd5c10434d062c5040fe8"
      ],
      "author": {
        "name": "Yuqi Qiao",
        "email": "19606363088@163.com",
        "time": "Sat Jun 13 19:19:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 19:19:57 2026 +0800"
      },
      "message": "refactor(getty): remove legacy config dependency from remoting/getty (#3401)\n\n* refactor(getty): remove legacy config dependency from remoting/getty\n\nReplace all config.Get*() calls in initClient and initServer with URL\nattribute reads, following the pattern already used by triple/grpc/dubbo3\nprotocols. The URL attributes (ProtocolConfigKey, TLSConfigKey,\nApplicationKey) are already populated by callers in server/action.go\nand client/action.go, so the legacy config fallback path is redundant.\n\nChanges:\n- getty_client.go: replace config.GetApplicationConfig() / config.GetRootConfig().Protocols / config.GetRootConfig().TLSConfig with url.GetAttribute() reads. Collapse two redundant TLS blocks into one, fixing a copy-paste bug where srvConf was used instead of clientConf. Add IsClientTLSValid validation that was missing in the legacy TLS path.\n- getty_server.go: same config → URL attribute migration.\n- Imports: remove dubbo.apache.org/dubbo-go/v3/config and dubbo.apache.org/dubbo-go/v3, add common/config for EnsureApplicationAttribute.\n- Update stale comments referencing rootConfig.\n\n* refactor(getty): simplify protocol guard by removing ineffective GetParam check\n\nThe protocol name is stored in url.Protocol field, not in URL params.\nGetParam(constant.ProtocolKey) always returns empty string in normal\nflow, making the outer condition a no-op. Replace the nested check\nwith a direct url.GetAttribute(ProtocolConfigKey) guard.\n\n* refactor(getty): merge redundant protocol guard and retrieval\n\nThe guard and the subsequent GetAttribute call both read the same\nProtocolConfigKey attribute. Since the guard already verified existence\nand returned on miss, the second GetAttribute\u0027s !ok branch was dead\ncode. Merge into a single read block.\n\n* refactor(getty): merge type assertion and TLS validity check into single if statement\n\n* fix(getty): fail-secure on TLSConfigKey type assertion failure\n\nWhen TLSConfigKey is present but not of type *global.TLSConfig, log an\nerror and return instead of silently skipping TLS initialization.\nThis prevents misconfigured TLS from being silently downgraded to\nplaintext — consistent with how other protocols (gRPC, triple) handle\nthe same scenario.\n\nAlso add TestInitClientTLS and TestInitServerTLS to cover:\n- valid TLS config → SSLEnabled/TLSBuilder set\n- invalid TLS config → TLS remains disabled\n- wrong TLSConfigKey type → error logged, early return"
    },
    {
      "commit": "a7b6ee632a2d2e4c908cd5c10434d062c5040fe8",
      "tree": "6965411f43f490662dbf1bb2ae9499b4c88b8561",
      "parents": [
        "f7f350cfe4fbcfe35d609306a48b4f72de5b923d"
      ],
      "author": {
        "name": "wm_03",
        "email": "3134058368@qq.com",
        "time": "Sat Jun 13 14:25:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 14:25:15 2026 +0800"
      },
      "message": "perf(common): optimize URL.String() locking and string building (#3404)"
    },
    {
      "commit": "f7f350cfe4fbcfe35d609306a48b4f72de5b923d",
      "tree": "62d7f34ea952c7b27e1661dc0f3fa88362ba7493",
      "parents": [
        "1ce8314a06eb9a51c3d9befc5878e23dd15b62e7"
      ],
      "author": {
        "name": "ヴァニラシ",
        "email": "2755364178@qq.com",
        "time": "Sat Jun 13 13:49:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 13:49:54 2026 +0800"
      },
      "message": "perf(common): reduce URL CloneWithFilter and MergeURL params copying (#3403)"
    },
    {
      "commit": "1ce8314a06eb9a51c3d9befc5878e23dd15b62e7",
      "tree": "785fa96df66acfb32300cf69ae9bb1e535779ef0",
      "parents": [
        "5774b3d4e52bf0a0ff70e9315ce5bd91d00debd4"
      ],
      "author": {
        "name": "wm_03",
        "email": "3134058368@qq.com",
        "time": "Fri Jun 12 11:28:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 11:28:45 2026 +0800"
      },
      "message": "Feat: add benchmarks for common.URL (#3399)\n\n* test: add benchmarks for common.URL.\n\n* test: keep full identity params across URL benchmark tiers\n\n* test: add URL filter benchmarks with nested sub-URLs"
    },
    {
      "commit": "5774b3d4e52bf0a0ff70e9315ce5bd91d00debd4",
      "tree": "97ae079e13fd7d961465a98dd99950951272d49f",
      "parents": [
        "e1031b70dba9d1ac0407376f6b7d442ef31f79c9"
      ],
      "author": {
        "name": "Aether",
        "email": "98370028+Aetherance@users.noreply.github.com",
        "time": "Fri Jun 12 11:26:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 11:26:40 2026 +0800"
      },
      "message": "fix(metadata): preserve application tag in metadata info (#3400)"
    },
    {
      "commit": "e1031b70dba9d1ac0407376f6b7d442ef31f79c9",
      "tree": "e1a5323314782f958e462fc741604aa4ea64192f",
      "parents": [
        "c26a24ce8c93f38047506f3b0c072bbd7ddf64ca"
      ],
      "author": {
        "name": "Yuqi Qiao",
        "email": "19606363088@163.com",
        "time": "Fri Jun 12 09:39:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 09:39:29 2026 +0800"
      },
      "message": "Feat/revision canonical metadata (#3370)\n\n* feat(metadata): add canonical revision calculation for MetadataInfo\nAdd three methods to replace CRC32-based revision with MD5 over\ndeterministic ServiceInfo serialization, aligning with Java dubbo\u0027s\nMetadataInfo.calAndGetRevision().\n- ServiceInfo.toDescString(): deterministic string representation\n  in format (name|group|version|protocol|port|path|params|methods),\n  with sorted params/methods keys for stable output.\n- CalRevision(app, services): computes MD5 hex digest from app name\n  concatenated with sorted ServiceInfo.toDescString() outputs.\n  Returns 0 for empty services (matches Java EMPTY_REVISION).\n- MetadataInfo.CalAndGetRevision(): updates info.Revision in-place.\nThis replaces the coarse app+path+version+port+method CRC32 approach\nin resolveRevision, ensuring group/protocol/params changes are captured\nand revision is strongly bound to the serialized MetadataInfo content.\n\n* refactor(revision): replace CRC32 revision with canonical MD5-based calculation\n\nRefactor resolveRevision to derive revision from canonical ServiceInfo\nobjects rather than raw URLs, aligning with Java dubbo\u0027s\nMetadataInfo.calAndGetRevision().\n\nChanges in service_revision_customizer.go:\n- resolveRevision now converts URLs to ServiceInfo via NewServiceInfoWithURL,\n  groups by MatchKey, and delegates to info.CalRevision (MD5 over sorted\n  toDescString) instead of CRC32-summing app+path+version+port+method.\n- Customizers now source URLs from instance.GetServiceMetadata() rather\n  than the global GetMetadataService(), so each instance\u0027s revision is\n  scoped to its own MetadataInfo. This fixes cross-test state leakage.\n\nChanges in service_revision_customizer_test.go (new, 10 cases):\n- Group / protocol / params / methods / version change triggers revision change\n- Deterministic: same input always produces same revision\n- Empty URL list returns 0\n- Ordering-independent: URL insertion order and param key order do not\n  affect revision\n- Non-IncludeKeys params are ignored\n\n* fix: remove useless assertion leftover from debugging\n\n* fix(metadata): replace MD5 with SHA-512 in revision calculation\n\nSwitch the hash algorithm used in CalRevision from MD5 (32 hex chars)\nto SHA-512 (128 hex chars) for stronger collision resistance.\n\n* fix(metadata): exclude EnvironmentKey from ServiceInfo IncludeKeys\n\nEnvironment is instance-level routing metadata (per the consumer-side\ncomment in service_instances_changed_listener_impl.go). The consumer\nalways overrides it from the current instance metadata, regardless of\nwhat is cached by revision. Including it in IncludeKeys caused revision\nto change between instances with different environment tags, producing\nspurious revision updates with no routing impact.\n\n* chore:delete useless comments\n\n* chore: go fmt\n\n* refactor(metadata): use incremental hash and add CalAndGetRevision test\n\n* refactor(metadata): remove unused CalAndGetRevision method\n\nNo callers in production code. Go\u0027s MetadataInfo.Revision is set\nexternally by the registry/customizer path, unlike Java where\ncalAndGetRevision() manages the revision internally. CalRevision\nremains as the public API for revision calculation.\n\n* chore: retrigger CI"
    },
    {
      "commit": "c26a24ce8c93f38047506f3b0c072bbd7ddf64ca",
      "tree": "c7956185a33ea14be4fac34ab5280a03091532ef",
      "parents": [
        "d44bc18940bdc9ba38c739af5d363dac5547efd7"
      ],
      "author": {
        "name": "Xuetao Li",
        "email": "m134679102365478@163.com",
        "time": "Thu Jun 11 17:37:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 17:37:33 2026 +0800"
      },
      "message": "[doc] update readme farmework pic (#3358)\n\n* Add files via upload\n\n* Add files via upload\n\n* Add files via upload"
    },
    {
      "commit": "d44bc18940bdc9ba38c739af5d363dac5547efd7",
      "tree": "b28bf5cb002080bd7de2d9637ac9a39efe7323b3",
      "parents": [
        "ab00bd40810a944593738270838e8273a44bcb56"
      ],
      "author": {
        "name": "Xuetao Li",
        "email": "m134679102365478@163.com",
        "time": "Thu Jun 11 17:37:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 17:37:13 2026 +0800"
      },
      "message": "[FEAT] delete synthesizer logic (#3360)\n\n* delete synthesizer logic\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "ab00bd40810a944593738270838e8273a44bcb56",
      "tree": "9266d9fbf9b7298855f268dbc4742e23b387e9ad",
      "parents": [
        "fc7f14f35369350e8d319fe9bbd6deaa4b0d259c"
      ],
      "author": {
        "name": "Aether",
        "email": "98370028+Aetherance@users.noreply.github.com",
        "time": "Wed Jun 10 21:36:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 21:36:58 2026 +0800"
      },
      "message": "feat(router): add router chain snapshot cache (#3305)\n\n* feat(router): add invoker-snapshot cache for Poolable route\n\nIntroduce routerCache on RouterChain, rebuilt in SetInvokers. Add FindAddrPoolWithInvokers to atomically read snapshot and pool.\n\n* test(router): add unit tests for tag router bitmap cache path\n\n* test(router): add benchmarks for tag router snapshot cache\n\n* fix: strengthen cache invalidation checks to avoid wrong invoker selection\n\n* fix(router): make FindAddrPool return pool and invokers atomically\n\n* fix(router): tag router failover should return untagged providers only\n\n* docs: add comment explaining cache only works when TagRouter is first in chain\n\n* fix: use atomic.Value for TagRouter.cache to prevent data race\n\n* fix: add defensive check and TODO comment for TagRouter cache\n\n* chore: use roaring.Iterator to avoid intermediate allocation in collectInvokers\n\n* chore: enable memory allocation reporting in tag router benchmarks\n\n* chore: extract bitmap key prefixes to constants for Poolable routers\n\n* chore: remove unnecessary copy in FindAddrPool\n\n* fix(router): incorrect tag routing and regex overhead for match field with non-indexed keys\n\n* refactor(router): split tag router code into router.go, cache.go, and match.go\n\n* fix(router): guard tag router cache path with chain snapshot generation\n\n* fix router cache injection for added routers"
    },
    {
      "commit": "fc7f14f35369350e8d319fe9bbd6deaa4b0d259c",
      "tree": "98ca6966587ec1baaff2c6844bac5c8260652d9a",
      "parents": [
        "cdf6f2f8b5b5b1ece181540002c4b12730dcea60"
      ],
      "author": {
        "name": "Nene7ko_",
        "email": "141395478+XnLemon@users.noreply.github.com",
        "time": "Wed Jun 10 12:58:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 12:58:29 2026 +0800"
      },
      "message": "feat(metadata): Clarify metadata report selection for multi-registry and multi-instance scenarios (#3369)\n\n* fix(metadata): make GetMetadataReport() deterministic in multi-registry setup\n\n* fix(metadata): Remove() fans out to all reports, consistent with Map()\n\n* fix(metadata): thread registryId through GetMetadataFromMetadataReport call chain\n\n* fix(metadata): scope revision calculation to per-registry services, thread registryId through createInstance\n\n* fix(metadata): GetMetadataReportByRegistry returns nil for unknown registryId instead of silently falling back to wrong registry\n\nWhen a caller provides a specific non-empty registryId that has no\nregistered report, the previous implementation silently fell back to\nGetMetadataReport() and returned an arbitrary report from a different\nregistry. This undermined the per-registry scoping added in the earlier\ncommits: metadata for registry A could be fetched from registry B\u0027s\nreport without any indication.\n\nFix: return nil (with a Warnf log) when a specific registryId is not\nfound. The existing nil-guard in GetMetadataFromMetadataReport (client.go)\nalready surfaces this as an error to the caller, which is the correct\nbehaviour.\n\nThe empty-string path is unchanged: it still delegates to\nGetMetadataReport() because callers that pass \"\" have no registry\ncontext and should receive the stable default.\n\nAlso expose ClearMetadataReportInstances() to allow cross-package test\nisolation of the package-level instances map.\n\n* fix(metadata): ServiceNameMapping.Remove collects all errors instead of returning only the last one\n\nThe previous implementation used a lastErr variable that was overwritten\non each iteration. If the first report failed and the second succeeded,\nthe error was silently discarded and the caller saw no error despite a\npartial failure — leaving a stale mapping in the first registry.\n\nFix: collect all errors with errors.Join so the caller receives the full\nfailure picture. The loop continues past individual failures (best-effort\nfan-out) so a transient error in one registry does not prevent removal\nfrom the others.\n\nAdd a comment explaining the intentional behavioural difference from\nMap(), which is fail-fast: Map stops at the first report failure, while\nRemove continues and collects all errors so every reachable registry gets\nthe removal attempt.\n\n* test: expand coverage for per-registry metadata report selection\n\nThree gaps identified in PR review, all addressed:\n\n1. metadata/client_test.go — rewrite TestGetMetadataFromMetadataReport\n   - Add sub-test: specific registryId routes to its own report (not default)\n   - Add sub-test: unknown registryId returns error, not silent wrong-registry result\n   - Each sub-test now resets instances independently to prevent state leakage\n\n2. registry/servicediscovery/customizer/service_revision_customizer_test.go\n   - Add TestExportedRevisionMissingRegistryIdYieldsZero: instance with no\n     RegistryIdKey gets revision \"0\" and does not borrow another registry\u0027s\n     service list\n   - Add TestSubscribedRevisionMissingRegistryIdYieldsZero: same for subscribed\n   - Add t.Cleanup(ClearMetadataReportInstances) + unique registry-id prefixes\n     to all four tests to prevent cross-test global map pollution\n\n3. registry/servicediscovery/service_instances_changed_listener_impl_test.go\n   - Add TestListenerUsesRegistryIdToFetchRemoteMetadata: creates a listener\n     with registryId\u003d\"remote-reg-test\", registers a mock MetadataReport under\n     that id, triggers OnEvent with a RemoteMetadataStorageType instance, and\n     asserts via mock.AssertExpectations that the correct per-registry report\n     was called — end-to-end proof that registryId threads from\n     NewServiceInstancesChangedListener through to GetMetadataFromMetadataReport\n\n* chore: translate Chinese comments to English, remove UTF-8 BOM\n\n- metadata/report_instance_test.go: translate inline comments and\n  testify assertion messages in TestGetMetadataReportIsDeterministic\n  from Chinese to English, consistent with the rest of the file\n\n- registry/servicediscovery/customizer/service_revision_customizer.go:\n  translate Customize doc-comments for both exported and subscribed\n  customizers from Chinese to English\n\n- registry/servicediscovery/service_instances_changed_listener_impl_test.go:\n  strip the UTF-8 BOM (EF BB BF) that was introduced at line 1;\n  Go toolchain accepts BOMs but they are not idiomatic and cause\n  spurious diffs in some editors and CI tools\n\n* style(metadata): fix import formatting\n\n* fix(registry): upgrade missing-registryId log from Warn to Error with accurate consequence\n\nThe previous Warnf said \u0027revision will be empty\u0027, which is wrong on two\ncounts: the actual computed revision is \"0\" (not empty), and revision\n\"0\" causes OnEvent to silently skip the instance entirely, making it\npermanently invisible to all consumers.\n\nUpgrade to Errorf and describe the actual outcome so operators can\ndiagnose misconfigurations immediately. Applies to both exported and\nsubscribed revision customizers.\n\n* fix(registry): scope metaCache key to (registryId, revision) to prevent cross-registry metadata poisoning\n\nThe cache in GetMetadataInfo was keyed by revision string only. In a\nmulti-registry setup, if two registries happen to produce the same\nrevision value (e.g. identical service sets yielding the same CRC, or\ntest fixtures using literal revision strings), the second registry\u0027s\nlistener would get a cache hit and return MetadataInfo fetched via a\ndifferent registry\u0027s report — silently serving wrong endpoints with no\nerror surfaced.\n\nFix: use registryId+\":\"+revision as the cache key for both Get and Set,\nso each registry\u0027s metadata is cached independently.\n\nUpdate all test helpers and direct metaCache.Set/Delete calls to use\nthe same composite key (with constant.DefaultKey as the registryId for\nall existing single-registry test listeners).\n\n* docs(registry): restore TODO for multi-instance metadata service URL alignment\n\nThe previous commit removed the TODO without fixing the underlying issue.\nGetMetadataService() still returns a global singleton, so all instances\nacross registries receive the same metadata service URL regardless of\nwhich registry they belong to.\n\nRestore the TODO with a more detailed explanation so the gap is visible\nto future contributors. The fix requires per-registry MetadataService\nsupport and is out of scope for this PR.\n\n* Revert \"docs(registry): restore TODO for multi-instance metadata service URL alignment\"\n\nThis reverts commit 5d7bcc6cf69f6d05646c4e61beda666fc31ad4eb.\n\n* style(metadata): fix import formatting\n\n* fix(debug) : fix review problems\n\n* style(metadata): fix format issue \u0026\u0026 revert some changes\n\n* fix(metadata): update tests and comment to match default fallback in GetMetadataReportByRegistry\n\nGetMetadataReportByRegistry intentionally falls back to the \u0027default\u0027\nreport when a specific registryId is not found. This supports standalone\nmetadata-report configs registered under \u0027default\u0027 being used by named\nregistries (e.g. nacos, zk). Update tests and doc comment to reflect\nthis behavior instead of the old \u0027return nil for unknown id\u0027 contract.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix: address review comments on clarify-metadata-report-selection\n\n- fix(registry): unify registryId default to constant.DefaultKey before\n  GetMetadataInfo lookup in RegisterService, eliminating empty-string\n  fallback mismatch and redundant GetParam calls\n- fix(metadata): scope metaCache key to app:registryId:revision to\n  prevent cross-registry cache collisions\n- fix(metadata/mapping): bind MappingListener to deterministic primary\n  report via GetMetadataReport() instead of non-deterministic i\u003d\u003d0\n- fix(metadata): include registryId in GetMetadataFromMetadataReport\n  error message for easier misconfiguration diagnosis\n- test: add t.Cleanup to remove AddService/AddSubscribeURL entries and\n  prevent global state leakage between tests\n- docs: restore TODO comment explaining GetMetadataService() singleton\n  limitation in multi-registry metadata service URL alignment\n\n* fix: fix test isolation and cache key format after review changes\n\n- fix(test): update metaCache keys in service_instances_changed_listener_impl_test\n  to match new app:registryId:revision format\n- test: use t.Name()+UnixNano as regID in service_discovery_registry_test\n  to prevent cross-test global state pollution without expanding production API\n\n---------\n\nCo-authored-by: xnlemon \u003cxianingawa@gmail.com\u003e\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "cdf6f2f8b5b5b1ece181540002c4b12730dcea60",
      "tree": "114fe489fd28237ef6518e4fa95581164d753211",
      "parents": [
        "60dfab6c5476161ef8868247b3682798866bca61"
      ],
      "author": {
        "name": "Yuxuan Lv",
        "email": "3656828039@qq.com",
        "time": "Wed Jun 10 09:18:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 09:18:03 2026 +0800"
      },
      "message": "feat(metadata): strengthen service-app mapping consistency, retry and… (#3373)\n\n* feat(metadata): strengthen service-app mapping consistency, retry and dedup (#3354)\n\nMake interface-to-app mapping registration safe under concurrent providers and\ngive it a proper retry policy.\n\n- Optimistic concurrency across all backends so concurrent appends no longer\n  clobber each other: etcd (GetValAndRev + UpdateWithRev), zookeeper (versioned\n  SetContent), nacos (CasMd5). Each backend wraps its native conflict\n  (ErrCompareFail / ErrBadVersion / ErrNodeExists / nacos publish failure) into\n  the shared report.ErrMappingCASConflict sentinel via %w.\n- Graded retry: registerWithRetry retries only CAS conflicts (errors.Is) with\n  exponential backoff + jitter, and returns permanent errors immediately\n  instead of burning the whole retry budget.\n- Extract shared logic: report.MergeServiceAppMapping (whole-element dedup,\n  fixing the strings.Contains substring false positive and the leading-comma\n  bug on empty values) and report.DecodeServiceAppNames (skips empty elements).\n- Listener cleanup: zookeeper removal via CacheListener.RemoveKeyListeners;\n  etcd documents the listener as unsupported instead of silently succeeding.\n- Tests: helper unit tests plus a concurrency test that reproduces the\n  lost-update bug and proves CAS preserves every writer (200 writers /\n  20 readers, passes under -race).\n\nKnown nacos-only limitation (documented in code): CasMd5 is an optimistic\nUPDATE and cannot guard the first INSERT, so the initial concurrent\nregistration of a brand-new interface can still race. etcd and zookeeper are\nnot affected.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(metadata): address review feedback on mapping consistency (#3354)\n\n- nacos: stop swallowing the getConfig read error. On a failed read the old\n  value was treated as empty, so registration would publish only the current\n  app and overwrite an existing set (e.g. appA,appB -\u003e appC). Return the error\n  instead so an existing mapping is never clobbered. A genuinely absent config\n  still returns (\"\", nil) and takes the first-write path.\n- zookeeper: CacheListener.DataChange now builds the set via\n  report.DecodeServiceAppNames, so mapping change events no longer surface\n  empty app names from legacy/malformed comma-separated values (\",app\",\n  \"app,,other\"). Added a listener test covering this.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(metadata): treat nacos \"config data not exist\" as empty in mapping registration\n\nThe previous commit returned any getConfig error from RegisterServiceAppMapping.\nNacos signals a never-written key with a \"config data not exist\" error (not an\nempty value), so the first registration of a fresh interface failed and the\nprovider panicked on service export (broke the registry/nacos integration test).\n\nOnly treat genuine read failures (network/auth/server) as errors; the not-found\nsignal is handled as an empty old value so the first write can create the key.\nDetection mirrors config_center/nacos\u0027s isConfigNotExistErr.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(metadata): drop insecure rand jitter from mapping retry backoff\n\nSonarCloud flagged math/rand as an insecure PRNG. The jitter only spread\nout contending writers and is not worth a crypto/rand dependency, so use\nplain exponential backoff instead.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(metadata): suppress SonarCloud weak-hash hotspot on Nacos CAS MD5\n\nThe MD5 in nacos report is the checksum mandated by the Nacos CAS wire\nprotocol (PublishConfig forwards CasMd5 for the server to compare), not a\nsecurity hash, so the algorithm is not ours to change. Mark it NOSONAR\nwith an explanation to clear the quality-gate security hotspot.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "60dfab6c5476161ef8868247b3682798866bca61",
      "tree": "944510ee214ee5afdf2ff664dddd0575bd926db7",
      "parents": [
        "e17b91ce10b2b1d70a208be054aee90ad7814281"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Wed Jun 10 09:17:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 09:17:09 2026 +0800"
      },
      "message": "test(triple): allow invalid stream send close errors (#3379)\n\nCo-authored-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "e17b91ce10b2b1d70a208be054aee90ad7814281",
      "tree": "a9e3111deaab07d3f1fdc4e27e5e729d31fbb65e",
      "parents": [
        "f23f29b20e4aba200f8a78b5cd13716a3cc367f0"
      ],
      "author": {
        "name": "hurukawa",
        "email": "61525444+nagisa-kunhah@users.noreply.github.com",
        "time": "Wed Jun 10 09:14:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 09:14:06 2026 +0800"
      },
      "message": "[Enhancement] remove legacy config package (#3372)\n\n* pr1: remove config.GetRootConfig()、config.GetProviderConfig()、config.GetProviderService()、config.GetShutDown()"
    },
    {
      "commit": "f23f29b20e4aba200f8a78b5cd13716a3cc367f0",
      "tree": "c0737f21b79572c3bbb30e3a1f3d3e496f705a75",
      "parents": [
        "8e96ea3de33a3a8dddbf70f4293cdd6eeca41421"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Tue Jun 09 17:31:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 17:31:54 2026 +0800"
      },
      "message": "refactor(url): clarify append param API (#3390)\n\n* refactor(url): clarify append param API\n\n* refactor(url): group string parameters\n\n* refactor(url): use SetParam for single-value URL params\n\n---------\n\nCo-authored-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "8e96ea3de33a3a8dddbf70f4293cdd6eeca41421",
      "tree": "fd087ea5c0a0d3370171c736afbea29bfafd106f",
      "parents": [
        "dde23ab2a9c5300533a61a0d0463ebeaf04a5503"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Tue Jun 09 10:26:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 10:26:09 2026 +0800"
      },
      "message": "test(hessian2): cover pointer long response fields (#3382)\n\nCo-authored-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "dde23ab2a9c5300533a61a0d0463ebeaf04a5503",
      "tree": "3d09e40989270c592c80650efa5b609a3fd56fe9",
      "parents": [
        "6c49e65a075cadbe74811d0dafd937fe919a014f"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Tue Jun 09 10:24:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 10:24:57 2026 +0800"
      },
      "message": "docs(generic): explain response attachment access (#3381)\n\nCo-authored-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "6c49e65a075cadbe74811d0dafd937fe919a014f",
      "tree": "d6bc1c10591640fbfe959cca60728dd8f5e1e0b5",
      "parents": [
        "38520f3e3a07c60895c685d0dbb1ec6b1d748cc0"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Tue Jun 09 10:24:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 10:24:34 2026 +0800"
      },
      "message": "docs(triple): document header and trailer usage (#3380)\n\nCo-authored-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e"
    },
    {
      "commit": "38520f3e3a07c60895c685d0dbb1ec6b1d748cc0",
      "tree": "d2ac60e996c91191ab9ace7f28c219f0049cac33",
      "parents": [
        "b19d5b4b9a3749e2a13b4cb9c635e0f05d26f294"
      ],
      "author": {
        "name": "吴杨帆",
        "email": "39647285+leno23@users.noreply.github.com",
        "time": "Mon Jun 08 15:18:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 15:18:50 2026 +0800"
      },
      "message": "fix(common): omit trailing ? in URL.String() without query params (#3328)\n\n* fix(common): omit trailing ? in URL.String() without params\n\nCloses #3327. Only append a query string when URL parameters exist.\n\n* test: update consistent hash url expectation\n\n---------\n\nCo-authored-by: wuyangfan \u003cyangfan.wu@succaiss.com\u003e\nCo-authored-by: Xuetao Li \u003cm134679102365478@163.com\u003e"
    },
    {
      "commit": "b19d5b4b9a3749e2a13b4cb9c635e0f05d26f294",
      "tree": "ceb01a1a5763794e6b5fa39302a3d4571d3dcec7",
      "parents": [
        "6dcf83539bc3aa7090a0d9851d4fb28ac56388e6"
      ],
      "author": {
        "name": "Xuetao Li",
        "email": "m134679102365478@163.com",
        "time": "Mon Jun 08 14:53:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 14:53:26 2026 +0800"
      },
      "message": "Update Codecov action to version 7 (#3375)"
    },
    {
      "commit": "6dcf83539bc3aa7090a0d9851d4fb28ac56388e6",
      "tree": "04298f52b626f17ce9893c1fb23b48f1143ae615",
      "parents": [
        "a3428bbc5ab7eb0975b30b57da1f39cbfab12be1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jun 04 19:15:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 19:15:32 2026 +0800"
      },
      "message": "build(deps): bump github.com/quic-go/quic-go from 0.52.0 to 0.59.1 (#3368)\n\nBumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.52.0 to 0.59.1.\n- [Release notes](https://github.com/quic-go/quic-go/releases)\n- [Commits](https://github.com/quic-go/quic-go/compare/v0.52.0...v0.59.1)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/quic-go/quic-go\n  dependency-version: 0.59.1\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Xuetao Li \u003cm134679102365478@163.com\u003e"
    },
    {
      "commit": "a3428bbc5ab7eb0975b30b57da1f39cbfab12be1",
      "tree": "3d757fecd816f3aec86537da12f94997bd15eda3",
      "parents": [
        "48ec2ac2f099b4d1b8d53dded057fc7a0b1aa333"
      ],
      "author": {
        "name": "ヴァニラシ",
        "email": "2755364178@qq.com",
        "time": "Tue Jun 02 18:41:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 18:41:17 2026 +0800"
      },
      "message": "docs: refresh outdated entries in filter README (#3365)\n\n* Refresh outdated entries in filter README\n\n* docs: refresh outdated entries in filter README"
    },
    {
      "commit": "48ec2ac2f099b4d1b8d53dded057fc7a0b1aa333",
      "tree": "8f2e556ea6152ddc7ebfae64127c39142dcc37bc",
      "parents": [
        "fd79da266ed61726ec0ef0e874e2d72cc2bd2a76"
      ],
      "author": {
        "name": "AsperforMias",
        "email": "asperformias000@outlook.com",
        "time": "Sun May 31 17:33:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 17:33:59 2026 +0800"
      },
      "message": "feat: complete local app metadata lifecycle (#3357)\n\n* feat: complete local app metadata lifecycle\n\n* fix:sync metadata cleanup with unregister lifecycle\n\n* fix: reconcile metadata after unregister and unsubscribe\n\n* fix: rm unnecessary abstraction func"
    },
    {
      "commit": "fd79da266ed61726ec0ef0e874e2d72cc2bd2a76",
      "tree": "8f9748f98dee45b5f8634e878034c96300ae920e",
      "parents": [
        "737b7f2ad8c43b641c2060fd78a44bf73af26a71"
      ],
      "author": {
        "name": "Yuqi Qiao",
        "email": "19606363088@163.com",
        "time": "Sun May 31 12:18:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 12:18:52 2026 +0800"
      },
      "message": "Refactor/logger format finish (#3346)\n\n* fix(config): remove legacy protocol timeout fallback (#3326)\n\n* fix(config): remove legacy protocol timeout fallback\n\n* fix(config): avoid default timeout allocation\n\n* fix(config): preserve consumer timeout in reference config\n\n* test(config): satisfy testifylint in reference timeout test\n\n* fix(config): make protocol timeout default explicit\n\n* fix(config): centralize consumer timeout default\n\n* fix(config): keep consumer timeout default in global\n\n* Fix(config center)apollo context path error (#3331)\n\n* feat(test):Add TestGetAddressWithProtocolPrefixKeepsContext and find the error when user bring context path\n\n* fix(apollo):Fix the test func(getAddressWithProtocolPrefix) fix(context_path):fix getAddressWithProtolPrefix didn\u0027t handle context path\n\n* refator(config_center):cleanup-redundant-test\n\n* fix(test):删除不应该存在的文件\n\n* feat():恢复测试并添加多种case\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* fix:修复url.Path \u003d /问题并添加边缘测试；修复原来的不符合gofmt格式以通过CI\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* fix(logger): sync dubbo-go logger facade during logger initialization (#3345)\n\n* fix(logger): sync dubbo-go logger facade in LoggerConfig.Init()\n\n* fix(logger): sync dubbo-go logger facade in config_loader init()\n\n* fix(logger): sync dubbo-go logger facade in initGlobalLogger()\n\n* test(logger): verify dubbo-go facade is synced after logger initialization\n\n* style(logger): fix import formatting\n\n* refactor(logger): standardize logger format across codebase (#3344)\n\n* refactor(logger): standardize logger format in graceful_shutdown\n\n- Add [GracefulShutdown] prefix to all logger calls\n- Remove decoration symbols (---) from log messages\n- Change key format from \"error: %v\" / \"--- %v\" to \"err\u003d%v\"\n- Lowercase first letter of all log message bodies\n\n* refactor(logger): standardize logger format in internal, metadata, metrics, otel\n\n- Add module prefixes: [Internal], [Metadata], [MetadataRPC], [MetadataReport][Etcd/Nacos/Zookeeper], [Metrics], [Metrics][Probe/Prometheus/RPC], [OTel][Trace]\n- Unify key format: \"error: %v\" / \": %v\" / \"err: %s\" → \"err\u003d%v\", \"url: %s\" → \"url\u003d%s\"\n- Lowercase first letter of all log message bodies\n- Fix bug: logger.Error with non-string or extra args → logger.Errorf (listener.go, server.go, exporter.go)\n- Fix bug: logger.Errorf with no format args → logger.Error (metadata_service.go)\n- Fix bug: logger.Infof/Debugf with no format args → logger.Info/Debug (config.go, report.go)\n- Fix: err.Error() + %s → err + %v (nacos/report.go x2)\n\n* refactor(logger): standardize logger format in protocol directory\n\n- Unify prefixes as [Protocol], [Dubbo], [Dubbo][Codec/Hessian2/Impl/Exporter/Invoker], [Dubbo3], [GRPC], [GRPC][Client/Server/Exporter/Invoker], [Jsonrpc], [Jsonrpc][Server/Exporter/Invoker], [ProtocolWrapper], [Rest], [Rest][Config/Exporter/Server], [Triple], [Triple][Client/Server/Exporter/Invoker/CORS/Codec/Handler/Negotiation/Protocol/Health/OpenAPI]\n- Unify key format: \"error: %v\" / \": %v\" / \"error:{%v}\" → \"err\u003d%v\", \"err: %v\" → \"err\u003d%v\"\n- Lowercase first letter of all log message bodies\n- Remove %+v format for non-Debug levels\n- Fix bug: logger.Error with error type → logger.Errorf (dubbo_codec.go, dubbo_protocol.go)\n- Fix bug: logger.Error/Info with extra args → logger.Errorf/Infof (rpc_status.go, jsonrpc/server.go)\n- Fix bug: logger.Infof/Debugf without format args → logger.Info/Debug (multiple files)\n- Fix bug: logger.Debug without format args → logger.Debugf (openapi/service.go)\n- Fix: err.Error() + %s → err + %v (dubbo3_protocol.go)\n\n* refactor(logger):standardize logger prefixes in metadata, metadata-report, Dubbo, and Triple protocol modules\n\n* refactor(logger): unify log format in proxy and registry packages\n\n- Add consistent [Proxy]/[Registry]/[Registry][\u003cimpl\u003e] prefix to all log messages\n- Adopt key\u003dvalue parameter style (err\u003d%v, url\u003d%s) for structured logging\n- Remove redundant descriptions and normalize punctuation across 30 files\n\n* refactor(logger): unify log format in remoting, server and loader modules\n\n- Add consistent [Loader]/[Server]/[Getty]/[Zookeeper]/[Etcdv3] prefixes\n- Adopt key\u003dvalue parameter style (err\u003d%v, url\u003d%s) for structured logging\n- Remove trailing punctuation and redundant wording across 21 files\n\n* feat(tools): add loggercheck linter for log format consistency\n\nIntroduce a static analysis tool that enforces the standardized logger\nconventions across the codebase:\n\n- Rule 1: logger.Info with format verbs → use logger.Infof\n- Rule 2: logger.Infof without format verbs → use logger.Info\n- Rule 3: logger.Infof(fmt.Sprintf(...)) → redundant, flatten to Infof\n- Rule 4: trailing \\n / ... / ! in log messages → remove\n\nIntegrated into make lint as the logger-check target.\n\n* refactor(logger): final touch, unfiy logger format in other places\n\n* fix(tools): remove unused variables in loggercheck to pass golangci-lint\n\n* refactor: revert (feat(tools): add loggercheck) and simplify registry log prefixes\n\nRemove loggercheck tool and its Makefile integration. Use [Registry] instead of [Registry][Protocol]/[Registry][Exposed] in core registry files; add [Registry][Mock] for mock registry\n\n* fix(logger): correct format verbs, variable names, and function calls\n\n* refactor(logger):modify prefix format\n\n---------\n\nCo-authored-by: CAICAII \u003c3360776475@qq.com\u003e\nCo-authored-by: Yuxuan Lv \u003c3656828039@qq.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\nCo-authored-by: Nene7ko_ \u003c141395478+XnLemon@users.noreply.github.com\u003e"
    },
    {
      "commit": "737b7f2ad8c43b641c2060fd78a44bf73af26a71",
      "tree": "1e2677676794814eed80ac8d1ef8c07f77ac37b8",
      "parents": [
        "b03a7c794d0e646b8a046cb5dd0c801a12511ab2"
      ],
      "author": {
        "name": "Nene7ko_",
        "email": "141395478+XnLemon@users.noreply.github.com",
        "time": "Wed May 27 19:15:56 2026 +0800"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Sat May 30 17:45:52 2026 +0800"
      },
      "message": "fix(logger): sync dubbo-go logger facade during logger initialization (#3345)\n\n* fix(logger): sync dubbo-go logger facade in LoggerConfig.Init()\n\n* fix(logger): sync dubbo-go logger facade in config_loader init()\n\n* fix(logger): sync dubbo-go logger facade in initGlobalLogger()\n\n* test(logger): verify dubbo-go facade is synced after logger initialization\n\n* style(logger): fix import formatting"
    },
    {
      "commit": "b03a7c794d0e646b8a046cb5dd0c801a12511ab2",
      "tree": "154e70c3d88b46648be9aa99238febc85a08eb61",
      "parents": [
        "6ac4bbbdfe742b781e0e0543007d0f129ed39f17"
      ],
      "author": {
        "name": "Yuxuan Lv",
        "email": "3656828039@qq.com",
        "time": "Wed May 27 10:59:05 2026 +0800"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Sat May 30 17:45:52 2026 +0800"
      },
      "message": "Fix(config center)apollo context path error (#3331)\n\n* feat(test):Add TestGetAddressWithProtocolPrefixKeepsContext and find the error when user bring context path\n\n* fix(apollo):Fix the test func(getAddressWithProtocolPrefix) fix(context_path):fix getAddressWithProtolPrefix didn\u0027t handle context path\n\n* refator(config_center):cleanup-redundant-test\n\n* fix(test):删除不应该存在的文件\n\n* feat():恢复测试并添加多种case\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* fix:修复url.Path \u003d /问题并添加边缘测试；修复原来的不符合gofmt格式以通过CI\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "6ac4bbbdfe742b781e0e0543007d0f129ed39f17",
      "tree": "c186fead035d46e0d59634c4f8c3a42d74b6f5b1",
      "parents": [
        "e6e14fd3076a056808a2f844bbc851a23f42865a"
      ],
      "author": {
        "name": "CAICAII",
        "email": "3360776475@qq.com",
        "time": "Mon May 25 09:43:16 2026 +0800"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Sat May 30 17:45:52 2026 +0800"
      },
      "message": "fix(config): remove legacy protocol timeout fallback (#3326)\n\n* fix(config): remove legacy protocol timeout fallback\n\n* fix(config): avoid default timeout allocation\n\n* fix(config): preserve consumer timeout in reference config\n\n* test(config): satisfy testifylint in reference timeout test\n\n* fix(config): make protocol timeout default explicit\n\n* fix(config): centralize consumer timeout default\n\n* fix(config): keep consumer timeout default in global"
    },
    {
      "commit": "e6e14fd3076a056808a2f844bbc851a23f42865a",
      "tree": "064e87580d3afcbd4602cfac390d12afaff7f28b",
      "parents": [
        "f94cbff2883d3496615f8722eb52387f7198283c"
      ],
      "author": {
        "name": "The Apache Software Foundation",
        "email": "root-asf-gitbox-commits@apache.org",
        "time": "Thu May 21 01:27:45 2026 -0500"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Thu May 21 15:09:17 2026 +0800"
      },
      "message": "Set up default protection ruleset for default and release branches (#3325)"
    },
    {
      "commit": "f94cbff2883d3496615f8722eb52387f7198283c",
      "tree": "472f04021e53cc917c46c50ad7f4ee6b2e9500c0",
      "parents": [
        "149706b1f23ad2c9745c22fbc4557d3ccf560b48",
        "66e05df7eec3cd572f09f2fcc437dfe78870d0f2"
      ],
      "author": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Thu May 21 15:09:16 2026 +0800"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Thu May 21 15:09:16 2026 +0800"
      },
      "message": "Merge remote-tracking branch \u0027origin/develop\u0027\n"
    },
    {
      "commit": "149706b1f23ad2c9745c22fbc4557d3ccf560b48",
      "tree": "6d1d505de9a2e6f0f26cd002d3028c6a8e959396",
      "parents": [
        "72fad92914fe37a70ded63c763d31e530b65fa8d"
      ],
      "author": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Thu May 21 15:09:15 2026 +0800"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Thu May 21 15:09:15 2026 +0800"
      },
      "message": "Revert \"Set up default protection ruleset for default and release branches (#3325)\"\n\nThis reverts commit 72fad92914fe37a70ded63c763d31e530b65fa8d.\n"
    },
    {
      "commit": "66e05df7eec3cd572f09f2fcc437dfe78870d0f2",
      "tree": "472f04021e53cc917c46c50ad7f4ee6b2e9500c0",
      "parents": [
        "5efce6140f2a8dde500d92cfe1cca737d0591806"
      ],
      "author": {
        "name": "nanjiek",
        "email": "127271430+nanjiek@users.noreply.github.com",
        "time": "Thu May 21 14:30:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:30:13 2026 +0800"
      },
      "message": "fix(triple): preserve otel traceparent in TripleInvoker (#3285)\n\n* remove the config package from package client\n\n* fix(client): fail fast on invalid registry and method config\n\n* restore WithMethod in Server\n\n* fix lint of action_test\n\n* refactor: split processURL to reduce cognitive complexity\n\n* migrate the ValidateRegistryIDs to internal\n\n* fix the cmt\n\n* remove the validateRegistryIDs\n\n* fix 3240\n\n* fix lint\n\n* fix the constant or use http.CanonicalHeaderKey (staticcheck)"
    },
    {
      "commit": "72fad92914fe37a70ded63c763d31e530b65fa8d",
      "tree": "4a40ccc01bff655fea70bcb7729b16d1142486c7",
      "parents": [
        "1366ca14ff800562fedc77b28747609390dd5d0f"
      ],
      "author": {
        "name": "The Apache Software Foundation",
        "email": "root-asf-gitbox-commits@apache.org",
        "time": "Thu May 21 01:27:45 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:27:45 2026 +0800"
      },
      "message": "Set up default protection ruleset for default and release branches (#3325)"
    },
    {
      "commit": "5efce6140f2a8dde500d92cfe1cca737d0591806",
      "tree": "82d99e4aca983b194113e8492e58c65176f5d47f",
      "parents": [
        "db2a487b3a943e7c5db8b97d7205163e89abab0a",
        "1240af60db00f4a6bf1b5287957f704573c7326a"
      ],
      "author": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:06:08 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:06:08 2026 +0800"
      },
      "message": "Merge branch \u0027develop\u0027 of https://github.com/apache/dubbo-go into develop\n"
    },
    {
      "commit": "db2a487b3a943e7c5db8b97d7205163e89abab0a",
      "tree": "82d99e4aca983b194113e8492e58c65176f5d47f",
      "parents": [
        "9bbcca6d4a7e70f4cb8b87d7b3a5d04ce1ca6b7d"
      ],
      "author": {
        "name": "Yuqi Qiao",
        "email": "19606363088@163.com",
        "time": "Wed May 20 17:18:48 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:48 2026 +0800"
      },
      "message": "Refactor/config center filter logger (#3335)\n\n* refactor(filter): standardize log format with component prefixes\n\nUnified prefix format: [Filter][AccessLog/Active/AdaptiveSvc/Auth/ExecLimit/Generic/GracefulShutdown/Handler/Polaris/Seata/Sentinel/TPS]\nReplaced %+v → %v for Info/Warn/Error levels\nRenamed error\u003d → err\u003d in key-value parameters\nStandardized parameter separator: colon-space → comma-space\nFixed buggy logger.Error(err) / logger.Warn(err) calls → Errorf/Warnf\nFlattened multi-line log messages to single line with key\u003dvalue pairs\n\n* refactor(config-center): standardize log format with component prefixes\n\nUnified prefix format: [ConfigCenter][Apollo/Nacos/Zookeeper/File/Parser]\nReplaced %+v → %v for Info/Warn/Error levels\nRenamed error\u003d → err\u003d in key-value parameters\nStandardized parameter separator: colon-space → comma-space\nRemoved inconsistent ad-hoc prefixes (nacos :, file :, (NacosProviderRegistry))\nFixed {%v} wrapping → %v in parser\nFixed logger.Warnf call missing format args (nacos/facade.go)\n\n* refactor:Standardize logging text style across config_center and filter packages\nremove Graceful shutdown,\nadd [Filter][Polaris][TPS] prefix\nmake the first letter of each sentence/line lowercase"
    },
    {
      "commit": "9bbcca6d4a7e70f4cb8b87d7b3a5d04ce1ca6b7d",
      "tree": "d4cb7e0adea84adcb6b458cd96ee7571c39d12e0",
      "parents": [
        "4932a6e40823bafc6f53bbfa40f2f58c59241282"
      ],
      "author": {
        "name": "Qiao-yq",
        "email": "19606363088@163.com",
        "time": "Sun May 17 12:28:02 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "Refactor/common config logger format (#3324)\n\n* refactor(common): standardize log format with component prefixes\n\n- Add [GracefulShutdown], [Trace], [ProxyFactory], [RegistryDir],\n  and [RPCService] prefixes for consistent log filtering\n- Use structured key\u003dvalue format (name\u003d%s, err\u003d%v) in log messages\n- Clean up import grouping in registry_directory.go\n\n* refactor(config): standardize log format with component prefixes\n\n- Add [Config Center], [ConfigLoader], [ConfigResolver], [Consumer],\n  [GracefulShutdown], [Metadata Service], [OTel], [Provider], [Reference],\n  [Registry], [Service] prefixes for consistent log filtering\n- Use structured key\u003dvalue format (key\u003d%s, err\u003d%v) instead of free-form text\n- Fix format verbs: replace %#v/%w with %v for cleaner error output\n- Remove unused imports (fmt in provider_config.go)\n\n* style: auto-format code with make fmt\n\n* revert: restore config/ directory from upstream/develop\n\n* refactor: add[Cluster]\n\n* refactor:Update OTEL trace shutdown logs to use [GracefulShutdown] prefix"
    },
    {
      "commit": "4932a6e40823bafc6f53bbfa40f2f58c59241282",
      "tree": "1edef48355e8f10ca2b3b3112835ae8a6d11c826",
      "parents": [
        "f912305b1c4e3eff1326093bfe3ee2940771e43e"
      ],
      "author": {
        "name": "CAICAII",
        "email": "3360776475@qq.com",
        "time": "Sat May 16 10:32:05 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "fix(config): keep instance options in global config (#3320)\n\n* fix(config): keep instance options in global config"
    },
    {
      "commit": "f912305b1c4e3eff1326093bfe3ee2940771e43e",
      "tree": "c5d6ce7837990a82566241d760f1355795b6c0ec",
      "parents": [
        "0da70c7e2e03e05c1b5d716c89b3e4d947d77514"
      ],
      "author": {
        "name": "nagisa-kunhah",
        "email": "61525444+nagisa-kunhah@users.noreply.github.com",
        "time": "Fri May 15 12:46:31 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "fix: remove viper (#3323)\n\n* fix: remove viper\n\n* update: gopkg.in/yaml.v2 -\u003e v3"
    },
    {
      "commit": "0da70c7e2e03e05c1b5d716c89b3e4d947d77514",
      "tree": "8afbe65052c268e0e06ceeec32ab789e6de5dfeb",
      "parents": [
        "083136f89052a41aa7e098c913ce2df946931f39"
      ],
      "author": {
        "name": "Qiao-yq",
        "email": "19606363088@163.com",
        "time": "Thu May 14 16:02:50 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "Refactor/cluster logger format (#3311)\n\n* refactor(cluster/adaptivesvc): standardize logger format to [AdaptiveSvc]\n\n- Replace [adasvc cluster] with [AdaptiveSvc] prefix\n- Use key\u003dvalue for structured parameters\n- Remove decorative characters and verbosity\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster/base): standardize logger format\n\n- Add [Cluster] prefix to Error/Info logs for multi-implementation clarity\n- Replace verbose messages with concise action-oriented expressions\n- Use key\u003dvalue format for structured parameters\n- Remove decorative punctuation and unnecessary descriptions\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster): standardize logger format for /cluster/cluster\n\n- add [Broadcast] prefix to warn logs\n- add [Failback] prefix to all error/warn logs, add backoff parameter\n- add [Failover] prefix to error logs, remove fmt.Sprintf wrapper\n- add [Failsafe] prefix to error logs\n- add [Forking] prefix to error logs\n- add [Mock] prefix to info logs\n- change parameter format to key\u003dvalue (e.g., err\u003d%v, method\u003d%s)\n- remove decorative characters (colons, dots, newlines)\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster): standardize logger format for loadbalance/p2c and director\nStandardize the log prefix to [P2C], and format parameters as key\u003dvalue.\nAdd the [Directory] prefix to Error logs\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster/router): standardize logger format for router modules\n\n- Add component prefix: [Router] [Condition], [Router] [Polaris], [Router] [Script], [Router] [Tag], [Affinity], [Condition], [Argument], [Attachment], [Matcher], [Scope], [Chain]\n- Format parameters as key\u003dvalue instead of colon-separated\n- Use Info/Warn/Error for fixed strings, only use Infof/Warnf/Errorf when formatting needed\n- Remove decorative characters (commas, colons, trailing dots)\n- Simplify log messages and remove redundant parameters\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* fix(cluster): format code to pass CI check\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster): standardize logger format for cluster submodules\n\nUnify log prefixes to [Component][Submodule] pattern for consistency. Add expected type hints to type\nvalidation error logs and include reason\u003dnil context in base cluster invoker. Lowercase log messages for consistent formatting.\n\n* fix: format cluster_invoker.go\n\n* refactor: unify logger prefix formatting in router and cluster invokers\n\n- change condition router log tags from \"[Condition]\" and \"[Router] [Condition]\" to \"[Router][Condition]\"\n- change Polaris router logs from \"[Router] [Polaris]\" to \"[Router][Polaris]\"\n- change Script router logs from \"[Router] [Script]\" to \"[Router][Script]\"\n- change Tag router logs from \"[Router] [Tag]\" to \"[Router][Tag]\"\n- change AdaptiveSvc and Broadcast cluster invoker logs from \"[AdaptiveSvc]\" / \"[Broadcast]\" to \"[Cluster][AdaptiveSvc]\" / \"[Cluster][Broadcast]\"\n\n---------\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e"
    },
    {
      "commit": "083136f89052a41aa7e098c913ce2df946931f39",
      "tree": "322bbb17886960073c0b339293036545a957803f",
      "parents": [
        "67ec99f307cfd65625aaa9deb9285dc2051461e9"
      ],
      "author": {
        "name": "eye-gu",
        "email": "734164350@qq.com",
        "time": "Wed May 13 10:21:37 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "fix(consistenthashing): add mutex to protect global selectors map from concurrent access (#3317)"
    },
    {
      "commit": "67ec99f307cfd65625aaa9deb9285dc2051461e9",
      "tree": "51b54ef015a35f890fc3813f0e4fcb928dfba17d",
      "parents": [
        "d8954af2e5760e925583f9d8b3dd1801108198d1"
      ],
      "author": {
        "name": "Zecheng Zhu",
        "email": "1662308219@qq.com",
        "time": "Sat May 09 13:54:31 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "feat: support mounting existing HTTP handlers on the Triple listener (#3301)\n\n* set http service fallback handler into mux\n\n* feat: add HTTP handler mounting for triple servers\n\n* set mounted http handler int server and refactor server start\n\n* mount first and http only server\n\n* fix: validate transport settings when reusing listeners\n\n* fix: determine whether the HTTP handler has already been mounted\n\n* refactor: clarify attach/host/fallback naming\n\n* fix: keep health status and attached HTTP startup consistent"
    },
    {
      "commit": "d8954af2e5760e925583f9d8b3dd1801108198d1",
      "tree": "c5014a0aa4ee525e4fa3bc461940805187aa8138",
      "parents": [
        "d3b10c4f0dac5eccb2acc807e9e0f9dd7111c0f8"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Thu Apr 30 06:50:22 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "fix(registry): preserve Nacos providers and environment metadata (#3309)"
    },
    {
      "commit": "d3b10c4f0dac5eccb2acc807e9e0f9dd7111c0f8",
      "tree": "2bfd99a7755c0961b716790a6095d1dfa1945646",
      "parents": [
        "5ead6439c3e8ea16e72b731b5d67e3d66f35c7e4"
      ],
      "author": {
        "name": "Oxidaner",
        "email": "80675726+Oxidaner@users.noreply.github.com",
        "time": "Thu Apr 30 06:49:02 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "feat: simplify server shutdown lifecycle #3042 (#3293)\n\n* feat: add caller-controlled ServeContext\n\n* fix: drop readiness during graceful shutdown"
    },
    {
      "commit": "5ead6439c3e8ea16e72b731b5d67e3d66f35c7e4",
      "tree": "0fe2bb3640ebfa9720a7f2b87083b1110762f200",
      "parents": [
        "6110bc16ff31145576e00610445c9427a456abd4"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Wed Apr 29 21:05:50 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "fix(triple): make protocol initialization and invoker tracking race-safe (#3307)"
    },
    {
      "commit": "6110bc16ff31145576e00610445c9427a456abd4",
      "tree": "e92987570855d99155c195250bf35b2b9e881227",
      "parents": [
        "e533cec4270eed5580ab444ea64ab1472bf95d0a"
      ],
      "author": {
        "name": "eye-gu",
        "email": "734164350@qq.com",
        "time": "Wed Apr 29 21:02:33 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "fix(jsonrpc): prevent nil pointer panic when exporter not found in ExporterMap (#3312)"
    },
    {
      "commit": "e533cec4270eed5580ab444ea64ab1472bf95d0a",
      "tree": "9509ff87d9207f88c15210b54f6c63ae0ac8f770",
      "parents": [
        "676fa8637aca81adc2eac50265c59778db51039c"
      ],
      "author": {
        "name": "nagisa-kunhah",
        "email": "61525444+nagisa-kunhah@users.noreply.github.com",
        "time": "Wed Apr 29 13:16:39 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "Fix/3246 url memory leaks (#3282)\n\n* fix: registryProtocol singleton leaks\n\n* fix: URL attributes are write-only — no DeleteAttribute method exists\n\n* fix: P1-2:\n\n* fix: p1-3\n\n* fix: P1-4\n\n* fix: P1-5\n\n* fix: P2-1\n\n* fix: P2-2\n\n* fix: P2-3:\n\n* fix: P2-4\n\n* fix: format\n\n* fix: lint, set c.attributes to empty map\n\n* fix: format\n\n* fix: comment\n\n* fix: cachedProviderEvents\n\n* fix: unsubscribe after Destroy and reExport, clone url in ToConfigurators\n\n* fix: ci"
    },
    {
      "commit": "676fa8637aca81adc2eac50265c59778db51039c",
      "tree": "29d153ef06920ef792eaca7cd36a2ee30b325756",
      "parents": [
        "1366ca14ff800562fedc77b28747609390dd5d0f"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Tue Apr 28 11:41:18 2026 +0800"
      },
      "committer": {
        "name": "Xin.Zh",
        "email": "alexstocks@foxmail.com",
        "time": "Thu May 21 14:05:47 2026 +0800"
      },
      "message": "feat: add variadic RPC warnings and checks (#3294)\n\n* feat: add variadic RPC warnings and checks"
    },
    {
      "commit": "1366ca14ff800562fedc77b28747609390dd5d0f",
      "tree": "6d1d505de9a2e6f0f26cd002d3028c6a8e959396",
      "parents": [
        "ea93b8a9e1c0a9b8b05e786d955ab4f8aeaa221d"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu May 21 07:56:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 13:56:50 2026 +0800"
      },
      "message": "fix(registry): make base configurators thread-safe (#3333)\n\n* fix(registry): guard base configurators\n\n* test(registry): use require for error assertion\n\n* test(registry): cover base listener init paths\n\n* test(registry): cover invalid initial rule"
    },
    {
      "commit": "1240af60db00f4a6bf1b5287957f704573c7326a",
      "tree": "414098d84602c68ba74b7b2bd95748c8ac0a34b6",
      "parents": [
        "69fced7791a9a6e83ce0421b4abb349ba65e0bc7"
      ],
      "author": {
        "name": "Yuqi Qiao",
        "email": "19606363088@163.com",
        "time": "Wed May 20 17:18:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 17:18:48 2026 +0800"
      },
      "message": "Refactor/config center filter logger (#3335)\n\n* refactor(filter): standardize log format with component prefixes\n\nUnified prefix format: [Filter][AccessLog/Active/AdaptiveSvc/Auth/ExecLimit/Generic/GracefulShutdown/Handler/Polaris/Seata/Sentinel/TPS]\nReplaced %+v → %v for Info/Warn/Error levels\nRenamed error\u003d → err\u003d in key-value parameters\nStandardized parameter separator: colon-space → comma-space\nFixed buggy logger.Error(err) / logger.Warn(err) calls → Errorf/Warnf\nFlattened multi-line log messages to single line with key\u003dvalue pairs\n\n* refactor(config-center): standardize log format with component prefixes\n\nUnified prefix format: [ConfigCenter][Apollo/Nacos/Zookeeper/File/Parser]\nReplaced %+v → %v for Info/Warn/Error levels\nRenamed error\u003d → err\u003d in key-value parameters\nStandardized parameter separator: colon-space → comma-space\nRemoved inconsistent ad-hoc prefixes (nacos :, file :, (NacosProviderRegistry))\nFixed {%v} wrapping → %v in parser\nFixed logger.Warnf call missing format args (nacos/facade.go)\n\n* refactor:Standardize logging text style across config_center and filter packages\nremove Graceful shutdown,\nadd [Filter][Polaris][TPS] prefix\nmake the first letter of each sentence/line lowercase"
    },
    {
      "commit": "69fced7791a9a6e83ce0421b4abb349ba65e0bc7",
      "tree": "56fa6b85dfa826a2ef834a836ef4a2ab676eac71",
      "parents": [
        "3b7740adf2d6a7924d1baa6b56de926ef0e4bd3f"
      ],
      "author": {
        "name": "Qiao-yq",
        "email": "19606363088@163.com",
        "time": "Sun May 17 12:28:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 12:28:02 2026 +0800"
      },
      "message": "Refactor/common config logger format (#3324)\n\n* refactor(common): standardize log format with component prefixes\n\n- Add [GracefulShutdown], [Trace], [ProxyFactory], [RegistryDir],\n  and [RPCService] prefixes for consistent log filtering\n- Use structured key\u003dvalue format (name\u003d%s, err\u003d%v) in log messages\n- Clean up import grouping in registry_directory.go\n\n* refactor(config): standardize log format with component prefixes\n\n- Add [Config Center], [ConfigLoader], [ConfigResolver], [Consumer],\n  [GracefulShutdown], [Metadata Service], [OTel], [Provider], [Reference],\n  [Registry], [Service] prefixes for consistent log filtering\n- Use structured key\u003dvalue format (key\u003d%s, err\u003d%v) instead of free-form text\n- Fix format verbs: replace %#v/%w with %v for cleaner error output\n- Remove unused imports (fmt in provider_config.go)\n\n* style: auto-format code with make fmt\n\n* revert: restore config/ directory from upstream/develop\n\n* refactor: add[Cluster]\n\n* refactor:Update OTEL trace shutdown logs to use [GracefulShutdown] prefix"
    },
    {
      "commit": "3b7740adf2d6a7924d1baa6b56de926ef0e4bd3f",
      "tree": "4b8082d2e5b533cc5b1ba4ea0c1de9259f96291e",
      "parents": [
        "d14103192b4ba5a1ed127c4372993a33db8122f4"
      ],
      "author": {
        "name": "CAICAII",
        "email": "3360776475@qq.com",
        "time": "Sat May 16 10:32:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 16 10:32:05 2026 +0800"
      },
      "message": "fix(config): keep instance options in global config (#3320)\n\n* fix(config): keep instance options in global config"
    },
    {
      "commit": "d14103192b4ba5a1ed127c4372993a33db8122f4",
      "tree": "4ed78b762807d2af40b66f63d058a41b04b09f83",
      "parents": [
        "6cd28704ffc7ae58e8839bea60b872f64da04284"
      ],
      "author": {
        "name": "nagisa-kunhah",
        "email": "61525444+nagisa-kunhah@users.noreply.github.com",
        "time": "Fri May 15 12:46:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 12:46:31 2026 +0800"
      },
      "message": "fix: remove viper (#3323)\n\n* fix: remove viper\n\n* update: gopkg.in/yaml.v2 -\u003e v3"
    },
    {
      "commit": "6cd28704ffc7ae58e8839bea60b872f64da04284",
      "tree": "06075675109ce12f3207b8bcfa278e7a44367294",
      "parents": [
        "6a26761be5ef860626a11f0235c4eccdf41d593b"
      ],
      "author": {
        "name": "Qiao-yq",
        "email": "19606363088@163.com",
        "time": "Thu May 14 16:02:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 16:02:50 2026 +0800"
      },
      "message": "Refactor/cluster logger format (#3311)\n\n* refactor(cluster/adaptivesvc): standardize logger format to [AdaptiveSvc]\n\n- Replace [adasvc cluster] with [AdaptiveSvc] prefix\n- Use key\u003dvalue for structured parameters\n- Remove decorative characters and verbosity\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster/base): standardize logger format\n\n- Add [Cluster] prefix to Error/Info logs for multi-implementation clarity\n- Replace verbose messages with concise action-oriented expressions\n- Use key\u003dvalue format for structured parameters\n- Remove decorative punctuation and unnecessary descriptions\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster): standardize logger format for /cluster/cluster\n\n- add [Broadcast] prefix to warn logs\n- add [Failback] prefix to all error/warn logs, add backoff parameter\n- add [Failover] prefix to error logs, remove fmt.Sprintf wrapper\n- add [Failsafe] prefix to error logs\n- add [Forking] prefix to error logs\n- add [Mock] prefix to info logs\n- change parameter format to key\u003dvalue (e.g., err\u003d%v, method\u003d%s)\n- remove decorative characters (colons, dots, newlines)\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster): standardize logger format for loadbalance/p2c and director\nStandardize the log prefix to [P2C], and format parameters as key\u003dvalue.\nAdd the [Directory] prefix to Error logs\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster/router): standardize logger format for router modules\n\n- Add component prefix: [Router] [Condition], [Router] [Polaris], [Router] [Script], [Router] [Tag], [Affinity], [Condition], [Argument], [Attachment], [Matcher], [Scope], [Chain]\n- Format parameters as key\u003dvalue instead of colon-separated\n- Use Info/Warn/Error for fixed strings, only use Infof/Warnf/Errorf when formatting needed\n- Remove decorative characters (commas, colons, trailing dots)\n- Simplify log messages and remove redundant parameters\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* fix(cluster): format code to pass CI check\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e\n\n* refactor(cluster): standardize logger format for cluster submodules\n\nUnify log prefixes to [Component][Submodule] pattern for consistency. Add expected type hints to type\nvalidation error logs and include reason\u003dnil context in base cluster invoker. Lowercase log messages for consistent formatting.\n\n* fix: format cluster_invoker.go\n\n* refactor: unify logger prefix formatting in router and cluster invokers\n\n- change condition router log tags from \"[Condition]\" and \"[Router] [Condition]\" to \"[Router][Condition]\"\n- change Polaris router logs from \"[Router] [Polaris]\" to \"[Router][Polaris]\"\n- change Script router logs from \"[Router] [Script]\" to \"[Router][Script]\"\n- change Tag router logs from \"[Router] [Tag]\" to \"[Router][Tag]\"\n- change AdaptiveSvc and Broadcast cluster invoker logs from \"[AdaptiveSvc]\" / \"[Broadcast]\" to \"[Cluster][AdaptiveSvc]\" / \"[Cluster][Broadcast]\"\n\n---------\n\nSigned-off-by: qyq316 \u003c19606363088@163.com\u003e"
    },
    {
      "commit": "6a26761be5ef860626a11f0235c4eccdf41d593b",
      "tree": "3c08cd01fdd901fabee31c8d08afa8f81e9e63f0",
      "parents": [
        "9af53959c61744fd1dc005caf0492e8d198ff51c"
      ],
      "author": {
        "name": "eye-gu",
        "email": "734164350@qq.com",
        "time": "Wed May 13 10:21:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 10:21:37 2026 +0800"
      },
      "message": "fix(consistenthashing): add mutex to protect global selectors map from concurrent access (#3317)"
    },
    {
      "commit": "9af53959c61744fd1dc005caf0492e8d198ff51c",
      "tree": "5232d7e895a66d5bd32e62a1bf06489e906d9ff0",
      "parents": [
        "7dd73d80912d6105300c26ae9bcd0fa8d3a8fbc7"
      ],
      "author": {
        "name": "Zecheng Zhu",
        "email": "1662308219@qq.com",
        "time": "Sat May 09 13:54:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 09 13:54:31 2026 +0800"
      },
      "message": "feat: support mounting existing HTTP handlers on the Triple listener (#3301)\n\n* set http service fallback handler into mux\n\n* feat: add HTTP handler mounting for triple servers\n\n* set mounted http handler int server and refactor server start\n\n* mount first and http only server\n\n* fix: validate transport settings when reusing listeners\n\n* fix: determine whether the HTTP handler has already been mounted\n\n* refactor: clarify attach/host/fallback naming\n\n* fix: keep health status and attached HTTP startup consistent"
    },
    {
      "commit": "7dd73d80912d6105300c26ae9bcd0fa8d3a8fbc7",
      "tree": "ba2cc7cc7bd28e9391d7aae9cd928cba3445dae5",
      "parents": [
        "313904c88fe4f082d191a210200d7eb2b1a281fc"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Thu Apr 30 06:50:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 06:50:22 2026 +0800"
      },
      "message": "fix(registry): preserve Nacos providers and environment metadata (#3309)"
    },
    {
      "commit": "313904c88fe4f082d191a210200d7eb2b1a281fc",
      "tree": "6b5542ae670228af77055c78520f85a7a5fae5ed",
      "parents": [
        "f836ffa959b4a97ac8aaa3deb112705e0c9dca88"
      ],
      "author": {
        "name": "Oxidaner",
        "email": "80675726+Oxidaner@users.noreply.github.com",
        "time": "Thu Apr 30 06:49:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 06:49:02 2026 +0800"
      },
      "message": "feat: simplify server shutdown lifecycle #3042 (#3293)\n\n* feat: add caller-controlled ServeContext\n\n* fix: drop readiness during graceful shutdown"
    },
    {
      "commit": "f836ffa959b4a97ac8aaa3deb112705e0c9dca88",
      "tree": "aa437387b3d3098e223a4ce5b13b33cf6fa881ed",
      "parents": [
        "75f66ca88ef66b636d8186a768a3c8c8c24f2f3a"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Wed Apr 29 21:05:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 21:05:50 2026 +0800"
      },
      "message": "fix(triple): make protocol initialization and invoker tracking race-safe (#3307)"
    },
    {
      "commit": "75f66ca88ef66b636d8186a768a3c8c8c24f2f3a",
      "tree": "e27ea8f203831ab4404aa39113c58872408f29fd",
      "parents": [
        "e05b0e120578ae84b7cf961fd3e897dff4b1f339"
      ],
      "author": {
        "name": "eye-gu",
        "email": "734164350@qq.com",
        "time": "Wed Apr 29 21:02:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 21:02:33 2026 +0800"
      },
      "message": "fix(jsonrpc): prevent nil pointer panic when exporter not found in ExporterMap (#3312)"
    },
    {
      "commit": "e05b0e120578ae84b7cf961fd3e897dff4b1f339",
      "tree": "edf94b26d491811486998a503a97cc62c80426eb",
      "parents": [
        "15053b3254afaf5dbab640293d1b33fdbe76a7f8"
      ],
      "author": {
        "name": "nagisa-kunhah",
        "email": "61525444+nagisa-kunhah@users.noreply.github.com",
        "time": "Wed Apr 29 13:16:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 29 13:16:39 2026 +0800"
      },
      "message": "Fix/3246 url memory leaks (#3282)\n\n* fix: registryProtocol singleton leaks\n\n* fix: URL attributes are write-only — no DeleteAttribute method exists\n\n* fix: P1-2:\n\n* fix: p1-3\n\n* fix: P1-4\n\n* fix: P1-5\n\n* fix: P2-1\n\n* fix: P2-2\n\n* fix: P2-3:\n\n* fix: P2-4\n\n* fix: format\n\n* fix: lint, set c.attributes to empty map\n\n* fix: format\n\n* fix: comment\n\n* fix: cachedProviderEvents\n\n* fix: unsubscribe after Destroy and reExport, clone url in ToConfigurators\n\n* fix: ci"
    },
    {
      "commit": "15053b3254afaf5dbab640293d1b33fdbe76a7f8",
      "tree": "e6c6b786ce6ab6e111902f62af797e4ecac5f68c",
      "parents": [
        "ea93b8a9e1c0a9b8b05e786d955ab4f8aeaa221d"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Tue Apr 28 11:41:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:41:18 2026 +0800"
      },
      "message": "feat: add variadic RPC warnings and checks (#3294)\n\n* feat: add variadic RPC warnings and checks"
    },
    {
      "commit": "ea93b8a9e1c0a9b8b05e786d955ab4f8aeaa221d",
      "tree": "3f520cec857e24ed8ca71c82dfcd9197bf9812d4",
      "parents": [
        "10f57d800065f39c984d47888eaf83d44900d03d"
      ],
      "author": {
        "name": "xxs",
        "email": "2127069700@qq.com",
        "time": "Wed Apr 22 14:22:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 14:22:21 2026 +0800"
      },
      "message": "fix(race): close remaining #3247 shared-state races (#3269)\n\n* fix(directory): guard registry directory concurrent state access\n\nFixes: #3247\n\n* fix(registry/protocol): synchronize override listener configurator\n\nFixes: #3247\n\n* fix(metrics): guard app info global state with RWMutex\n\nFixes: #3247\n\n* fix(config_center/file): synchronize listener set access\n\n- guard per-key listener collection with RWMutex and snapshot callbacks\n- remove direct concurrent map iteration/delete in watcher paths\n- harden callback timing test against fsnotify duplicate-event jitter\n- addresses flaky Unit Test failure observed on PR #3269 CI\n\nFixes: #3247\n\n* docs(race): clarify concurrency assumptions in hystrix/listener/metrics comments\n\n* test(file-config): add unit tests for listener helper functions\n\nadd direct test coverage for drainEvents\n\nadd direct test coverage for assertNoEvent\n\nkeep review scope minimal without unrelated logic changes\n\n* docs(file-config): clarify listener snapshot immutability contract\n\nclarify that both returned snapshot slice and listeners are immutable for callers\n\n* fix(directory): align subscribedUrlLock naming with upstream\n\nChange field name from subscribedURLLock to subscribedUrlLock\nto match upstream/develop naming convention (lowercase \u0027url\u0027).\nResolves merge conflict with upstream/develop."
    },
    {
      "commit": "10f57d800065f39c984d47888eaf83d44900d03d",
      "tree": "1338a6f8aa179a72130502f6c261d3a938c3d969",
      "parents": [
        "bafeb2055fac2ed082576c5e603f23924f57777e"
      ],
      "author": {
        "name": "MrSibe",
        "email": "mrsibe@qq.com",
        "time": "Wed Apr 22 14:21:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 14:21:46 2026 +0800"
      },
      "message": "feat(logger): add CtxLogger interface for OpenTelemetry trace integration (#3195)\n\n* feat(logger): add CtxLogger interface and trace extraction utilities\n\nAdd context-aware logging support to integrate with OpenTelemetry traces:\n\n- Add CtxLogger interface extending Logger with context-aware methods\n- Create trace_extractor.go to extract traceId, spanId, and trace_flags from context\n- Add configuration constants for trace integration (enabled, record-error-to-span)\n\nThis is the foundation for issue #3182 - providing ctxLogger interface\nto correlate logs with distributed traces.\n\n* feat(logger): add Zap CtxLogger adapter for trace integration\n\nImplement context-aware logging adapter for Zap:\n\n- Add ZapCtxLogger that wraps DubboLogger\n- Automatically inject trace_id, span_id, trace_flags from context\n- Support optional error recording to span\n- Integrate with existing Zap instantiation logic\n\n* feat(logger): add Logrus CtxLogger adapter for trace integration\n\nImplement context-aware logging adapter for Logrus:\n\n- Add LogrusCtxLogger that wraps DubboLogger\n- Automatically inject trace_id, span_id, trace_flags from context\n- Support optional error recording to span\n- Integrate with existing Logrus instantiation logic\n\n* feat(config): add trace integration configuration for logger\n\nExtend LoggerConfig to support trace integration:\n\n- Add TraceIntegrationConfig struct with enabled and record-error-to-span options\n- Update toURL() method to pass trace integration parameters\n- Enable users to configure trace logging via YAML\n\n* test(logger): add unit tests for ctxLogger and trace extraction\n\nAdd comprehensive unit tests:\n\n- trace_extractor_test.go: test trace field extraction from context\n- zap/ctx_logger_test.go: test Zap adapter with trace injection\n- logrus/ctx_logger_test.go: test Logrus adapter with trace injection\n- Fix import error in logrus/ctx_logger.go (move errors import to top)\n\nAll tests pass successfully, verifying:\n- Trace fields are correctly extracted from valid span context\n- Logs include trace_id, span_id, trace_flags when context has trace\n- Logs work normally without trace context (backward compatible)\n\n* fix(logger): format source code\n\n* test(logger): add recordErrorToSpan tests and fix inconsistency\n\n- Add comprehensive unit tests for recordErrorToSpan functionality in both Zap and Logrus CtxLogger implementations\n- Test coverage includes: enabled/disabled states, span status verification, and error event recording\n- Fix error creation inconsistency in Zap implementation to use errors.New instead of fmt.Errorf for consistency with Logrus\n\n* test(logger): use assert.Empty for empty slice checks\n\nFix testifylint errors by replacing assert.Len(t, events, 0) with assert.Empty(t, events) for better readability.\n\n* feat(logger): make TraceIntegration compatible with New API\n\nAdd TraceIntegration support to global.LoggerConfig to enable\ntrace integration features in New API.\n\n* feat(logger): add New API options for trace integration\n\nAdd WithTraceIntegration and WithRecordErrorToSpan options to enable CtxLogger configuration through New API.\n\n* refactor(global): simplify pointer assignment in Clone method\n\nUse idiomatic Go pattern for creating pointer copies.\n\n* feat(config): add trace integration support to LoggerConfigBuilder\n\nAdd SetTraceIntegrationEnabled() and SetRecordErrorToSpan() methods to\nLoggerConfigBuilder to support trace integration configuration via the\nOld API (Builder pattern)."
    },
    {
      "commit": "bafeb2055fac2ed082576c5e603f23924f57777e",
      "tree": "8fe3d569496be2f1108776db4e050411d2c9429b",
      "parents": [
        "b52803d207b7130805b8b719fb976432d8f1b43b"
      ],
      "author": {
        "name": "eye-gu",
        "email": "734164350@qq.com",
        "time": "Mon Apr 20 12:55:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 12:55:23 2026 +0800"
      },
      "message": "fix(jsonrpc): prevent nil pointer panic on unsupported content type (#3298)\n\n* fix(jsonrpc): prevent nil pointer panic on unsupported content type\n\n* Use mime.ParseMediaType and add test"
    },
    {
      "commit": "b52803d207b7130805b8b719fb976432d8f1b43b",
      "tree": "210a87cbd57de47dd4e6b3ab02aaa5d75f343189",
      "parents": [
        "c3f114dff5c2e0d9963b65625c323436eda6bffe"
      ],
      "author": {
        "name": "翎",
        "email": "1820661379@qq.com",
        "time": "Sun Apr 19 10:27:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 19 10:27:15 2026 +0800"
      },
      "message": "Feat/3255 new config api tests (#3283)\n\n* test(new-config-api): add instance integration smoke test\n\ncover NewInstance -\u003e NewServer/NewClient -\u003e unary call path with tri direct url\n\ninclude required SPI imports for cluster/loadbalance and deterministic cleanup\n\n* test(new-config-api): trim instance itest dependencies\n\nreplace broad SPI imports with minimal required ones\n\nset server filter to echo and client cluster to available to reduce registration requirements\n\n* test(new-config-api): add priority integration tests\n\ncover server and client precedence between instance defaults and per-layer overrides\n\nverify overrides do not pollute later NewServer/NewClient creations\n\n* test(new-config-api): add compat integration tests\n\nadd compat round-trip and nil-handling tests for key config sections\n\nalign inst/prio test files with concise English comments following repo style\n\n* test(new-config-api): rename itest files to integration\n\nrename inst/prio/compat test files to integration naming\n\nkeep test behavior unchanged and update integration instance name\n\n* test(new-config-api): satisfy testifylint empty assertions\n\nreplace Len(..., 0) with Empty(...) in compat integration test\n\n* test(new-config-api): bound unary retries by attempt timeout\n\nuse context.WithTimeout per retry to prevent hanging CallUnary from wedging CI\n\n* test(new-config-api): move tests to module packages without integration suffix\n\n* test(client): shorten priority test constant names\n\n* test(config): split compat coverage into focused tests\n\n* test(server): add retry diagnostics in instance unary call test\n\n* test(server): split instance flow test and shorten names\n\n* test(config): refactor compat fixture with factory helpers\n\n* test(client): simplify prio test names and strengthen service option assertions\n\n* style: imports-formatter\n\n* style: imports-formatter\n\n* style: imports-formatter\n\n* style: imports-formatter\n\n* fix: adjust comment format"
    },
    {
      "commit": "c3f114dff5c2e0d9963b65625c323436eda6bffe",
      "tree": "aa8b7d2e96674bc92083ec55f056788500001c32",
      "parents": [
        "f17993d5d2d989d53299cde9e1c235d17b35b536"
      ],
      "author": {
        "name": "Zecheng Zhu",
        "email": "1662308219@qq.com",
        "time": "Fri Apr 17 10:44:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 10:44:11 2026 +0800"
      },
      "message": "feat: add stateful HTTP/3 negotiation with probe and cooldown (#3281)\n\n* refactor: use RoundTripper rather than Transport\n\n* h3 failed return err and update state\n\n* complete probe http3\n\n* complete fallback cooldown\n\n* add test for dualtransport\n\n* avoid request time out and then mark H3 failed\n\n* make the semantics clearer\n\n* test: add concurrent h2 start single probe"
    },
    {
      "commit": "f17993d5d2d989d53299cde9e1c235d17b35b536",
      "tree": "ad5991aac87962b3f1b130756a75eba30e7bb3b3",
      "parents": [
        "e12d8c5f97885075361b468356703b1d91058167"
      ],
      "author": {
        "name": "xxs",
        "email": "2127069700@qq.com",
        "time": "Fri Apr 17 10:42:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 10:42:23 2026 +0800"
      },
      "message": "fix: close #3247 nacos/directory lifecycle race risks (#3270)\n\n* fix(registry/nacos): make scheduled lookup stoppable\n\n- replace sleep loop with ticker + done select in scheduledLookUp\n- ensure lookup goroutine exits promptly when registry is destroyed\n- add regression test for done-triggered exit\n\nFixes: #3247\n\n* fix(directory): harden subscribe timeout lifecycle\n\n- register consumer with timeout before starting subscribe goroutine\n- use URL clone in register path to avoid cross-goroutine URL mutation races\n- add timeout regression test to ensure subscribe is not started on register timeout\n\nFixes: #3247\n\n* style: rename subscribedURLLock to subscribedUrlLock\n\nCo-authored-by: Xuetao Li \u003cxuetaoli@apache.org\u003e\n\n* fix(directory): align subscribedUrlLock references\n\n* test(directory): stabilize subscribe timeout case and clarify lifecycle comments\n\n* test(directory): avoid unsynchronized cacheInvokers reads in tests\n\n* fix(routerchain): snapshot invokers before routing\n\n* fix(directory): rollback late register success after timeout\n\n* fix(directory): decouple subscribe start from register timeout\n\nAddress PR #3270 P0 review: keep discovery path alive by starting registry.Subscribe before timeout-bounded Register.\n\nAlso fix newly surfaced test-side races under -race by replacing direct cacheInvokers reads with snapshotCacheInvokers and removing async Subscribe startup in normalRegistryDir.\n\n* fix(routerchain): repair merge-conflict break in snapshotInvokers\n\n---------\n\nCo-authored-by: Xuetao Li \u003cxuetaoli@apache.org\u003e"
    },
    {
      "commit": "e12d8c5f97885075361b468356703b1d91058167",
      "tree": "12ef536ce3d15e38d222dacb74266ed461f1592f",
      "parents": [
        "28fc318c6667f820191bb6670aac27a4378d0712"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Mon Apr 13 13:20:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 13:20:09 2026 +0800"
      },
      "message": "fix(generic): support variadic method invocation via generic call (#3284)\n\n* fix(generic): support variadic method invocation via generic call\n\n* fix(generic): support variadic invocation across reflection paths"
    },
    {
      "commit": "28fc318c6667f820191bb6670aac27a4378d0712",
      "tree": "43b4bc36f22d9519021e9f43989adb47ff3fce2c",
      "parents": [
        "707124f719536a926a3171a5932785fb86028321"
      ],
      "author": {
        "name": "eye-gu",
        "email": "734164350@qq.com",
        "time": "Sun Apr 12 20:35:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 12 20:35:50 2026 +0800"
      },
      "message": "feat: Triple Rest OpenAPI Support (#3280)\n\n* feat: Triple Rest OpenAPI Support\n\n* fix fmt\n\n* fix review\n\n* fix\n\n* check path valid and fix operationId\n\n* fix default config\n\n* fix path config and add redoc link"
    },
    {
      "commit": "707124f719536a926a3171a5932785fb86028321",
      "tree": "c6b1ed722b4fb3e6cd908fd5642213ad5267d02c",
      "parents": [
        "212813aaf944184eda53a43c81c139b8526f5d68"
      ],
      "author": {
        "name": "Aether",
        "email": "98370028+Aetherance@users.noreply.github.com",
        "time": "Sun Apr 12 20:34:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 12 20:34:53 2026 +0800"
      },
      "message": "feat(router): add static router configuration injection (#3252)\n\n* feat(router): add static router configuration injection\n\n- Add StaticConfigSetter interface for static config injection\n- Add global static router registry\n- Add router chain injection mechanism\n- Implement static config setters for condition and tag routers\n\n* add unit tests\n\n* fix(client): make setRouters use override semantics\n\n* docs(client): clarify router option append/replace semantics\n\n* fix(router): clone static router config before injecting setters\n\n* fix(tag-router): guard nil router flags in tag routing\n\n* docs(router): clarify static injection and dynamic override semantics\n\n* docs(client): document WithRouter append behavior\n\n* docs(router): clarify dynamic Process overrides static router config\n\n* remove unnecessary outer clone in injectRouterConfig\n\n* fix: ignore service-scope static tag configs\n\n* refactor: remove redundant nil check when appending routers\n\n* fix(router): remove chain-level static router scope matching\n\n* fix(router): log static router config type assertion failures as errors\n\n---------\n\nCo-authored-by: Aetherance \u003cinkToAether@gmail.com\u003e"
    },
    {
      "commit": "212813aaf944184eda53a43c81c139b8526f5d68",
      "tree": "53181c1f6d9ebf26e06212e31266c7d3c02b216b",
      "parents": [
        "c356735e93e3982a82e02a3f91829ddbb859b82b"
      ],
      "author": {
        "name": "xxs",
        "email": "2127069700@qq.com",
        "time": "Tue Mar 31 21:26:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 21:26:53 2026 +0800"
      },
      "message": "fix: close #3247 config/protocol shared-state races (#3271)\n\n* fix(config): synchronize rootConfig publication and access\n\n- guard global rootConfig pointer with RWMutex-backed accessors\n- make config.Load build a local RootConfig and initialize before publishing\n- route config consumers through GetRootConfig instead of direct global reads\n- avoid in-place global mutation in SetConsumerConfig\n- add concurrent Set/Get regression test for root config\n\nFixes: #3247\n\n* fix(protocol/dubbo): remove shared versionInt map state\n\n- remove package-level versionInt maps in dubbo impl and hessian2 response paths\n- compute version int per call to avoid shared mutable/global state\n- add concurrent isSupportResponseAttachment tests in both packages\n\nFixes: #3247\n\n* fix(config): replace rootConfig lock with atomic publication\n\n* fix(config): preserve defaults in SetConsumerConfig nil path\n\n* test(config): stabilize rootConfig concurrent set/get case\n\n* fix(config): make root config process update copy-on-write\n\nremove redundant internal getter for root config\n\nload root config directly from atomic store\n\navoid in-place dynamic updates by copy-on-write for registries and consumer\n\nadd tests to verify snapshot immutability during dynamic updates"
    },
    {
      "commit": "c356735e93e3982a82e02a3f91829ddbb859b82b",
      "tree": "81309523c0132d6617c4c5cbe4404de6123631d7",
      "parents": [
        "fb8eff2f090851261e2d1acfc55414ede91ca9c0"
      ],
      "author": {
        "name": "Oxidaner",
        "email": "80675726+Oxidaner@users.noreply.github.com",
        "time": "Sun Mar 29 21:13:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 21:13:09 2026 +0800"
      },
      "message": "feat: graceful shutdown #1977 (#3235)\n\n* 信号监听相关注释\n\n* graceful_shutdown\n\n* adjust fmt\n\n* adjust fmt\n\n* adjust fmt\n\n* feat: graceful_shutdown\n\n* adjust fmt\n\n* Restore annotations and adjust fmt\n\n* 1. tripleProtocol \u003d tp.(*TripleProtocol) assert problem\n2. Add sync.RWMutex protection; GetAllGracefulShutdownCallbacks returns rather than a copy of the original map.\n\n* 1.Eliminate bugs that might cause subtraction without addition\n\n* I added an optional interface, ClosingInstanceRemover, and implemented RemoveClosingInstance(instanceKey string) bool on RegistryDirectory\n\n* feat: add closing tombstones for registry directory\n\n* feat: register closing removers by service key\n\n* feat: dispatch passive closing events to directory handlers\n\n* feat: route closing connection errors through event handler\n\n* feat: add health-watch active graceful notice\n\n* refactor: isolate graceful shutdown notify sequencing\n\n* refactor: harden graceful shutdown protocol teardown\n\n* refactor: narrow graceful shutdown unregister phase\n\n* feat: add lightweight active notice ack stats\n\n* test: cover active health-watch closing flows\n\n* Refine graceful shutdown timeout and concurrency handling\n\n* Set default offline request window timeout\n\n* chore: run fmt\n\n* chore: add ASF header to graceful shutdown test\n\n* test: fix lint issues in graceful shutdown coverage\n\n* refactor: tighten graceful shutdown compatibility\n\n* refactor: remove duplicate grpc start flag assignment"
    },
    {
      "commit": "fb8eff2f090851261e2d1acfc55414ede91ca9c0",
      "tree": "28852803ecf4146a34265530bfb1f065cf520986",
      "parents": [
        "8fe1f4bc6d50b025899d7d075b9b860f3e5cb0be"
      ],
      "author": {
        "name": "承潜",
        "email": "2972013548@qq.com",
        "time": "Wed Mar 25 10:49:35 2026 +0800"
      },
      "committer": {
        "name": "alanxtl",
        "email": "m134679102365478@163.com",
        "time": "Wed Mar 25 15:51:11 2026 +0800"
      },
      "message": "fix(triple): case-insensitive method routing without metadata polluti… (#3277)\n\n* fix(triple): case-insensitive method routing without metadata pollution (#3162)\n\nIntroduce methodRouteMux in the Triple transport layer to support\ncase-insensitive method name routing (Go\u0027s GetUser \u003c-\u003e Java\u0027s getUser).\n\nRemove the SwapCase method duplication from enhanceServiceInfo, which\nwas polluting ServiceInfo.Methods with duplicate entries visible to\nregistry and gRPC reflection.\n\n* style(triple): fix test import formatting\n\n* fix(ci): address triple sonar warnings\n\n* style(triple): modernize attachment map type\n\n* test(triple): split method handler tests and fix lint assertion\n\n* fix(triple): stabilize method fallback and host-unavailable tests\n\n* test(triple): extract repeated streaming literals\n\n* test(triple): make lowerFirstRune empty-input path coverable"
    },
    {
      "commit": "8fe1f4bc6d50b025899d7d075b9b860f3e5cb0be",
      "tree": "895dd45dd6c12e6ce1911818e28394d3c2d23681",
      "parents": [
        "5c6bee7207d5e6c60fc81e3ebfd3bc149f29135f"
      ],
      "author": {
        "name": "xxs",
        "email": "2127069700@qq.com",
        "time": "Wed Mar 25 10:34:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 10:34:37 2026 +0800"
      },
      "message": "fix(router): resolve polaris application lookup from URL attributes (#3256)\n\n* fix(router): resolve polaris application lookup from URL attributes"
    },
    {
      "commit": "5c6bee7207d5e6c60fc81e3ebfd3bc149f29135f",
      "tree": "c5f1ba0a7202e561f5a79d885bc925977435268f",
      "parents": [
        "8e9a7135af48a079c7429a70489f2d6a719ecbbb"
      ],
      "author": {
        "name": "Zecheng Zhu",
        "email": "1662308219@qq.com",
        "time": "Mon Mar 23 11:26:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 11:26:46 2026 +0800"
      },
      "message": "refactor: migrate hystrix filter from main repository (#3253)\n\n* refactor: remove hystrix filter from main repository\n\n* update unit test\n\n* clean up hystrix\n\n* doc: add hystrix migration note to filter README"
    },
    {
      "commit": "8e9a7135af48a079c7429a70489f2d6a719ecbbb",
      "tree": "da87d6b52f53e4fe92798b287c29fbaccec75b12",
      "parents": [
        "ddb0f1b01297cc2dc0cd24f134cd6af56bce6608"
      ],
      "author": {
        "name": "翎",
        "email": "1820661379@qq.com",
        "time": "Sun Mar 22 23:34:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 22 23:34:34 2026 +0800"
      },
      "message": "Refactor: remove config in grpc and dubbo3 (#3231)\n\n* feat(dubbo3): remove config dependency in invoke"
    },
    {
      "commit": "ddb0f1b01297cc2dc0cd24f134cd6af56bce6608",
      "tree": "5a7a69baf4b5d4789f74f3eb44a9399406729a36",
      "parents": [
        "334569647b57f789d75e44043ba2ab7fc4715cad"
      ],
      "author": {
        "name": "Zecheng Zhu",
        "email": "1662308219@qq.com",
        "time": "Sat Mar 21 16:37:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 16:37:20 2026 +0800"
      },
      "message": "doc: add dubbo-go-extensions in readme (#3260)\n\n* doc: add dubbo-go-extensions in readme\n\n* doc:  refine README ecosystem and tools sections"
    },
    {
      "commit": "334569647b57f789d75e44043ba2ab7fc4715cad",
      "tree": "a4dd0de395b0b6d3cc50f84dae18a2969add9ae9",
      "parents": [
        "a8c419c75bf57c534389ca994c84c3fb66d95569"
      ],
      "author": {
        "name": "xxs",
        "email": "2127069700@qq.com",
        "time": "Sat Mar 21 16:35:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 16:35:50 2026 +0800"
      },
      "message": "fix(extension): eliminate race-prone global registries in common/extension (#3264)\n\n* feat(extension): add thread-safe generic Registry[T] container\n\nFixes: #3247\n\n* fix(extension): migrate filter/protocol/registry to Registry[T]\n\nFixes: #3247\n\n* fix(extension): migrate cluster/loadbalance/config_center registries\n\nFixes: #3247\n\n* fix(extension): migrate configurator/config/config_center_factory\n\nFixes: #3247\n\n* fix(extension): migrate metadata/proxy/tps registries\n\nFixes: #3247\n\n* fix(extension): migrate auth/rest client and server registries\n\nFixes: #3247\n\n* fix(extension): migrate config reader/post processor/router factory\n\nFixes: #3247\n\n* fix(extension): migrate discovery selector logger and otel registries\n\nFixes: #3247\n\n* fix(extension): guard directory/customizer/shutdown/name mapping state\n\nFixes: #3247\n\n* style(extension): apply repository formatter output for registry synchronization files\n\nFixes: #3247\n\n* test(extension): use assert.Len to satisfy testifylint\n\nFixes: #3247\n\n* test(extension): add coverage for synchronized registry helper paths\n\nFixes: #3247\n\n* fix(extension): clarify config center factory registry name\n\nAlign registry name with config center factory semantics for clearer diagnostics in extension registration lookup.\n\nFixes: #3247"
    },
    {
      "commit": "a8c419c75bf57c534389ca994c84c3fb66d95569",
      "tree": "db25780be45d1056fdc8114a8c89241b2340c659",
      "parents": [
        "82957c516cba9a391718921eb3b38794a1015909"
      ],
      "author": {
        "name": "whimc",
        "email": "3897601292@qq.com",
        "time": "Sat Mar 21 15:08:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 15:08:11 2026 +0800"
      },
      "message": "docs: update contact information (#3273)\n\n* docs: update contact information\n\n* docs: align QR codes in invite.png"
    },
    {
      "commit": "82957c516cba9a391718921eb3b38794a1015909",
      "tree": "00b7f47fd9b74adeba29e007c65e703fdf8ffc2b",
      "parents": [
        "06837fd9858704702c955bc0013ec7d459dda1cb"
      ],
      "author": {
        "name": "xxs",
        "email": "2127069700@qq.com",
        "time": "Sat Mar 21 12:24:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 12:24:53 2026 +0800"
      },
      "message": "fix(core): resolve #3247 lock misuse and map exposure races (#3265)\n\n* fix(dubbo): use correct lock for provider service and lock consumer connection access\n\nFixes: #3247\n\n* fix(router): guard RouterChain.Route invoker reads with RLock\n\nFixes: #3247\n\n* fix(config): return copied service maps instead of internal references\n\nFixes: #3247\n\n* test(core): add non-duplicate coverage for #3247 race fixes\n\n* test(router): resolve Sonar findings in chain tests"
    },
    {
      "commit": "06837fd9858704702c955bc0013ec7d459dda1cb",
      "tree": "1f3f736a72dc342aaec410c39e6faed2fe81f79e",
      "parents": [
        "9a9c24a010e3a1501409148e2152dc5046773bc0"
      ],
      "author": {
        "name": "nanjiek",
        "email": "127271430+nanjiek@users.noreply.github.com",
        "time": "Mon Mar 16 21:02:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 16 21:02:36 2026 +0800"
      },
      "message": "migrate the ValidateRegistryIDs to internal (#3258)\n\n* remove the config package from package client\n\n* fix(client): fail fast on invalid registry and method config\n\n* restore WithMethod in Server\n\n* fix lint of action_test\n\n* refactor: split processURL to reduce cognitive complexity\n\n* migrate the ValidateRegistryIDs to internal\n\n* fix the cmt\n\n* remove the validateRegistryIDs"
    }
  ],
  "next": "9a9c24a010e3a1501409148e2152dc5046773bc0"
}
