Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"go",
"golang",
"redis",
"redis-client",
"redis-cluster"
],
"is_fork": false,
"size_kb": 24434,
"has_wiki": false,
"homepage": "https://redis.io",
"languages": {
"Go": 4359300,
"Shell": 11967,
"Makefile": 4588,
"Dockerfile": 873
},
"pushed_at": "2026-07-23T14:41:57Z",
"created_at": "2012-07-25T13:01:39Z",
"owner_type": "Organization",
"updated_at": "2026-07-23T10:53:22Z",
"description": "Redis Go client",
"is_archived": false,
"is_disabled": false,
"license_spdx": "BSD-2-Clause",
"default_branch": "master",
"license_spdx_raw": "BSD-2-Clause",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://redis.io",
"name": "Redis",
"type": "Organization",
"login": "redis",
"company": null,
"location": null,
"followers": 2844,
"avatar_url": "https://avatars.githubusercontent.com/u/1529926?v=4",
"created_at": "2012-03-12T18:05:54Z",
"is_verified": null,
"public_repos": 78,
"account_age_days": 5246
},
"license": {
"state": "standard",
"spdx_id": "BSD-2-Clause",
"raw_spdx": "BSD-2-Clause",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v9.21.0",
"kind": "minor",
"published_at": "2026-06-22T07:42:44Z"
},
{
"tag": "v9.20.1",
"kind": "patch",
"published_at": "2026-06-11T09:08:57Z"
},
{
"tag": "v9.20.0",
"kind": "minor",
"published_at": "2026-05-28T07:38:22Z"
},
{
"tag": "v9.19.0",
"kind": "minor",
"published_at": "2026-04-28T11:18:56Z"
},
{
"tag": "v9.18.0",
"kind": "minor",
"published_at": "2026-02-16T14:44:03Z"
},
{
"tag": "v9.17.3",
"kind": "patch",
"published_at": "2026-01-25T10:17:13Z"
},
{
"tag": "v9.18.0-beta.2",
"kind": "prerelease",
"published_at": "2025-12-09T13:54:31Z"
},
{
"tag": "v9.18.0-beta.1",
"kind": "prerelease",
"published_at": "2025-12-02T13:11:38Z"
},
{
"tag": "v9.17.2",
"kind": "patch",
"published_at": "2025-12-01T14:01:48Z"
},
{
"tag": "v9.17.1",
"kind": "patch",
"published_at": "2025-11-26T10:23:44Z"
},
{
"tag": "v9.17.0",
"kind": "minor",
"published_at": "2025-11-19T17:57:26Z"
},
{
"tag": "v9.16.0",
"kind": "minor",
"published_at": "2025-10-23T15:11:12Z"
},
{
"tag": "v9.14.1",
"kind": "patch",
"published_at": "2025-10-18T21:53:54Z"
},
{
"tag": "v9.15.1",
"kind": "patch",
"published_at": "2025-09-27T20:34:54Z"
},
{
"tag": "v9.16.0-beta.1",
"kind": "prerelease",
"published_at": "2025-09-27T15:48:29Z"
},
{
"tag": "v9.15.0-beta.3",
"kind": "prerelease",
"published_at": "2025-09-26T23:18:39Z"
},
{
"tag": "v9.15.0-beta.2",
"kind": "prerelease",
"published_at": "2025-09-26T16:41:54Z"
},
{
"tag": "v9.15.0-beta.1",
"kind": "prerelease",
"published_at": "2025-09-10T20:05:05Z"
},
{
"tag": "v9.14.0",
"kind": "minor",
"published_at": "2025-09-10T12:02:55Z"
},
{
"tag": "v9.13.0",
"kind": "minor",
"published_at": "2025-09-03T11:56:20Z"
},
{
"tag": "v9.12.1",
"kind": "patch",
"published_at": "2025-08-11T16:00:12Z"
},
{
"tag": "v9.12.0",
"kind": "minor",
"published_at": "2025-08-05T13:52:35Z"
},
{
"tag": "v9.12.0-beta.1",
"kind": "prerelease",
"published_at": "2025-08-04T12:04:38Z"
},
{
"tag": "v9.11.0",
"kind": "minor",
"published_at": "2025-06-24T11:10:27Z"
},
{
"tag": "v9.10.0",
"kind": "minor",
"published_at": "2025-06-06T15:35:30Z"
},
{
"tag": "v9.9.0",
"kind": "minor",
"published_at": "2025-05-27T16:10:29Z"
},
{
"tag": "v9.8.0",
"kind": "minor",
"published_at": "2025-04-30T11:41:31Z"
},
{
"tag": "v9.8.0-beta.1",
"kind": "prerelease",
"published_at": "2025-03-24T20:12:57Z"
},
{
"tag": "v9.7.3",
"kind": "patch",
"published_at": "2025-03-20T14:57:16Z"
},
{
"tag": "v9.6.3",
"kind": "patch",
"published_at": "2025-03-20T14:11:37Z"
},
{
"tag": "v9.5.5",
"kind": "patch",
"published_at": "2025-03-20T14:08:47Z"
},
{
"tag": "v9.7.1",
"kind": "patch",
"published_at": "2025-02-21T13:46:40Z"
},
{
"tag": "v9.7.0",
"kind": "minor",
"published_at": "2024-10-17T09:58:13Z"
},
{
"tag": "v9.6.2",
"kind": "patch",
"published_at": "2024-10-14T11:28:42Z"
},
{
"tag": "v9.7.0-beta.1",
"kind": "prerelease",
"published_at": "2024-09-26T10:33:32Z"
},
{
"tag": "v9.6.1",
"kind": "patch",
"published_at": "2024-07-25T08:09:58Z"
},
{
"tag": "v9.6.0",
"kind": "minor",
"published_at": "2024-07-19T07:19:16Z"
},
{
"tag": "v9.6.0b2",
"kind": "other",
"published_at": "2024-06-20T08:50:51Z"
},
{
"tag": "v9.6.0b1",
"kind": "other",
"published_at": "2024-06-19T23:45:17Z"
},
{
"tag": "v9.5.2",
"kind": "patch",
"published_at": "2024-05-31T02:51:37Z"
},
{
"tag": "v9.5.1",
"kind": "patch",
"published_at": "2024-02-20T15:46:31Z"
},
{
"tag": "v9.5.0",
"kind": "minor",
"published_at": "2024-02-18T17:33:00Z"
},
{
"tag": "v9.4.0",
"kind": "minor",
"published_at": "2024-01-07T10:33:04Z"
},
{
"tag": "v9.3.1",
"kind": "patch",
"published_at": "2023-12-19T11:00:56Z"
},
{
"tag": "v9.3.0",
"kind": "minor",
"published_at": "2023-10-31T15:04:50Z"
},
{
"tag": "v9.2.1",
"kind": "patch",
"published_at": "2023-09-27T08:38:54Z"
},
{
"tag": "v9.2.0",
"kind": "minor",
"published_at": "2023-09-20T15:02:33Z"
},
{
"tag": "v9.1.0",
"kind": "minor",
"published_at": "2023-08-17T12:47:35Z"
},
{
"tag": "v9.0.5",
"kind": "patch",
"published_at": "2023-05-29T06:06:51Z"
},
{
"tag": "v9.0.4",
"kind": "patch",
"published_at": "2023-05-02T05:42:25Z"
},
{
"tag": "v9.0.3",
"kind": "patch",
"published_at": "2023-04-02T12:16:58Z"
},
{
"tag": "v9.0.2",
"kind": "patch",
"published_at": "2023-02-01T08:15:10Z"
},
{
"tag": "v9.0.1",
"kind": "patch",
"published_at": "2023-01-30T08:25:30Z"
},
{
"tag": "v9.0.0",
"kind": "major",
"published_at": "2023-01-30T07:14:16Z"
},
{
"tag": "v9.0.0-rc.4",
"kind": "prerelease",
"published_at": "2023-01-24T14:24:51Z"
},
{
"tag": "v9.0.0-rc.3",
"kind": "prerelease",
"published_at": "2023-01-24T14:11:29Z"
},
{
"tag": "v9.0.0-rc.2",
"kind": "prerelease",
"published_at": "2022-11-26T12:39:23Z"
},
{
"tag": "v9.0.0-rc.1",
"kind": "prerelease",
"published_at": "2022-10-14T14:05:33Z"
},
{
"tag": "v9.0.0-beta.3",
"kind": "prerelease",
"published_at": "2022-10-06T11:08:55Z"
},
{
"tag": "v9.0.0-beta.2",
"kind": "prerelease",
"published_at": "2022-07-28T13:05:21Z"
},
{
"tag": "v9.0.0-beta.1",
"kind": "prerelease",
"published_at": "2022-06-04T15:20:14Z"
},
{
"tag": "v8.11.5",
"kind": "patch",
"published_at": "2022-03-17T13:28:26Z"
},
{
"tag": "v8.11.4",
"kind": "patch",
"published_at": "2021-10-04T13:41:28Z"
},
{
"tag": "v8.11.2",
"kind": "patch",
"published_at": "2021-08-06T09:20:31Z"
},
{
"tag": "v8.11.1",
"kind": "patch",
"published_at": "2021-07-29T07:17:57Z"
},
{
"tag": "v7.4.1",
"kind": "patch",
"published_at": "2021-07-16T07:45:15Z"
},
{
"tag": "v8.11.0",
"kind": "minor",
"published_at": "2021-06-30T11:06:03Z"
},
{
"tag": "v8.10.0",
"kind": "minor",
"published_at": "2021-06-03T11:08:46Z"
}
],
"recent_commits": [
{
"oid": "5c82f57a47e097b32509ac2abd3d7c9d57f5100b",
"body": "…#3918)\n\n* feat: align default config values with cross-SDK proposal\n\n Read/Write timeout 3s -> 5s, retry backoff 8ms/512ms -> 10ms/1s,\n cluster state reload 10s -> 60s, TCP keep-alive 5min blanket ->\n 30s idle / 5s interval / 3 probes via net.KeepAliveConfig.\n\n* test(options): pin new defaults, \n[…]\neloadInterval default, and the keep-alive values\n- drop the go1.7 build tag from options_test.go: since Go 1.21 such a\n tag downgrades the file's language version, which rejects\n net.KeepAliveConfig",
"is_bot": false,
"headline": "chore(options): align default config values with cross-SDK proposal (…",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-07-23T09:56:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "73773dd98b0d00ac43b0334ccbd38c0fe7b63041",
"body": "Update the 8.10 mapping in both CI redis_version_mapping arrays from the\ntransient custom build to 8.10-rc2, and promote 8.10-rc2 to the local-dev\ndefault (Makefile, docker-compose, doctests) with REDIS_VERSION=8.10.",
"is_bot": false,
"headline": "chore(ci): bump test image to 8.10-rc2 and default to 8.10 (#3920)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-22T15:11:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "76322e0bac528e1203b8a5486691e91b9a05fcc5",
"body": "* chore(ai): add claude skills\n\n* add readme for claude configs\n\n* chore(ai): add /check-ci slash command\n\n* chore(ai): share repo guidance via AGENTS.md\n\nMove the layout/commands/architecture/conventions guidance into AGENTS.md so non-Claude agents (Codex, Cursor, Aider, ...) read the same source. \n[…]\nnormalize settings.json permission style; drop personal caveman\n block from .gitignore and the /loop reference\n\n---------\n\nCo-authored-by: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com>",
"is_bot": false,
"headline": "chore(ai): add claude skills (#3855)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-07-22T14:02:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "da69ba0173617179e539e738a632869000ddd008",
"body": "SlowLogGet used context.Background() when constructing the cmd while\nsibling SlowLog APIs use the provided ctx. Propagate ctx for consistency\nwith cancellation and command metadata.",
"is_bot": false,
"headline": "fix(command): pass caller context to SlowLogGet command (#3915)",
"author_name": "sonnemusk",
"author_login": "sonnemusk",
"committed_at": "2026-07-22T13:03:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04044a867e5ac9ff05dec83370be3ca3c5d0009c",
"body": "…r-command (#3909)\n\n* re-route whole tx pipeline on redirect/abort, not per-command\n\nThe cluster tx pipeline treated a MULTI..EXEC as if each command could be\nretried independently and EXEC always returned a *N result array. That\nconflicts with Redis's transaction semantics: any queue-stage redirect\n[…]\n after\nretries is no longer reported as a failure via a stale lastErr.\n\n* retry retryable errors on the top-level ASKING reply\n\n* surface non-redirect tx queue error on EXECABORT over a later redirect",
"is_bot": false,
"headline": "fix(txpipeline): re-route whole tx pipeline on redirect/abort, not pe…",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-07-22T11:06:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f745ff440938cdc738780b42569bedc43081cdf1",
"body": "Calling ModuleLoadex(nil) previously panicked in toArgs. Return a sticky\ncommand error instead.",
"is_bot": false,
"headline": "fix(command): return error on ModuleLoadex with nil config (#3916)",
"author_name": "sonnemusk",
"author_login": "sonnemusk",
"committed_at": "2026-07-22T11:01:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee2703fd5e90c7d474eae41c17a7375f68522689",
"body": "…3917)\n\nThese commands return absolute expiration times, not remaining TTLs.\nDocument conversion and point users to TTL/PTTL for duration semantics.",
"is_bot": false,
"headline": "chore(docs): clarify ExpireTime/PExpireTime return Unix timestamps (#…",
"author_name": "sonnemusk",
"author_login": "sonnemusk",
"committed_at": "2026-07-22T11:00:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24a75d0c51b3f86747ea417c91e553950c7856b2",
"body": "…P commands (#3898)\n\n* Add MAXCOUNT and MAXSIZE params to XREAD and XREADGROUP commands\n\n* Skip test before 8.10\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(command): Add MAXCOUNT and MAXSIZE params to XREAD and XREADGROU…",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T15:49:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "26fde83feb9079ce711cf1efede6ed0ca54db3ea",
"body": "…#3912)",
"is_bot": false,
"headline": "feat(command): Add optional EXCLUDEEMPTY to TS.MRANGE, TS.MREVRANGE (…",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T15:47:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "393ff25b44fa847f244a27d00bf4c273ce17e386",
"body": null,
"is_bot": false,
"headline": "feat(command): Add LMOVEM and BLMOVEM commands (#3913)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T15:46:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e328a86b9e8931dd66f7609e5ca75ebaff140d1",
"body": "* Add SUnionCard and SDiffCard commands\n\n* Skip test before 8.10\n\n* Add first pos",
"is_bot": false,
"headline": "Add SUnionCard and SDiffCard commands (#3897)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T15:32:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d863a84e94290428f7c91423bad12f7d7540d00b",
"body": "* Add TS.NRANGE and TS.NREVRANGE Commands\n\n* Add 8.10 to CI\n\n* fix SkipBeforeRedisVersion breaking on two-digit minor versions\n\n* fix redis_version comparison breaking on two-digit minor versions\n\n* Address comments\n\n* Fix types",
"is_bot": false,
"headline": "feat(command): Add TS.NRANGE and TS.NREVRANGE Commands (#3870)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T15:26:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e8e30f5a368e8115530cecf17b4bbd784543128",
"body": null,
"is_bot": false,
"headline": "feat(command): Populate FT.HYBRID timeout warnings (#3911)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T12:41:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "507eda58209f8b0d28d7e1f1de4777f78e8e0555",
"body": "* Add ts.read\n\n* Skip test before 8.10",
"is_bot": false,
"headline": "feat(command): Add TS.READ command (#3896)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T11:43:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b3a297129398853c0bfaf9270452e7ce42932ac",
"body": "…ctly (#3908)\n\n* Compare Redis versions by major.minor so 8.10+ gates correctly\n\n* Add slowlog 7th field",
"is_bot": false,
"headline": "chore(ci): Compare Redis versions by major.minor so 8.10+ gates corre…",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-07-20T11:04:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00e2975386cfabbf1a532e215863c5e29094fa89",
"body": "Bumps [actions/setup-go](https://github.com/actions/setup-go) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-go\n dependency-version: '7'\n depen\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump actions/setup-go from 6 to 7 (#3910)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-20T08:06:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78db712322bec6c40c0fb850683460af53b4dc26",
"body": "* fix(pubsub): data race on shared opt.Addr during reconnect\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\n\n* fix(pubsub): clone options under optLock via cloneOpt\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\n\n---------\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>",
"is_bot": false,
"headline": "fix(pubsub): data race on shared opt.Addr during reconnect (#3906)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-17T16:41:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cdae48b240e458584df3af1500a699be5e76f75e",
"body": null,
"is_bot": false,
"headline": "fix(parser): return read error from JSONSliceCmd.readReply (#3903)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-16T13:31:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "02176b11d949a9a9195c0bba6ce0a5f608eaba30",
"body": "…hard's topic (#3893)",
"is_bot": false,
"headline": "fix(ring): Override the ring client Publish to write to the correct s…",
"author_name": "David Kindel",
"author_login": "dkindel",
"committed_at": "2026-07-16T13:17:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5f667c06bc3c6a72b1f0d38432e539df7329457",
"body": "…3900)\n\n* fix(command): reject odd-length flat replies in Z/KeyValue parsers\n\n* ci: retrigger govulncheck, setup-go now resolves 1.26.x to go1.26.5",
"is_bot": false,
"headline": "fix(command): reject odd-length flat replies in Z/KeyValue parsers (#…",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-16T13:07:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "26b3850b573b3ec39ceb0d644c266dec9f301335",
"body": null,
"is_bot": false,
"headline": "fix(maintnotifications): data race on clusterStateReloadCallback (#3894)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-16T12:42:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b2a3c1a8a1b90a72bd446c8fc64c716704e10b8",
"body": "InfoMap was implemented on cmdable (commands.go) but missing from the\nCmdable interface, so it was unreachable through UniversalClient or\nany other Cmdable-typed variable.\n\nFixes #3902",
"is_bot": false,
"headline": "fix(UniversalClient): add InfoMap to Cmdable interface (#3904)",
"author_name": "Shabnam",
"author_login": "nazarli-shabnam",
"committed_at": "2026-07-16T11:33:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c4977368be07d2628ed5c9de4c96eaaa2397ecb",
"body": "…armup (#3881)\n\nattribute.NewSet sorts and de-duplicates its input slice in place. In\npoolStatsAttrs we spread conf.attrs directly into NewSet, so the shared\nconf.attrs backing array is mutated on every call.\n\nThat same array is aliased by every metricsHook.attrs (metricsHook is\nadded with attrs: co\n[…]\npy conf.attrs before handing it to NewSet so the shared array is never\nmutated at runtime. This is lock-free and removes the unnecessary shared\nmutation rather than serializing around it.\n\nFixes #3880",
"is_bot": false,
"headline": "fix(redisotel): avoid data race on shared attrs during MinIdleConns w…",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-07-13T15:59:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f320a4e45f897f932504d0b24f5a77c14d0c2956",
"body": "* fix(command): drain unexpected reply frames in readReply parsers\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\n\n* fix(command): check ReadString error in readEngines field loop\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\n\n---------\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>",
"is_bot": false,
"headline": "fix(command): drain unexpected reply frames in readReply parsers (#3884)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-13T14:44:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75b7e1ab43c36c4ae16df60aa00758b3983035a7",
"body": "WriteArg encodes a nil pointer to a numeric type as its zero value: every\nnil *int*/*uint*/*float*/*bool returns \"0\". The *uint8 case instead returned\nan empty string, which is also inconsistent with its own non-nil path that\nwrites the number via w.uint. Encode nil *uint8 as \"0\" and update the table\ntest assertion.\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(proto): encode nil *uint8 as \"0\" like other numeric pointers (#3869)",
"author_name": "Sueun Cho",
"author_login": "sueun-dev",
"committed_at": "2026-07-10T09:13:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d55163828801a0c898631e141cf6ef58c688fbac",
"body": "Defensive guard against int overflow, should not happen with a live Redis Server.",
"is_bot": false,
"headline": "fix(parser): avoid int overflow skipping map/attr bodies on read (#3877)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-10T09:12:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "677622170470f075aadac8fb7156337623d4bc07",
"body": "* fix: reject unhashable keys in RESP3 map parsing\n\nAdd type check in readMap to reject maps and arrays as map keys\nbefore they cause a runtime panic. Returns a clear parse error instead.\n\nAdds regression test for the panic condition.\n\n* fix: re-apply RESP3 map key guard lost in master merge\n\nThe `M\n[…]\n.\n\nMaster's Reader.Discard nil-handling change from the merge is preserved.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(parser): reject unhashable keys in RESP3 map parsing (#3873)",
"author_name": "hwatsauce",
"author_login": "iabdullah215",
"committed_at": "2026-07-10T09:11:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8d5561a6ab30e728cc53b33e2ec2a78ffa243383",
"body": "WAITAOF replies with a two-element array [numlocal, numreplicas], which\n*IntCmd can't parse (\"can't parse int reply\"). Also un-skips the test.\n\nBREAKING CHANGE: WaitAOF now returns *IntSliceCmd instead of *IntCmd.\n\nSigned-off-by: Ilya Teodorov <iliateodorov2001@gmail.com>\nCo-authored-by: Ilya Teodorov <iliateodorov2001@gmail.com>",
"is_bot": false,
"headline": "fix(command): WaitAOF should return *IntSliceCmd, not *IntCmd (#3888)",
"author_name": "CipherN9",
"author_login": "CipherN9",
"committed_at": "2026-07-10T09:11:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e433d8aaff0e71077b22d547e22361a946b35762",
"body": "…#3876)\n\nisHealthyConn peeked cn.rd via PeekReplyType without readerMu, the lock SetNetConn holds while resetting the reader during a handoff. Get() health-checks a popped connection before the OnGet hook rejects it, so a connection queued for handoff races the handoff worker resetting its reader. R\n[…]\nhrough a readerMu-guarded accessor, matching the putConn push-notification path.\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(pool): data race on conn reader in isHealthyConn during handoff (…",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-08T09:07:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8e06e652ffd99dd5863d06d40226a9a6f8e7da11",
"body": "…arseURL (#3882)\n\ngetHostPortWithDefaults calls net.SplitHostPort(u.Host), which fails with\n\"missing port\" for a bracketed IPv6 literal such as \"[::1]\". The error path\nfalls back to host = u.Host, keeping the brackets, and the caller then runs\nnet.JoinHostPort(host, \"6379\"), which wraps the already-\n[…]\n report a missing\nport as an empty string, so the existing defaulting still applies and\nJoinHostPort adds exactly one pair of brackets. The result is identical to the\nold code for every non-IPv6 case.",
"is_bot": false,
"headline": "fix(options): keep single brackets for IPv6 hosts without a port in P…",
"author_name": "Sueun Cho",
"author_login": "sueun-dev",
"committed_at": "2026-07-07T12:47:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "baf6aa1edd0097c64e3bef1a6bd119dd0f2372bc",
"body": "Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.62.0 to 0.63.0.\n- [Release notes](https://github.com/rojopolis/spellcheck-github-actions/releases)\n- [Changelog](https://github.com/rojopolis/spellcheck-github-actions/blob/master/CHANGELOG.md)\n[…]\n-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump rojopolis/spellcheck-github-actions (#3878)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-06T10:25:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f6e4840c6fadb945f4e0755f38efbc0991fa5134",
"body": "…#3879)\n\nBumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 9.2.1 to 9.3.0.\n- [Release notes](https://github.com/golangci/golangci-lint-action/releases)\n- [Commits](https://github.com/golangci/golangci-lint-action/compare/v9.2.1...v9.3.0)\n\n---\nupdated-depend\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golangci/golangci-lint-action from 9.2.1 to 9.3.0 (…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-06T10:24:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1e8107a0ec1f947a9d755130dcd62309d832ba68",
"body": "* DOC-6806 remove duplicate example step\n\n* Revert \"DOC-6806 remove duplicate example step\"\n\nThis reverts commit 1e06196a0869701d798069b8ed99f41c25e8d5a8.\n\n* DOC-6806 removed duplicate example step",
"is_bot": false,
"headline": "chore(doc): DOC-6806 remove duplicate example step (#3875)",
"author_name": "andy-stark-redis",
"author_login": "andy-stark-redis",
"committed_at": "2026-07-05T04:23:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "663bfb384f22a5218d2ffb3550f4b723c381d77a",
"body": "* fix(maintnotif): tight race condition windown on handoff\n\n* chore(tests): add pool hook test\n\n* address pr comment\n\n* chore(tests): add tests for race condition\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(maintnotif): tight race condition windown on handoff (#3872)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-07-01T12:36:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ebaa60fd093874f368d40b24b9b5234fef366113",
"body": null,
"is_bot": false,
"headline": "fix(proto): don't over-read nil replies in Reader.Discard (#3874)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-07-01T10:35:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "124b5384a97f151b45bbdeed9add213713202c96",
"body": "* fix(hooks): data race on hooksMixin.current during AddHook\n\nhooksMixin.current holds the composed hook chain. AddHook rewrote all\nfour current fields in place while command execution read them\nunsynchronized, so calling AddHook on a live client raced on those\ntwo-word func values. The unlocked sli\n[…]\nice readers in race test\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\n\n---------\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(hooks): data race on hook state during AddHook (#3868)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-06-29T11:50:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dedce8658039864171eae1f97b6280f21dbc5e93",
"body": null,
"is_bot": false,
"headline": "chore(tests): Add test for Indonesian Bahasa and Thai languages (#3871)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-06-29T07:10:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75bcf2c12862b54db0bd144fc80026e4dfb0333c",
"body": "Signed-off-by: Saddam <saddamr3e@gmail.com>",
"is_bot": false,
"headline": "fix(ring): data race on onNewNode during SetAddrs (#3862)",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-06-25T10:42:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39f16250203f41b467c158c12f2e628ee8e7aecd",
"body": "ParseURL documents that a duration query parameter is disabled with a\nvalue <= 0, but queryOptions.duration() applied that rule only to plain\nintegers. A duration written with a unit went through time.ParseDuration\nand was returned as-is, so 0s did not disable the field: read_timeout=0s\nfell through\n[…]\nad of disabling like read_timeout=0.\n\nApply the same <= 0 check in the ParseDuration branch, matching the\nplain-integer form, and cover it with two TestParseURL cases\n(conn_max_idle_time=0s and =-1s).",
"is_bot": false,
"headline": "fix(options): treat unit durations <= 0 as disabled in ParseURL (#3866)",
"author_name": "Sueun Cho",
"author_login": "sueun-dev",
"committed_at": "2026-06-25T10:42:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "909c611a50ab0231beb7ae87d498ff2f13826230",
"body": null,
"is_bot": false,
"headline": "drop test (#3863)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-24T18:29:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3033f8219e7dc86e77860a0c36309c2ae36059be",
"body": "* chore: use type-safe sync/atomic value types\n\nReplace old-style atomic.StoreUint32/LoadUint32/AddInt32/CompareAndSwap*\ncalls with the type-safe atomic.Uint32/Int32/Int64/Uint64 value types.\n\nLeft untouched:\n- Public Stats/PubSubStats plain-uint32 fields (changing them would be a\n breaking API change); their atomic.Add/Load calls remain.\n\n* docs: add v10 atomic-type TODOs to public Stats/PubSubStats",
"is_bot": false,
"headline": "chore(golang): use type-safe sync/atomic value types (#3860)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-06-24T05:43:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b33d16917439cd5404646aae0ab36b2e4260c33",
"body": "…861)\n\n* fix(cluster): data race appending to shared masters/slaves slices\n\nclusterState is shared as an immutable snapshot but Masters keeps spare capacity from appendIfNotExist, so append(state.Masters, state.Slaves...) mutates the shared backing array under concurrent routing. Copy into a fresh s\n[…]\n pickArbitraryNode and mapCmdsByNode.\n\n* fix(cluster): index into masters/slaves instead of copying\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>\n\n---------\n\nSigned-off-by: Saddam <saddamr3e@gmail.com>",
"is_bot": false,
"headline": "fix(cluster): data race appending to shared masters/slaves slices (#3…",
"author_name": "sadd amr3e",
"author_login": "saddamr3e",
"committed_at": "2026-06-24T05:41:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "15f526015a0ce993c03877913c006bdaab769deb",
"body": "…(#3841)\n\n* feat(search): add SHARD_K_RATIO to FT.HYBRID KNN clause (Redis 8.8+)\n\nRedis 8.8 added the SHARD_K_RATIO argument to the FT.HYBRID KNN clause\nso callers can request fewer candidates per shard in cluster mode,\ntrading recall for latency. Valid range is 0.1 - 1.0; has no effect on\nstandalon\n[…]\nguard\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(search): add SHARD_K_RATIO to FT.HYBRID KNN clause (Redis 8.8+) …",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-22T07:49:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c7e6f0052aa3f27f4c4d2cbfad568c3cbe88b1e2",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump actions/checkout from 6 to 7 (#3858)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-22T07:46:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5fcd8ab5b32533cd0cf64701cf3ad2f8322abb93",
"body": "Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.61.0 to 0.62.0.\n- [Release notes](https://github.com/rojopolis/spellcheck-github-actions/releases)\n- [Changelog](https://github.com/rojopolis/spellcheck-github-actions/blob/master/CHANGELOG.md)\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump rojopolis/spellcheck-github-actions (#3859)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-22T07:45:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1551837b70beda914156d1a922d2e663c21bb0e6",
"body": "* bump version to 9.21.0\n* add release notes",
"is_bot": false,
"headline": "chore(release): 9.21.0 (#3857)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-22T07:31:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1cfa927b89e62b89919671f45ed552e85d1cd7bd",
"body": "* fix maintnotifications ModeAuto fallback\n\n* retire maintnotifications connections on downgrade\n\n* guard maintnotifications tracking during downgrade",
"is_bot": false,
"headline": "fix(maintnotifications): keep ModeAuto fail-open (#3853)",
"author_name": "Michael Renner",
"author_login": "terrorobe",
"committed_at": "2026-06-18T19:21:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f0ea0e7edce610e0c32a136ded59f2c2a1f085e",
"body": "…(#3819)\n\n* replace context.TODO with context.WithTimeout in channel.initHealthCheck before calling c.pubSub.Ping\n\n* fix(pubsub): create fresh timeout context for each health check\n\n* create context with timeout after lock acquisition\n\n* export pingTimeout and reconnectTimeout\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(pubsub): introduce timeouts for Ping on channel.initHealthCheck …",
"author_name": "Mohamed ABDELLANI",
"author_login": "abdellani",
"committed_at": "2026-06-17T09:49:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5484b0b86ce0e25e874c0a1169e318ee28753e13",
"body": "…(#3854)\n\nTx.Close issued UNWATCH unconditionally before returning the connection to\nthe pool, adding a round trip to every Watch transaction even when nothing\nwas watched or when EXEC had already discarded the watched keys.\n\nTrack whether a WATCH is still active on the transaction (watchArmed) and\n\n[…]\n runs. A manual Unwatch case asserts no second UNWATCH\nfrom Close, and a PoolSize=1 reuse case asserts no watch leaks onto a\npooled connection.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(tx): skip redundant UNWATCH in Tx.Close when no WATCH is active …",
"author_name": "Filipe Oliveira (Redis)",
"author_login": "fcostaoliveira",
"committed_at": "2026-06-17T09:15:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bf57a51fdb5cc83cf4a0ca780adee5abe6300ec4",
"body": "Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.60.0 to 0.61.0.\n- [Release notes](https://github.com/rojopolis/spellcheck-github-actions/releases)\n- [Changelog](https://github.com/rojopolis/spellcheck-github-actions/blob/master/CHANGELOG.md)\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump rojopolis/spellcheck-github-actions (#3852)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-15T12:23:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "641294c30ad017d565e31c3999c86af2e83dad50",
"body": "…rimLimitDisabled sentinel (#3848)\n\nRedis treats XTRIM/XADD trimming LIMIT 0 (valid only with the ~ approximate\nflag) as \"disable the trimming effort cap entirely\", which is different from\nomitting LIMIT (implicit default of 100 * stream-node-max-entries examined\nentries). The command builders only \n[…]\n explicitly documented on\nthe field.\n\nAdd server-less unit tests asserting the constructed command args for the\nomitted/positive/disabled-limit and exact-trim cases across all XTRIM\nvariants and XAdd.",
"is_bot": false,
"headline": "feat(streams): support explicit LIMIT 0 in XTRIM/XADD trimming via XT…",
"author_name": "Roma",
"author_login": "TheRealMal",
"committed_at": "2026-06-11T14:01:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74d9bb03f843cb2db92e8df7118177514122cd19",
"body": "* feat(command): add zero-copy GetToBuffer and SetFromBuffer\n\nAdds two new methods on the StringCmdable interface that let callers read\nand write Redis string values directly into/from pre-allocated byte\nbuffers, eliminating the per-call payload allocation that the regular\nGet/Set methods incur.\n\nPu\n[…]\n with GetToBuffer for code that uses the\nbuffer-based pattern on both sides) and tells callers who don't care\nabout that symmetry that Set(ctx, key, buf, 0) is equally efficient.\n\nNo behaviour change.",
"is_bot": false,
"headline": "feat(command): add zero-copy GetToBuffer and SetFromBuffer (#3834)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-11T13:20:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a13416bf1c0556075b843dd0a9cb6db3b3cf2789",
"body": "* bump version to 9.20.1\n\n* Add release notes",
"is_bot": false,
"headline": "chore(release): 9.20.1 (#3847)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-11T09:07:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "10dc44f424d58b9c2b4df29e529ca92a2f8fa986",
"body": "* fix(push): Fix peeking when push name is truncated\n\n* fix(push): fix peeking malformated push\n\n* protect agains potential panic",
"is_bot": false,
"headline": "fix(push): fix peeking when push name is truncated (#3842)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-11T07:09:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670",
"body": "…ovided by the user (#3844)\n\n* feat(search): always pass FT.HYBRID vector data via PARAMS\n\nRedis no longer supports inline vector blobs in FT.HYBRID. Always pass\nvector data through the PARAMS mechanism, generating a unique parameter\nname when VectorParamName is not provided. Update the related comm\n[…]\nhored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* fix build\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(ft.hybrid): Always generate vector param names if they are not pr…",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-06-11T06:07:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a4b234f4a4f2551d1179181bbc136db132bf5912",
"body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump codecov/codecov-action from 6 to 7 (#3845)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-08T10:13:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "974e717dbf3008497e54aec34636e34452e6872b",
"body": "The CLUSTER SHARDS 'nodes' field contains a list of all nodes within\nthe shard. Each individual node is a map of attributes that describe\nthe node. Some attributes are optional and more attributes may be added\nin the future.\n\nPreviously, the parser returned an error on any unrecognized field,\ncausin\n[…]\nat both the shard level and node level are silently\ndiscarded, matching the forward-compatible behavior already used\nelsewhere in this codebase.\n\nSigned-off-by: Madelyn Olson <madelyneolson@gmail.com>",
"is_bot": false,
"headline": "fix(command): ignore unknown fields in CLUSTER SHARDS response (#3843)",
"author_name": "Madelyn Olson",
"author_login": "madolson",
"committed_at": "2026-06-04T07:44:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "65d6abde0d812234d26763930b5e84ff05963c96",
"body": "When a connection is both not usable and has a bad conn error,\nreleaseConn would call reconnect twice — first establishing a new\nconnection, then immediately closing it to create another. Add early\nreturn after the first reconnect to avoid the wasted connection.",
"is_bot": false,
"headline": "fix(pubsub): prevent double reconnect in releaseConn (#3833)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-05-29T09:42:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03",
"body": "* chore(release): add release notes\n\n* Update readme and release notes.\n\nDeprecate UnstableResp3 everywhere\n\n* chore(release): bump version v9.20.0",
"is_bot": false,
"headline": "chore(release): v9.20.0 (#3832)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-28T07:31:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97568827124c58f1338d78b9535edc0eb9435453",
"body": "…… (#3830)\n\n* fix(test): make waitForSentinelClusterStable robust to disconnected replicas\n\nCI on master sporadically fails the universal_test.go spec\n\"should connect to failover servers on slaves when readonly Options is ok\"\nwith `Expected master to equal slave`. The flake reproduces only when the\n\n[…]\nion code changes; the retry-on-READONLY behaviour is correct\nfor normal failover scenarios and stays untouched.\n\n---------\n\nCo-authored-by: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(test): make waitForSentinelClusterStable robust to disconnected r…",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-27T15:01:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "875ce21e4862a7913edb5308b16869141ce5e833",
"body": "* fix: do not close sentinel when replicas list is empty\n\nWhen a sentinel-monitored Redis master has no replicas (master-only\nsetup), replicaAddrss() was calling closeSentinel() on receiving an\nempty replica list without error. This destroyed the sentinel\nconnection (and its pub/sub failover subscri\n[…]\n checks (flaky PubSub ClientSetName and conn_state tests)\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(sentinel): do not close sentinel when replica list is empty (#3795)",
"author_name": "shahyash2609",
"author_login": "shahyash2609",
"committed_at": "2026-05-27T14:05:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8a027f21ba2686511e1a6a159f0c6888f11d48e7",
"body": "Add a dedicated GitHub Actions workflow to run govulncheck.\n\n- scans all Go modules in the repository\n- collects results across modules instead of stopping on first failure\n- fails explicitly if no modules are discovered\n- ensures scans run only after successful directory change\n- uses a fixed govulncheck version for reproducibility\n- runs on Go 1.26.x to avoid failures caused by known vulnerabilities in older toolchains\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "chore(ci): add govulncheck workflow (#3779)",
"author_name": "Denis Miretsky",
"author_login": "solardome",
"committed_at": "2026-05-27T13:45:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d8407df30af7eba2c24280791fed4b8bd3e62c97",
"body": "In ClusterClient.SSubscribe, the per-PubSub newConn closure picks the\ntarget node by hash slot of channels[0]. PubSub.conn() was only passing\nc.channels (regular SUBSCRIBE) into that closure — sharded SSubscribe\nchannels stored in c.schannels were silently dropped.\n\nFor an SSubscribe-only PubSub (th\n[…]\nnewChannels) via a stub newConn that\ncaptures the channel list. The cluster routing layer itself is not\nunder test — the regression is whether the channel list reaches the\nclosure intact.\n\nFixes #3806",
"is_bot": false,
"headline": "fix(pubsub): include shard channels in newConn routing list (#3829)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-27T13:27:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6af9bdc84ba25303f2b9dd9949055ee6224c6d96",
"body": "…t 0 (#3828)\n\nIn TLS-only clusters started with `--port 0 --tls-port <port>`, CLUSTER\nSLOTS reports the regular port as 0. newClusterState used to pass that\nvalue verbatim into clusterNode.Client.opt.Addr, which the PubSub path\ndials directly with no MOVED/seed fallback, producing\n`dial tcp <ip>:0: \n[…]\ntification matching\ncontinues to see the server-reported value.\n\nAdds TestNewClusterState_PortZero covering the bug scenario plus the\nnon-zero passthrough and the loopback+:0 composition.\n\nFixes #3726",
"is_bot": false,
"headline": "fix(cluster): fall back to origin port when CLUSTER SLOTS reports por…",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-27T10:51:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fa5aa8c4d26a0983f16ebc537696150d80bfc8f0",
"body": "* chore(doc): Update README and CI image.\n\n* Use latest image",
"is_bot": false,
"headline": "chore(doc): Update README and CI image. (#3822)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-27T10:10:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fdcc6f9221e6d447b1c1a50d946c74d8db51cda3",
"body": "…hing (#3804)\n\n* refactor(TODO-3803): Enhance key position retrieval with CommandInfo caching ultimately solving the TODO\n\n* fix(command): Handle nil cache in Peek method to prevent panic\n\n* refactor(command): Optimize keyless command handling and improve refresh lock mechanism as requested\n\n* Check\n[…]\nnd reducing redundant Peek calls\n\n* Update command.go\n\n---------\n\nCo-authored-by: Krish Srivastava <krish.srivastava@pw.live>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "refactor(keyPos): Enhance key position retrieval with CommandInfo cac…",
"author_name": "Krish Srivastava",
"author_login": "retr0-kernel",
"committed_at": "2026-05-27T10:00:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "68a8bc1e8457d796d35cae34435529cd6e56a762",
"body": "…rrent probe (#3827)\n\nIn MasterAddr, multiple goroutines probe sentinels concurrently. The first\nto succeed enters sync.Once and saves its SentinelClient via setSentinel.\nOther goroutines that also succeeded but lost the once.Do race doesn't\nclosed its SentinelClient — a resource leak.\n\nAfter once.Do returns, close the sentinelCli if it's not the winner.\nsync.Once guarantees all goroutines see c.sentinel written by the winner.",
"is_bot": false,
"headline": "fix(sentinel): close non-winning sentinel clients in MasterAddr concu…",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-05-27T09:37:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00bf6d3edc1f50cce7a81d6a11a580cb060fce56",
"body": "* fix: avoid retrying ClusterClient Watch callback errors\n\n* test: use io.EOF for Watch callback retry regression",
"is_bot": false,
"headline": "fix: avoid retrying ClusterClient Watch callback errors (#3821)",
"author_name": "obiyang",
"author_login": "obiyang",
"committed_at": "2026-05-26T08:15:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c737bc0ffebda3f0b9ac94eab77b827dda8b2bd1",
"body": null,
"is_bot": false,
"headline": "chore: remove unused queue channel from ConnPool (#3826)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-05-26T08:12:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81d6b7f74beb0f7df5c446360c062e0434ebd8ab",
"body": "…#3825)\n\nBumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 9.2.0 to 9.2.1.\n- [Release notes](https://github.com/golangci/golangci-lint-action/releases)\n- [Commits](https://github.com/golangci/golangci-lint-action/compare/v9.2.0...v9.2.1)\n\n---\nupdated-depend\n[…]\nirect:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golangci/golangci-lint-action from 9.2.0 to 9.2.1 (…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-26T08:12:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ec2400781998e3b61bd7fb08fc0aa25b41c83166",
"body": "* fix(vset): vlinks return type\n\n* fix(vset): fix test\n\n* fix(vset): fix test\n\n* fix(vset): remove last layer check from tests\n\n* fix(vset): fix lint & issue\n\n* fix(vset): fix n -> innerLen check\n\n* test(vset): add mocked-response parser tests for VLINKS\n\nCover StringSliceSliceCmd.readReply (VLINKS)\n[…]\nauthored-by: Nedyalko Dyakov <nedyalko.dyakov@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(vectorsets): VLinks return type (#3820)",
"author_name": "romanpovol",
"author_login": "romanpovol",
"committed_at": "2026-05-26T08:11:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cf470ca0224b3a8517f2e52af195d77c0a634b92",
"body": "Root cause: a race condition between two independent goroutines\nthat detect failover completion:\n\n1. The test's polling loop queries sentinel.Master() directly,\n which returns as soon as the sentinel server reports the new\n master.\n\n2. The ConnectionClosed metric callback is triggered asynchrono\n[…]\nub listener has\nprocessed the \"+switch-master\" message, the metric callback does\nfire eventually, but after the assertion has already failed.\n\nFix: replace the direct Expect assertion with Eventually.",
"is_bot": false,
"headline": "fix(test): fix race condition in sentinel failover metric test (#3824)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-05-22T17:24:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "14e322935bd19c1cf4765c6a8b481ea808646d97",
"body": "Go 1.20+ auto-seeds the global PRNG and Go 1.24 uses lock-free\nChaCha8 internally, making the custom mutex-protected wrapper\nunnecessary. This simplifies the codebase and improves concurrent\nperformance.",
"is_bot": false,
"headline": "chore(rand) replace internal/rand with stdlib math/rand (#3823)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-05-22T12:54:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bfd192220031bf973eb7d05ee2d2c542e7b2d583",
"body": "* feat: impl array data structure\n\n* add integration tests for array commands\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n* fix: move CmdTypeUint and CmdTypeUintSlice to end of iota sequence\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n* test: add boundary tests for large \n[…]\ninterface{}` and document index range constraint on ArrayCmdable interface.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(command): Add AR* (array data structure) commands (#3813)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-05-21T14:14:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "14a9a8536366991f0c414829a6c776bd23bf0874",
"body": "* parse resp3 responses\n\n* backwards compatibility\n\n* doctests and format\n\n* fix parsing\n\n* remove unused functions\n\n* debug test\n\n* debug test x2 peek directly\n\n* debug test\n\n* remove debug and skip re build\n\n* fix typo\n\n* add tests and fix parsers for resp3\n\n* add comment for the unreliable Total \n[…]\nwing rawVal\n\n* fix strange redis search float,int,string behaviour handling\n\n* mark UnstableResp3 as Deprecated\n\n---------\n\nCo-authored-by: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(search): parser resp3 responses for search (#3741)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-21T11:18:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "540781831b3e955c68a07dd85b352150c86f316f",
"body": "…ands (#3791)\n\n* Adds support for multiple aggregators in TS range commands\n\n* Validates against invalid aggregators\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(command): Adds support for multiple aggregators in TS range comm…",
"author_name": "Elena Kolevska",
"author_login": "elena-kolevska",
"committed_at": "2026-05-21T11:10:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4653645e9d7ba5112e37b5926adcf8a0ab070127",
"body": "* Adds support for the XNACK command introduced in Redis 8.8\n\n* validate Mode client-side and add mode constants\n\n* Address comments\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>\nCo-authored-by: ofekshenawa <ofek.shenawa@redis.com>",
"is_bot": false,
"headline": "feat(command): Adds client support for the XNACK command (#3790)",
"author_name": "Elena Kolevska",
"author_login": "elena-kolevska",
"committed_at": "2026-05-21T11:10:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5f08a58477253e8b04ecf29857586c3df310f25",
"body": "* feat(command): add increx\n\n* add one additional test\n\n* update increx\n\n* use custom 8.8 image with new increx\n\n* address pr comments\n\n* always use by in float",
"is_bot": false,
"headline": "feat(command): add support for INCREX (#3816)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-21T11:08:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b88fd9b3720a39ee82f0be1a0afa0631a75621ed",
"body": "This way the LICENSE will be shipped with those extra packages\nas well.",
"is_bot": false,
"headline": "chore(extra): Add LICENSE file to extra packages (#3817)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-19T18:34:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5305816c429c48a38d9696fdd727326c388cad3e",
"body": null,
"is_bot": false,
"headline": "fix(pool): CloseConn to trigger hooks if available #3812 (#3818)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-19T18:33:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "27fc6fa9a4f982cd79911df467c39a9c19464091",
"body": "Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "Accumulate connection pool wait statistics across all nodes (#3809)",
"author_name": "LINKIWI",
"author_login": "LINKIWI",
"committed_at": "2026-05-18T20:44:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c615d30b7d0d00f17df10461487c941bc67ff3e1",
"body": "Co-authored-by: Vladislav Isakov <visakov@ivi.ru>",
"is_bot": false,
"headline": "fix(error): make wrapped dial tcp error redirectable (#3799) (#3810)",
"author_name": "Vladislav",
"author_login": "vladisa88",
"committed_at": "2026-05-18T12:02:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad7fabb33650818ecbc54712d7abfcb7f88f907e",
"body": null,
"is_bot": false,
"headline": "fix(test): flaky tests (#3815)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-18T12:01:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5fbe2db0857ade26032b71fafa2a9dbb5bc480d",
"body": null,
"is_bot": false,
"headline": "chore(ci): Bump redis image version to 8.8-rc1 in CI (#3814)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-05-18T08:11:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3dfa4b663aff5fd4cbc7e8e73c2417676490e68c",
"body": "* add json.set fpha support\n\n* fix json set test",
"is_bot": false,
"headline": "feat(json): Add JSON.SET fpha support (#3797)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-08T10:01:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85bca809454be6dbcade463ab48b766a757724b1",
"body": null,
"is_bot": false,
"headline": "fix(pool): Fix Close. Do healthchecks only on idle conns (#3805)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-05-08T09:22:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e36de8b1d4c5a0232bd328fd19092237c29e263",
"body": "… types (#3756)\n\n* fix FT.HYBIRD vector validation\n\n* Add missing vector types for FT.HYBRID\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(vector): validate FT.HYBRID vector input type. Add proper vector…",
"author_name": "Yi Deng",
"author_login": "DengY11",
"committed_at": "2026-05-08T08:26:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5a3f74cc81785522ca90fbe7c0f8a7148c834dee",
"body": "…d messages ids from PEL (#3798)\n\n* reading xautoclaim's 3rd return value as list of deletedIDs\n\n* adding test for xautoclaim that returns deletedIDs\n\n* updating expected comments. running doctests make test locally works fine ?\n\n* Adding missing clone deletedIDs\n\n* switch to creating a new command \n[…]\ngger CI\n\n* trigger CI\n\n* trigger CI\n\n* trigger CI\n\n---------\n\nCo-authored-by: Benoit Verreault <benoit.verreault@gearbox.com>\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(xautoclaim): Add support for xautoclaim to return list of delete…",
"author_name": "Benoit Verreault",
"author_login": "Khukharr",
"committed_at": "2026-05-07T13:05:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ec95b16930550e2eef58b20e4a06ef72041b335",
"body": "…ection (#3802)",
"is_bot": false,
"headline": "feat(aggregator): Support COUNT aggregate for sorted set union/inters…",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-05-07T12:18:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cdff5946a357dfc2302ca9395ac68f7749b946b",
"body": "* Add standalone hash subkey notification test\n\n* Bump image version to 8.8-m3\n\n* Bump doctests image version to 8.8-m3",
"is_bot": false,
"headline": "chore(tests): Add standalone hash subkey notification test (#3801)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-04-30T13:57:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e7e9866e54f4423addca48ec804044cfca1b30d6",
"body": "- Add release notes\n- Add release checklist\n- Fix release script to update deps",
"is_bot": false,
"headline": "chore(release): v9.19.0 (#3796)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-04-28T11:16:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "22b26f4b3ea5c2ab58605092e0937b78a8673267",
"body": "* ft.aggregate with steps\n\n* ignore deprecated fields when steps are present\n\n* add example app\n\n* address pr comments\n\n---------\n\nCo-authored-by: Elena Kolevska <elena-kolevska@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(ft.aggregate): Add Steps for query building (#3782)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-04-24T21:21:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d9d769491154d4da6d683b73e9dfff5c878c1890",
"body": "* fix(pool): two fixes for closed connection handling\n\n* fix test\n\n* fix\n\n* fix: the sentinel test cases has a timing issue\n\n* test: serial universal_test\n\n* fix data race on closeReason field\n\n* fix test: wait for sentinel cluster stable after failover tests\n\n* fix rebase\n\n* typo\n\n* reset the conn.onClose() after close the conn\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(pool): two fixes for closed connection handling (#3764)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-04-24T07:16:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44e8b7309cf547f620b9849a5a4dd9013cc3660a",
"body": "* fix hostname detection\n\n* Update maintnotifications/config.go\n\nCo-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>\n\n* Update maintnotifications/config.go\n\nCo-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>\n\n* fix log level check\n\n* fix ip when tls is off\n\n* handle empty address\n\n---------\n\nCo-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(sch): auto hostname type detection (#3789)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-04-23T18:38:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ad21622ce8dba26c4ac7dc0fbf74a0bd278d2c19",
"body": "… (#3788)",
"is_bot": false,
"headline": "fix(hello): do not send maintnotifications handshake when hello fails…",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-04-23T15:06:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1a7ac744c3f98b415852b4c9842b97991e3e4d91",
"body": "* fix: suppress pool Close() errors for stale connections\n\n* fix: Health check on already-closed connection always suppresses errors\n\n---------\n\nCo-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(pool): suppress pool Close() errors for stale connections (#3778)",
"author_name": "ofekshenawa",
"author_login": "ofekshenawa",
"committed_at": "2026-04-23T12:40:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "903d6bd360af9ea53d4af4ca652d18b915398c7d",
"body": "Co-authored-by: Vladislav Isakov <visakov@ivi.ru>",
"is_bot": false,
"headline": "fix(retry): make dial tcp error redirectable (#3786) (#3787)",
"author_name": "Vladislav",
"author_login": "vladisa88",
"committed_at": "2026-04-23T12:20:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00a551b3b468687e5e06b295b419292786bcdc99",
"body": "* fix leak in wrappedOnClose\n\n* address linter warning",
"is_bot": false,
"headline": "fix(credentials): leak in wrappedOnClose (#3785)",
"author_name": "Nedyalko Dyakov",
"author_login": "ndyakov",
"committed_at": "2026-04-22T13:45:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5a6f99b7a9d496bf2e3d68ad9c33e43c23c4df9",
"body": "* refactor(pool): remove redundant Conn.closed atomic field\n\nThe closed field was redundant with stateMachine's StateClosed state.\nNow IsClosed() and Close() only use the state machine for consistency.\n\n* CI",
"is_bot": false,
"headline": "refactor(pool): remove redundant Conn.closed atomic field (#3783)",
"author_name": "cxljs",
"author_login": "cxljs",
"committed_at": "2026-04-21T14:23:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "928f27aef850b3508b590e41a050f27d29fb14a2",
"body": "* feat(hscan): support encoding.BinaryUnmarshaler\n\n* Add BinaryData and binaryUnmarshaler types with tests\n\n* style: fix gofmt issues in internal/hscan/structmap.go\n\nFix: 3139",
"is_bot": false,
"headline": "feat(hscan): add support for encoding.BinaryUnmarshaler (#3768)",
"author_name": "Aaditya Kumar Dubey",
"author_login": "Aaditya-dubey1",
"committed_at": "2026-04-21T14:16:11Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 68,
"commits_last_year": 292,
"latest_release_at": "2026-06-22T07:42:44Z",
"latest_release_tag": "v9.21.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 48,
"days_since_latest_release": 31,
"mean_days_between_releases": 23.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 62,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/redis/go-redis/v9",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/redis/go-redis/v9",
"is_deprecated": false,
"latest_version": "v9.21.0",
"repository_url": "https://github.com/redis/go-redis",
"versions_count": 63,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-06-22T07:31:42Z",
"latest_version_yanked": null,
"days_since_latest_publish": 31
}
]
},
"popularity": {
"forks": 2571,
"stars": 22197,
"watchers": 252,
"fork_history": {
"days": [
{
"date": "2022-02-21",
"count": 2
},
{
"date": "2022-02-22",
"count": 4
},
{
"date": "2022-02-24",
"count": 1
},
{
"date": "2022-02-25",
"count": 1
},
{
"date": "2022-02-26",
"count": 1
},
{
"date": "2022-02-27",
"count": 1
},
{
"date": "2022-03-02",
"count": 3
},
{
"date": "2022-03-03",
"count": 1
},
{
"date": "2022-03-04",
"count": 1
},
{
"date": "2022-03-08",
"count": 1
},
{
"date": "2022-03-10",
"count": 1
},
{
"date": "2022-03-15",
"count": 2
},
{
"date": "2022-03-16",
"count": 1
},
{
"date": "2022-03-17",
"count": 3
},
{
"date": "2022-03-19",
"count": 1
},
{
"date": "2022-03-20",
"count": 1
},
{
"date": "2022-03-21",
"count": 3
},
{
"date": "2022-03-22",
"count": 2
},
{
"date": "2022-03-23",
"count": 1
},
{
"date": "2022-03-24",
"count": 1
},
{
"date": "2022-03-26",
"count": 1
},
{
"date": "2022-03-28",
"count": 5
},
{
"date": "2022-03-29",
"count": 1
},
{
"date": "2022-03-30",
"count": 1
},
{
"date": "2022-03-31",
"count": 1
},
{
"date": "2022-04-06",
"count": 1
},
{
"date": "2022-04-07",
"count": 2
},
{
"date": "2022-04-13",
"count": 2
},
{
"date": "2022-04-14",
"count": 1
},
{
"date": "2022-04-15",
"count": 1
},
{
"date": "2022-04-16",
"count": 1
},
{
"date": "2022-04-17",
"count": 1
},
{
"date": "2022-04-18",
"count": 1
},
{
"date": "2022-04-19",
"count": 1
},
{
"date": "2022-04-20",
"count": 1
},
{
"date": "2022-04-21",
"count": 3
},
{
"date": "2022-04-25",
"count": 1
},
{
"date": "2022-04-27",
"count": 1
},
{
"date": "2022-04-28",
"count": 2
},
{
"date": "2022-05-05",
"count": 2
},
{
"date": "2022-05-06",
"count": 2
},
{
"date": "2022-05-07",
"count": 3
},
{
"date": "2022-05-09",
"count": 2
},
{
"date": "2022-05-11",
"count": 1
},
{
"date": "2022-05-16",
"count": 1
},
{
"date": "2022-05-17",
"count": 1
},
{
"date": "2022-05-19",
"count": 1
},
{
"date": "2022-05-21",
"count": 2
},
{
"date": "2022-05-22",
"count": 1
},
{
"date": "2022-05-23",
"count": 5
},
{
"date": "2022-05-24",
"count": 1
},
{
"date": "2022-05-25",
"count": 3
},
{
"date": "2022-05-27",
"count": 2
},
{
"date": "2022-05-28",
"count": 1
},
{
"date": "2022-05-30",
"count": 1
},
{
"date": "2022-06-01",
"count": 2
},
{
"date": "2022-06-02",
"count": 1
},
{
"date": "2022-06-08",
"count": 3
},
{
"date": "2022-06-09",
"count": 1
},
{
"date": "2022-06-10",
"count": 1
},
{
"date": "2022-06-12",
"count": 3
},
{
"date": "2022-06-14",
"count": 1
},
{
"date": "2022-06-15",
"count": 2
},
{
"date": "2022-06-16",
"count": 2
},
{
"date": "2022-06-19",
"count": 2
},
{
"date": "2022-06-21",
"count": 1
},
{
"date": "2022-06-23",
"count": 1
},
{
"date": "2022-06-24",
"count": 2
},
{
"date": "2022-06-26",
"count": 1
},
{
"date": "2022-06-29",
"count": 5
},
{
"date": "2022-07-04",
"count": 1
},
{
"date": "2022-07-06",
"count": 2
},
{
"date": "2022-07-07",
"count": 2
},
{
"date": "2022-07-09",
"count": 1
},
{
"date": "2022-07-10",
"count": 1
},
{
"date": "2022-07-11",
"count": 1
},
{
"date": "2022-07-12",
"count": 3
},
{
"date": "2022-07-13",
"count": 1
},
{
"date": "2022-07-18",
"count": 1
},
{
"date": "2022-07-20",
"count": 1
},
{
"date": "2022-07-21",
"count": 1
},
{
"date": "2022-07-22",
"count": 2
},
{
"date": "2022-07-23",
"count": 1
},
{
"date": "2022-07-26",
"count": 1
},
{
"date": "2022-07-27",
"count": 1
},
{
"date": "2022-07-29",
"count": 1
},
{
"date": "2022-08-01",
"count": 1
},
{
"date": "2022-08-02",
"count": 1
},
{
"date": "2022-08-03",
"count": 1
},
{
"date": "2022-08-05",
"count": 1
},
{
"date": "2022-08-08",
"count": 1
},
{
"date": "2022-08-09",
"count": 1
},
{
"date": "2022-08-13",
"count": 2
},
{
"date": "2022-08-15",
"count": 1
},
{
"date": "2022-08-17",
"count": 2
},
{
"date": "2022-08-18",
"count": 1
},
{
"date": "2022-08-19",
"count": 1
},
{
"date": "2022-08-23",
"count": 1
},
{
"date": "2022-08-25",
"count": 1
},
{
"date": "2022-08-26",
"count": 1
},
{
"date": "2022-08-27",
"count": 1
},
{
"date": "2022-08-28",
"count": 1
},
{
"date": "2022-08-29",
"count": 1
},
{
"date": "2022-08-31",
"count": 1
},
{
"date": "2022-09-01",
"count": 1
},
{
"date": "2022-09-05",
"count": 1
},
{
"date": "2022-09-07",
"count": 2
},
{
"date": "2022-09-08",
"count": 1
},
{
"date": "2022-09-13",
"count": 1
},
{
"date": "2022-09-14",
"count": 1
},
{
"date": "2022-09-15",
"count": 1
},
{
"date": "2022-09-16",
"count": 3
},
{
"date": "2022-09-17",
"count": 1
},
{
"date": "2022-09-21",
"count": 1
},
{
"date": "2022-09-27",
"count": 1
},
{
"date": "2022-09-28",
"count": 2
},
{
"date": "2022-09-29",
"count": 2
},
{
"date": "2022-10-04",
"count": 1
},
{
"date": "2022-10-07",
"count": 1
},
{
"date": "2022-10-08",
"count": 1
},
{
"date": "2022-10-10",
"count": 1
},
{
"date": "2022-10-11",
"count": 2
},
{
"date": "2022-10-13",
"count": 1
},
{
"date": "2022-10-14",
"count": 3
},
{
"date": "2022-10-17",
"count": 2
},
{
"date": "2022-10-19",
"count": 1
},
{
"date": "2022-10-21",
"count": 1
},
{
"date": "2022-10-22",
"count": 1
},
{
"date": "2022-10-23",
"count": 1
},
{
"date": "2022-10-24",
"count": 3
},
{
"date": "2022-10-26",
"count": 3
},
{
"date": "2022-10-27",
"count": 2
},
{
"date": "2022-10-31",
"count": 2
},
{
"date": "2022-11-01",
"count": 1
},
{
"date": "2022-11-04",
"count": 2
},
{
"date": "2022-11-06",
"count": 1
},
{
"date": "2022-11-07",
"count": 1
},
{
"date": "2022-11-09",
"count": 1
},
{
"date": "2022-11-14",
"count": 1
},
{
"date": "2022-11-15",
"count": 1
},
{
"date": "2022-11-16",
"count": 1
},
{
"date": "2022-11-20",
"count": 1
},
{
"date": "2022-11-21",
"count": 1
},
{
"date": "2022-11-22",
"count": 1
},
{
"date": "2022-11-24",
"count": 1
},
{
"date": "2022-11-25",
"count": 2
},
{
"date": "2022-11-27",
"count": 3
},
{
"date": "2022-11-28",
"count": 1
},
{
"date": "2022-11-29",
"count": 1
},
{
"date": "2022-12-01",
"count": 1
},
{
"date": "2022-12-02",
"count": 1
},
{
"date": "2022-12-03",
"count": 1
},
{
"date": "2022-12-08",
"count": 1
},
{
"date": "2022-12-09",
"count": 1
},
{
"date": "2022-12-12",
"count": 1
},
{
"date": "2022-12-13",
"count": 2
},
{
"date": "2022-12-14",
"count": 1
},
{
"date": "2022-12-15",
"count": 1
},
{
"date": "2022-12-16",
"count": 2
},
{
"date": "2022-12-18",
"count": 1
},
{
"date": "2022-12-21",
"count": 1
},
{
"date": "2022-12-22",
"count": 2
},
{
"date": "2022-12-23",
"count": 1
},
{
"date": "2022-12-24",
"count": 1
},
{
"date": "2022-12-26",
"count": 1
},
{
"date": "2022-12-28",
"count": 1
},
{
"date": "2022-12-29",
"count": 1
},
{
"date": "2022-12-30",
"count": 1
},
{
"date": "2023-01-02",
"count": 1
},
{
"date": "2023-01-03",
"count": 1
},
{
"date": "2023-01-09",
"count": 1
},
{
"date": "2023-01-10",
"count": 1
},
{
"date": "2023-01-11",
"count": 1
},
{
"date": "2023-01-18",
"count": 1
},
{
"date": "2023-01-19",
"count": 1
},
{
"date": "2023-01-20",
"count": 1
},
{
"date": "2023-01-26",
"count": 1
},
{
"date": "2023-01-27",
"count": 1
},
{
"date": "2023-01-30",
"count": 2
},
{
"date": "2023-02-01",
"count": 3
},
{
"date": "2023-02-02",
"count": 2
},
{
"date": "2023-02-03",
"count": 1
},
{
"date": "2023-02-04",
"count": 1
},
{
"date": "2023-02-05",
"count": 2
},
{
"date": "2023-02-06",
"count": 2
},
{
"date": "2023-02-07",
"count": 5
},
{
"date": "2023-02-10",
"count": 2
},
{
"date": "2023-02-11",
"count": 2
},
{
"date": "2023-02-13",
"count": 2
},
{
"date": "2023-02-14",
"count": 3
},
{
"date": "2023-02-16",
"count": 2
},
{
"date": "2023-02-18",
"count": 1
},
{
"date": "2023-02-20",
"count": 1
},
{
"date": "2023-02-21",
"count": 1
},
{
"date": "2023-02-22",
"count": 1
},
{
"date": "2023-02-23",
"count": 2
},
{
"date": "2023-02-27",
"count": 1
},
{
"date": "2023-02-28",
"count": 1
},
{
"date": "2023-03-01",
"count": 2
},
{
"date": "2023-03-02",
"count": 1
},
{
"date": "2023-03-05",
"count": 1
},
{
"date": "2023-03-07",
"count": 1
},
{
"date": "2023-03-09",
"count": 3
},
{
"date": "2023-03-10",
"count": 3
},
{
"date": "2023-03-11",
"count": 1
},
{
"date": "2023-03-14",
"count": 1
},
{
"date": "2023-03-16",
"count": 2
},
{
"date": "2023-03-17",
"count": 1
},
{
"date": "2023-03-18",
"count": 2
},
{
"date": "2023-03-19",
"count": 1
},
{
"date": "2023-03-26",
"count": 3
},
{
"date": "2023-03-27",
"count": 3
},
{
"date": "2023-03-28",
"count": 2
},
{
"date": "2023-03-30",
"count": 1
},
{
"date": "2023-03-31",
"count": 3
},
{
"date": "2023-04-01",
"count": 1
},
{
"date": "2023-04-04",
"count": 1
},
{
"date": "2023-04-05",
"count": 1
},
{
"date": "2023-04-11",
"count": 3
},
{
"date": "2023-04-13",
"count": 1
},
{
"date": "2023-04-14",
"count": 2
},
{
"date": "2023-04-15",
"count": 1
},
{
"date": "2023-04-16",
"count": 2
},
{
"date": "2023-04-17",
"count": 1
},
{
"date": "2023-04-18",
"count": 1
},
{
"date": "2023-04-19",
"count": 1
},
{
"date": "2023-04-20",
"count": 2
},
{
"date": "2023-04-21",
"count": 1
},
{
"date": "2023-04-22",
"count": 3
},
{
"date": "2023-04-25",
"count": 2
},
{
"date": "2023-04-26",
"count": 1
},
{
"date": "2023-04-27",
"count": 3
},
{
"date": "2023-04-28",
"count": 1
},
{
"date": "2023-04-30",
"count": 1
},
{
"date": "2023-05-02",
"count": 2
},
{
"date": "2023-05-04",
"count": 1
},
{
"date": "2023-05-08",
"count": 3
},
{
"date": "2023-05-10",
"count": 3
},
{
"date": "2023-05-11",
"count": 2
},
{
"date": "2023-05-13",
"count": 1
},
{
"date": "2023-05-18",
"count": 3
},
{
"date": "2023-05-19",
"count": 1
},
{
"date": "2023-05-21",
"count": 1
},
{
"date": "2023-05-22",
"count": 1
},
{
"date": "2023-05-25",
"count": 1
},
{
"date": "2023-05-26",
"count": 1
},
{
"date": "2023-05-29",
"count": 1
},
{
"date": "2023-05-30",
"count": 1
},
{
"date": "2023-05-31",
"count": 2
},
{
"date": "2023-06-02",
"count": 2
},
{
"date": "2023-06-04",
"count": 2
},
{
"date": "2023-06-08",
"count": 2
},
{
"date": "2023-06-09",
"count": 2
},
{
"date": "2023-06-10",
"count": 3
},
{
"date": "2023-06-13",
"count": 2
},
{
"date": "2023-06-14",
"count": 1
},
{
"date": "2023-06-16",
"count": 1
},
{
"date": "2023-06-17",
"count": 1
},
{
"date": "2023-06-24",
"count": 1
},
{
"date": "2023-06-27",
"count": 1
},
{
"date": "2023-06-29",
"count": 2
},
{
"date": "2023-07-02",
"count": 1
},
{
"date": "2023-07-06",
"count": 1
},
{
"date": "2023-07-11",
"count": 1
},
{
"date": "2023-07-12",
"count": 1
},
{
"date": "2023-07-14",
"count": 2
},
{
"date": "2023-07-16",
"count": 1
},
{
"date": "2023-07-18",
"count": 1
},
{
"date": "2023-07-20",
"count": 1
},
{
"date": "2023-07-21",
"count": 1
},
{
"date": "2023-07-24",
"count": 1
},
{
"date": "2023-07-26",
"count": 2
},
{
"date": "2023-07-27",
"count": 1
},
{
"date": "2023-07-28",
"count": 1
},
{
"date": "2023-07-31",
"count": 2
},
{
"date": "2023-08-01",
"count": 2
},
{
"date": "2023-08-08",
"count": 1
},
{
"date": "2023-08-09",
"count": 1
},
{
"date": "2023-08-10",
"count": 1
},
{
"date": "2023-08-14",
"count": 1
},
{
"date": "2023-08-15",
"count": 1
},
{
"date": "2023-08-16",
"count": 1
},
{
"date": "2023-08-18",
"count": 1
},
{
"date": "2023-08-22",
"count": 2
},
{
"date": "2023-08-23",
"count": 2
},
{
"date": "2023-08-24",
"count": 2
},
{
"date": "2023-08-25",
"count": 2
},
{
"date": "2023-08-26",
"count": 2
},
{
"date": "2023-08-29",
"count": 1
},
{
"date": "2023-08-30",
"count": 2
},
{
"date": "2023-09-09",
"count": 1
},
{
"date": "2023-09-11",
"count": 2
},
{
"date": "2023-09-15",
"count": 1
},
{
"date": "2023-09-26",
"count": 1
},
{
"date": "2023-09-27",
"count": 1
},
{
"date": "2023-10-05",
"count": 2
},
{
"date": "2023-10-08",
"count": 2
},
{
"date": "2023-10-11",
"count": 2
},
{
"date": "2023-10-13",
"count": 1
},
{
"date": "2023-10-16",
"count": 1
},
{
"date": "2023-10-17",
"count": 1
},
{
"date": "2023-10-22",
"count": 1
},
{
"date": "2023-10-23",
"count": 1
},
{
"date": "2023-10-24",
"count": 3
},
{
"date": "2023-10-30",
"count": 1
},
{
"date": "2023-10-31",
"count": 1
},
{
"date": "2023-11-01",
"count": 2
},
{
"date": "2023-11-02",
"count": 1
},
{
"date": "2023-11-03",
"count": 2
},
{
"date": "2023-11-04",
"count": 1
},
{
"date": "2023-11-06",
"count": 1
},
{
"date": "2023-11-07",
"count": 4
},
{
"date": "2023-11-10",
"count": 2
},
{
"date": "2023-11-12",
"count": 1
},
{
"date": "2023-11-14",
"count": 1
},
{
"date": "2023-11-19",
"count": 2
},
{
"date": "2023-11-20",
"count": 3
},
{
"date": "2023-11-21",
"count": 1
},
{
"date": "2023-11-22",
"count": 3
},
{
"date": "2023-11-25",
"count": 2
},
{
"date": "2023-11-28",
"count": 1
},
{
"date": "2023-11-30",
"count": 1
},
{
"date": "2023-12-04",
"count": 1
},
{
"date": "2023-12-07",
"count": 1
},
{
"date": "2023-12-09",
"count": 1
},
{
"date": "2023-12-12",
"count": 1
},
{
"date": "2023-12-15",
"count": 1
},
{
"date": "2023-12-18",
"count": 2
},
{
"date": "2023-12-20",
"count": 1
},
{
"date": "2023-12-21",
"count": 1
},
{
"date": "2023-12-25",
"count": 1
},
{
"date": "2023-12-26",
"count": 1
},
{
"date": "2023-12-27",
"count": 2
},
{
"date": "2023-12-29",
"count": 1
},
{
"date": "2023-12-31",
"count": 1
},
{
"date": "2024-01-01",
"count": 1
},
{
"date": "2024-01-02",
"count": 1
},
{
"date": "2024-01-05",
"count": 1
},
{
"date": "2024-01-09",
"count": 3
},
{
"date": "2024-01-10",
"count": 1
},
{
"date": "2024-01-16",
"count": 2
},
{
"date": "2024-01-17",
"count": 1
},
{
"date": "2024-01-25",
"count": 1
},
{
"date": "2024-01-26",
"count": 1
},
{
"date": "2024-01-29",
"count": 1
},
{
"date": "2024-02-04",
"count": 1
},
{
"date": "2024-02-05",
"count": 3
},
{
"date": "2024-02-06",
"count": 1
},
{
"date": "2024-02-13",
"count": 1
},
{
"date": "2024-02-14",
"count": 1
},
{
"date": "2024-02-16",
"count": 1
},
{
"date": "2024-02-17",
"count": 2
},
{
"date": "2024-02-19",
"count": 1
},
{
"date": "2024-02-20",
"count": 1
},
{
"date": "2024-02-21",
"count": 1
},
{
"date": "2024-02-22",
"count": 1
},
{
"date": "2024-02-23",
"count": 2
},
{
"date": "2024-02-24",
"count": 2
},
{
"date": "2024-02-26",
"count": 1
},
{
"date": "2024-02-27",
"count": 1
},
{
"date": "2024-02-29",
"count": 1
},
{
"date": "2024-03-01",
"count": 1
},
{
"date": "2024-03-05",
"count": 1
},
{
"date": "2024-03-06",
"count": 1
},
{
"date": "2024-03-07",
"count": 1
},
{
"date": "2024-03-09",
"count": 1
},
{
"date": "2024-03-13",
"count": 1
},
{
"date": "2024-03-14",
"count": 16
},
{
"date": "2024-03-15",
"count": 40
},
{
"date": "2024-03-16",
"count": 3
},
{
"date": "2024-03-18",
"count": 1
},
{
"date": "2024-03-23",
"count": 2
},
{
"date": "2024-03-25",
"count": 1
},
{
"date": "2024-04-01",
"count": 1
},
{
"date": "2024-04-04",
"count": 1
},
{
"date": "2024-04-05",
"count": 1
},
{
"date": "2024-04-08",
"count": 2
},
{
"date": "2024-04-09",
"count": 2
},
{
"date": "2024-04-11",
"count": 1
},
{
"date": "2024-04-12",
"count": 1
},
{
"date": "2024-04-15",
"count": 1
},
{
"date": "2024-04-16",
"count": 1
},
{
"date": "2024-04-18",
"count": 1
},
{
"date": "2024-04-19",
"count": 1
},
{
"date": "2024-04-20",
"count": 1
},
{
"date": "2024-04-23",
"count": 2
},
{
"date": "2024-04-24",
"count": 1
},
{
"date": "2024-04-25",
"count": 1
},
{
"date": "2024-04-29",
"count": 1
},
{
"date": "2024-05-01",
"count": 2
},
{
"date": "2024-05-06",
"count": 2
},
{
"date": "2024-05-07",
"count": 2
},
{
"date": "2024-05-09",
"count": 3
},
{
"date": "2024-05-13",
"count": 2
},
{
"date": "2024-05-18",
"count": 1
},
{
"date": "2024-05-19",
"count": 1
},
{
"date": "2024-05-21",
"count": 3
},
{
"date": "2024-05-30",
"count": 1
},
{
"date": "2024-05-31",
"count": 2
},
{
"date": "2024-06-03",
"count": 2
},
{
"date": "2024-06-04",
"count": 1
},
{
"date": "2024-06-05",
"count": 1
},
{
"date": "2024-06-07",
"count": 1
},
{
"date": "2024-06-09",
"count": 1
},
{
"date": "2024-06-13",
"count": 1
},
{
"date": "2024-06-14",
"count": 1
},
{
"date": "2024-06-17",
"count": 2
},
{
"date": "2024-06-18",
"count": 1
},
{
"date": "2024-06-20",
"count": 1
},
{
"date": "2024-06-21",
"count": 1
},
{
"date": "2024-06-25",
"count": 2
},
{
"date": "2024-06-27",
"count": 2
},
{
"date": "2024-06-29",
"count": 2
},
{
"date": "2024-07-02",
"count": 1
},
{
"date": "2024-07-03",
"count": 2
},
{
"date": "2024-07-04",
"count": 1
},
{
"date": "2024-07-07",
"count": 1
},
{
"date": "2024-07-11",
"count": 1
},
{
"date": "2024-07-12",
"count": 1
},
{
"date": "2024-07-13",
"count": 2
},
{
"date": "2024-07-14",
"count": 1
},
{
"date": "2024-07-15",
"count": 1
},
{
"date": "2024-07-18",
"count": 3
},
{
"date": "2024-07-21",
"count": 1
},
{
"date": "2024-07-23",
"count": 1
},
{
"date": "2024-07-24",
"count": 2
},
{
"date": "2024-07-26",
"count": 1
},
{
"date": "2024-07-28",
"count": 1
},
{
"date": "2024-07-29",
"count": 1
},
{
"date": "2024-07-31",
"count": 1
},
{
"date": "2024-08-05",
"count": 2
},
{
"date": "2024-08-06",
"count": 2
},
{
"date": "2024-08-07",
"count": 1
},
{
"date": "2024-08-09",
"count": 1
},
{
"date": "2024-08-27",
"count": 1
},
{
"date": "2024-09-02",
"count": 2
},
{
"date": "2024-09-04",
"count": 1
},
{
"date": "2024-09-06",
"count": 1
},
{
"date": "2024-09-07",
"count": 2
},
{
"date": "2024-09-09",
"count": 1
},
{
"date": "2024-09-11",
"count": 1
},
{
"date": "2024-09-15",
"count": 1
},
{
"date": "2024-09-16",
"count": 1
},
{
"date": "2024-09-19",
"count": 1
},
{
"date": "2024-09-20",
"count": 1
},
{
"date": "2024-09-23",
"count": 2
},
{
"date": "2024-09-24",
"count": 1
},
{
"date": "2024-09-30",
"count": 3
},
{
"date": "2024-10-01",
"count": 1
},
{
"date": "2024-10-03",
"count": 2
},
{
"date": "2024-10-06",
"count": 1
},
{
"date": "2024-10-07",
"count": 1
},
{
"date": "2024-10-10",
"count": 1
},
{
"date": "2024-10-16",
"count": 2
},
{
"date": "2024-10-19",
"count": 1
},
{
"date": "2024-10-20",
"count": 1
},
{
"date": "2024-10-22",
"count": 1
},
{
"date": "2024-10-23",
"count": 1
},
{
"date": "2024-10-26",
"count": 1
},
{
"date": "2024-10-29",
"count": 3
},
{
"date": "2024-11-04",
"count": 1
},
{
"date": "2024-11-07",
"count": 1
},
{
"date": "2024-11-14",
"count": 1
},
{
"date": "2024-11-20",
"count": 1
},
{
"date": "2024-11-23",
"count": 1
},
{
"date": "2024-11-25",
"count": 1
},
{
"date": "2024-11-26",
"count": 1
},
{
"date": "2024-11-29",
"count": 1
},
{
"date": "2024-12-02",
"count": 2
},
{
"date": "2024-12-03",
"count": 1
},
{
"date": "2024-12-05",
"count": 1
},
{
"date": "2024-12-06",
"count": 1
},
{
"date": "2024-12-21",
"count": 1
},
{
"date": "2024-12-26",
"count": 1
},
{
"date": "2024-12-31",
"count": 1
},
{
"date": "2025-01-03",
"count": 1
},
{
"date": "2025-01-09",
"count": 2
},
{
"date": "2025-01-10",
"count": 1
},
{
"date": "2025-01-12",
"count": 1
},
{
"date": "2025-01-14",
"count": 1
},
{
"date": "2025-01-17",
"count": 2
},
{
"date": "2025-01-21",
"count": 1
},
{
"date": "2025-01-22",
"count": 1
},
{
"date": "2025-01-29",
"count": 1
},
{
"date": "2025-02-08",
"count": 1
},
{
"date": "2025-02-10",
"count": 1
},
{
"date": "2025-02-11",
"count": 1
},
{
"date": "2025-02-13",
"count": 2
},
{
"date": "2025-02-18",
"count": 3
},
{
"date": "2025-02-19",
"count": 2
},
{
"date": "2025-02-23",
"count": 1
},
{
"date": "2025-02-24",
"count": 1
},
{
"date": "2025-02-25",
"count": 1
},
{
"date": "2025-03-03",
"count": 1
},
{
"date": "2025-03-10",
"count": 1
},
{
"date": "2025-03-11",
"count": 1
},
{
"date": "2025-03-19",
"count": 1
},
{
"date": "2025-03-20",
"count": 1
},
{
"date": "2025-03-22",
"count": 1
},
{
"date": "2025-03-24",
"count": 1
},
{
"date": "2025-03-25",
"count": 1
},
{
"date": "2025-03-27",
"count": 2
},
{
"date": "2025-03-28",
"count": 2
},
{
"date": "2025-03-29",
"count": 1
},
{
"date": "2025-04-01",
"count": 1
},
{
"date": "2025-04-03",
"count": 3
},
{
"date": "2025-04-04",
"count": 1
},
{
"date": "2025-04-05",
"count": 2
},
{
"date": "2025-04-09",
"count": 1
},
{
"date": "2025-04-16",
"count": 1
},
{
"date": "2025-04-18",
"count": 2
},
{
"date": "2025-04-19",
"count": 2
},
{
"date": "2025-04-20",
"count": 1
},
{
"date": "2025-04-24",
"count": 3
},
{
"date": "2025-04-28",
"count": 1
},
{
"date": "2025-04-29",
"count": 1
},
{
"date": "2025-05-06",
"count": 1
},
{
"date": "2025-05-08",
"count": 2
},
{
"date": "2025-05-09",
"count": 2
},
{
"date": "2025-05-13",
"count": 1
},
{
"date": "2025-05-14",
"count": 1
},
{
"date": "2025-05-16",
"count": 1
},
{
"date": "2025-05-22",
"count": 1
},
{
"date": "2025-05-23",
"count": 1
},
{
"date": "2025-05-28",
"count": 1
},
{
"date": "2025-05-30",
"count": 1
},
{
"date": "2025-06-04",
"count": 1
},
{
"date": "2025-06-09",
"count": 2
},
{
"date": "2025-06-11",
"count": 1
},
{
"date": "2025-06-17",
"count": 1
},
{
"date": "2025-06-20",
"count": 1
},
{
"date": "2025-06-23",
"count": 2
},
{
"date": "2025-06-24",
"count": 1
},
{
"date": "2025-06-25",
"count": 1
},
{
"date": "2025-06-27",
"count": 1
},
{
"date": "2025-07-07",
"count": 2
},
{
"date": "2025-07-13",
"count": 1
},
{
"date": "2025-07-14",
"count": 1
},
{
"date": "2025-07-16",
"count": 1
},
{
"date": "2025-07-17",
"count": 2
},
{
"date": "2025-07-18",
"count": 1
},
{
"date": "2025-07-22",
"count": 1
},
{
"date": "2025-07-23",
"count": 2
},
{
"date": "2025-07-24",
"count": 1
},
{
"date": "2025-07-29",
"count": 1
},
{
"date": "2025-07-30",
"count": 1
},
{
"date": "2025-07-31",
"count": 1
},
{
"date": "2025-08-04",
"count": 1
},
{
"date": "2025-08-08",
"count": 1
},
{
"date": "2025-08-09",
"count": 1
},
{
"date": "2025-08-11",
"count": 2
},
{
"date": "2025-08-12",
"count": 1
},
{
"date": "2025-08-13",
"count": 3
},
{
"date": "2025-08-14",
"count": 4
},
{
"date": "2025-08-15",
"count": 2
},
{
"date": "2025-08-18",
"count": 3
},
{
"date": "2025-08-19",
"count": 1
},
{
"date": "2025-08-20",
"count": 1
},
{
"date": "2025-08-21",
"count": 4
},
{
"date": "2025-08-25",
"count": 1
},
{
"date": "2025-08-29",
"count": 1
},
{
"date": "2025-08-31",
"count": 1
},
{
"date": "2025-09-01",
"count": 1
},
{
"date": "2025-09-07",
"count": 1
},
{
"date": "2025-09-09",
"count": 1
},
{
"date": "2025-09-11",
"count": 1
},
{
"date": "2025-09-13",
"count": 1
},
{
"date": "2025-09-16",
"count": 1
},
{
"date": "2025-09-21",
"count": 1
},
{
"date": "2025-09-27",
"count": 3
},
{
"date": "2025-09-30",
"count": 1
},
{
"date": "2025-10-01",
"count": 2
},
{
"date": "2025-10-11",
"count": 1
},
{
"date": "2025-10-13",
"count": 1
},
{
"date": "2025-10-15",
"count": 1
},
{
"date": "2025-10-19",
"count": 1
},
{
"date": "2025-10-20",
"count": 1
},
{
"date": "2025-10-22",
"count": 4
},
{
"date": "2025-10-24",
"count": 2
},
{
"date": "2025-10-25",
"count": 3
},
{
"date": "2025-10-30",
"count": 3
},
{
"date": "2025-10-31",
"count": 1
},
{
"date": "2025-11-02",
"count": 1
},
{
"date": "2025-11-03",
"count": 1
},
{
"date": "2025-11-14",
"count": 1
},
{
"date": "2025-11-16",
"count": 1
},
{
"date": "2025-11-17",
"count": 1
},
{
"date": "2025-11-19",
"count": 2
},
{
"date": "2025-11-21",
"count": 1
},
{
"date": "2025-11-28",
"count": 1
},
{
"date": "2025-11-30",
"count": 1
},
{
"date": "2025-12-03",
"count": 1
},
{
"date": "2025-12-04",
"count": 1
},
{
"date": "2025-12-09",
"count": 1
},
{
"date": "2025-12-18",
"count": 1
},
{
"date": "2025-12-24",
"count": 1
},
{
"date": "2025-12-25",
"count": 1
},
{
"date": "2026-01-01",
"count": 1
},
{
"date": "2026-01-06",
"count": 1
},
{
"date": "2026-01-10",
"count": 2
},
{
"date": "2026-01-13",
"count": 1
},
{
"date": "2026-01-14",
"count": 1
},
{
"date": "2026-01-16",
"count": 1
},
{
"date": "2026-01-20",
"count": 1
},
{
"date": "2026-01-21",
"count": 1
},
{
"date": "2026-01-22",
"count": 1
},
{
"date": "2026-01-25",
"count": 1
},
{
"date": "2026-01-26",
"count": 1
},
{
"date": "2026-01-28",
"count": 3
},
{
"date": "2026-01-29",
"count": 3
},
{
"date": "2026-02-02",
"count": 1
},
{
"date": "2026-02-04",
"count": 1
},
{
"date": "2026-02-06",
"count": 1
},
{
"date": "2026-02-10",
"count": 1
},
{
"date": "2026-02-11",
"count": 1
},
{
"date": "2026-02-12",
"count": 1
},
{
"date": "2026-02-22",
"count": 1
},
{
"date": "2026-02-24",
"count": 1
},
{
"date": "2026-02-26",
"count": 2
},
{
"date": "2026-02-28",
"count": 1
},
{
"date": "2026-03-02",
"count": 2
},
{
"date": "2026-03-03",
"count": 1
},
{
"date": "2026-03-04",
"count": 1
},
{
"date": "2026-03-07",
"count": 1
},
{
"date": "2026-03-11",
"count": 1
},
{
"date": "2026-03-17",
"count": 2
},
{
"date": "2026-03-19",
"count": 1
},
{
"date": "2026-03-20",
"count": 1
},
{
"date": "2026-03-24",
"count": 1
},
{
"date": "2026-03-25",
"count": 1
},
{
"date": "2026-04-05",
"count": 1
},
{
"date": "2026-04-06",
"count": 1
},
{
"date": "2026-04-07",
"count": 1
},
{
"date": "2026-04-08",
"count": 1
},
{
"date": "2026-04-12",
"count": 1
},
{
"date": "2026-04-14",
"count": 1
},
{
"date": "2026-04-15",
"count": 1
},
{
"date": "2026-04-17",
"count": 2
},
{
"date": "2026-04-20",
"count": 1
},
{
"date": "2026-04-21",
"count": 1
},
{
"date": "2026-04-22",
"count": 1
},
{
"date": "2026-04-24",
"count": 1
},
{
"date": "2026-04-27",
"count": 1
},
{
"date": "2026-04-28",
"count": 1
},
{
"date": "2026-05-07",
"count": 2
},
{
"date": "2026-05-09",
"count": 1
},
{
"date": "2026-05-10",
"count": 1
},
{
"date": "2026-05-11",
"count": 1
},
{
"date": "2026-05-12",
"count": 1
},
{
"date": "2026-05-19",
"count": 1
},
{
"date": "2026-05-20",
"count": 1
},
{
"date": "2026-05-21",
"count": 1
},
{
"date": "2026-05-27",
"count": 1
},
{
"date": "2026-05-31",
"count": 1
},
{
"date": "2026-06-03",
"count": 2
},
{
"date": "2026-06-10",
"count": 1
},
{
"date": "2026-06-11",
"count": 2
},
{
"date": "2026-06-16",
"count": 2
},
{
"date": "2026-06-23",
"count": 1
},
{
"date": "2026-06-25",
"count": 1
},
{
"date": "2026-07-09",
"count": 1
},
{
"date": "2026-07-13",
"count": 1
},
{
"date": "2026-07-15",
"count": 1
},
{
"date": "2026-07-16",
"count": 3
},
{
"date": "2026-07-17",
"count": 2
},
{
"date": "2026-07-19",
"count": 4
},
{
"date": "2026-07-20",
"count": 2
},
{
"date": "2026-07-21",
"count": 2
},
{
"date": "2026-07-22",
"count": 2
}
],
"complete": false,
"collected": 1000,
"total_forks": 2571
},
"star_history": null,
"open_issues_and_prs": 65
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"example",
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile",
"doctests/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"example/cluster-mget/go.mod",
"example/del-keys-without-ttl/go.mod",
"example/digest-optimistic-locking/go.mod",
"example/disable-maintnotifications/go.mod",
"example/hll/go.mod",
"example/hset-struct/go.mod",
"example/lua-scripting/go.mod",
"example/maintnotifiations-pubsub/go.mod",
"example/otel-metrics/go.mod",
"example/otel/go.mod",
"example/redis-bloom/go.mod",
"example/scan-struct/go.mod",
"example/search-aggregate-steps/go.mod",
"example/tls-cert-auth/go.mod",
"example/tls-connection/go.mod",
"example/zerocopy-buffer/go.mod",
"extra/rediscensus/go.mod",
"extra/rediscmd/go.mod",
"extra/redisotel-native/go.mod",
"extra/redisotel/go.mod",
"extra/redisprometheus/go.mod",
"go.mod",
"internal/customvet/go.mod"
],
"largest_source_bytes": 328028,
"source_files_sampled": 323,
"oversized_source_files": 10,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 10574
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "google.golang.org/grpc",
"direct": false,
"version": "v1.80.0",
"severity": "critical",
"ecosystem": "go",
"cvss_score": 9.1,
"advisory_ids": [
"GHSA-hrxh-6v49-42gf"
],
"fixed_version": "1.82.1",
"advisory_count": 1,
"oldest_advisory_days": 1
},
{
"name": "golang.org/x/net",
"direct": false,
"version": "v0.52.0",
"severity": "moderate",
"ecosystem": "go",
"cvss_score": 6.5,
"advisory_ids": [
"GHSA-5cv4-jp36-h3mw",
"GO-2026-4918",
"GO-2026-5025",
"GO-2026-5026",
"GO-2026-5027",
"GO-2026-5028",
"GO-2026-5029",
"GO-2026-5030",
"GO-2026-5942"
],
"fixed_version": "1.26.3",
"advisory_count": 9,
"oldest_advisory_days": 76
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.30.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5024"
],
"fixed_version": "0.44.0",
"advisory_count": 1,
"oldest_advisory_days": 62
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.4.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5024"
],
"fixed_version": "0.44.0",
"advisory_count": 1,
"oldest_advisory_days": 62
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.42.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5024"
],
"fixed_version": "0.44.0",
"advisory_count": 1,
"oldest_advisory_days": 62
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.43.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5024"
],
"fixed_version": "0.44.0",
"advisory_count": 1,
"oldest_advisory_days": 62
},
{
"name": "golang.org/x/text",
"direct": false,
"version": "v0.35.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5970"
],
"fixed_version": "0.39.0",
"advisory_count": 1,
"oldest_advisory_days": 9
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"unknown": 5,
"critical": 1,
"moderate": 1
},
"advisory_count": 15,
"affected_count": 7,
"assessed_count": 71,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/bsm/ginkgo/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.12.0"
},
{
"name": "github.com/bsm/gomega",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.27.10"
},
{
"name": "github.com/cespare/xxhash/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.3.0"
},
{
"name": "github.com/zeebo/xxh3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.0"
},
{
"name": "go.uber.org/atomic",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/bsm/ginkgo/v2",
"direct": true,
"version": "v2.12.0",
"ecosystem": "go"
},
{
"name": "github.com/bsm/gomega",
"direct": true,
"version": "v1.27.10",
"ecosystem": "go"
},
{
"name": "github.com/cespare/xxhash/v2",
"direct": true,
"version": "v2.3.0",
"ecosystem": "go"
},
{
"name": "github.com/zeebo/xxh3",
"direct": true,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "go.uber.org/atomic",
"direct": true,
"version": "v1.11.0",
"ecosystem": "go"
},
{
"name": "github.com/beorn7/perks",
"direct": false,
"version": "v1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/cenkalti/backoff/v5",
"direct": false,
"version": "v5.0.3",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "v1.1.1",
"ecosystem": "go"
},
{
"name": "github.com/go-logr/logr",
"direct": false,
"version": "v1.4.3",
"ecosystem": "go"
},
{
"name": "github.com/go-logr/stdr",
"direct": false,
"version": "v1.2.2",
"ecosystem": "go"
},
{
"name": "github.com/go-redis/redis/extra/rediscmd/v8",
"direct": false,
"version": "8.8.2",
"ecosystem": "go"
},
{
"name": "github.com/go-redis/redis/extra/redisotel/v8",
"direct": false,
"version": "8.8.2",
"ecosystem": "go"
},
{
"name": "github.com/go-redis/redis/v8",
"direct": false,
"version": "8.4.4",
"ecosystem": "go"
},
{
"name": "github.com/go-redis/redis/v8",
"direct": false,
"version": "8.8.2",
"ecosystem": "go"
},
{
"name": "github.com/go-redis/redis/v8/extra/redisotel",
"direct": false,
"version": "0.0.0-00010101000000-000000000000",
"ecosystem": "go"
},
{
"name": "github.com/golang/groupcache",
"direct": false,
"version": "v0.0.0-20210331224755-41bb18bfe9da",
"ecosystem": "go"
},
{
"name": "github.com/golang/protobuf",
"direct": false,
"version": "v1.5.2",
"ecosystem": "go"
},
{
"name": "github.com/google/uuid",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/grpc-ecosystem/grpc-gateway/v2",
"direct": false,
"version": "v2.28.0",
"ecosystem": "go"
},
{
"name": "github.com/klauspost/cpuid/v2",
"direct": false,
"version": "v2.2.10",
"ecosystem": "go"
},
{
"name": "github.com/matttproud/golang_protobuf_extensions",
"direct": false,
"version": "v1.0.4",
"ecosystem": "go"
},
{
"name": "github.com/onsi/ginkgo",
"direct": false,
"version": "1.15.0",
"ecosystem": "go"
},
{
"name": "github.com/onsi/gomega",
"direct": false,
"version": "1.10.5",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/client_golang",
"direct": false,
"version": "v1.14.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/client_model",
"direct": false,
"version": "v0.3.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/common",
"direct": false,
"version": "v0.39.0",
"ecosystem": "go"
},
{
"name": "github.com/prometheus/procfs",
"direct": false,
"version": "v0.9.0",
"ecosystem": "go"
},
{
"name": "github.com/uptrace/uptrace-go",
"direct": false,
"version": "v1.41.1",
"ecosystem": "go"
},
{
"name": "go.opencensus.io",
"direct": false,
"version": "0.22.6",
"ecosystem": "go"
},
{
"name": "go.opencensus.io",
"direct": false,
"version": "v0.24.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/auto/sdk",
"direct": false,
"version": "v1.2.1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/contrib/instrumentation/runtime",
"direct": false,
"version": "v0.68.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/contrib/processors/minsev",
"direct": false,
"version": "v0.16.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel",
"direct": false,
"version": "0.16.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel",
"direct": false,
"version": "1.0.0-RC1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp",
"direct": false,
"version": "v0.19.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/stdout",
"direct": false,
"version": "0.16.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/stdout/stdouttrace",
"direct": false,
"version": "1.0.0-RC1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/stdout/stdouttrace",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/log",
"direct": false,
"version": "v0.19.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/metric",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"direct": false,
"version": "0.16.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"direct": false,
"version": "1.0.0-RC1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk/log",
"direct": false,
"version": "v0.19.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk/metric",
"direct": false,
"version": "0.21.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk/metric",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/trace",
"direct": false,
"version": "1.0.0-RC1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/trace",
"direct": false,
"version": "v1.43.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/proto/otlp",
"direct": false,
"version": "v1.10.0",
"ecosystem": "go"
},
{
"name": "go.uber.org/multierr",
"direct": false,
"version": "v1.9.0",
"ecosystem": "go"
},
{
"name": "go.uber.org/zap",
"direct": false,
"version": "v1.24.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/mod",
"direct": false,
"version": "v0.7.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/net",
"direct": false,
"version": "v0.52.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.30.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.4.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.42.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.43.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/text",
"direct": false,
"version": "v0.35.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/tools",
"direct": false,
"version": "v0.5.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/genproto/googleapis/api",
"direct": false,
"version": "v0.0.0-20260406210006-6f92a3bedf2d",
"ecosystem": "go"
},
{
"name": "google.golang.org/genproto/googleapis/rpc",
"direct": false,
"version": "v0.0.0-20260406210006-6f92a3bedf2d",
"ecosystem": "go"
},
{
"name": "google.golang.org/grpc",
"direct": false,
"version": "v1.80.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/protobuf",
"direct": false,
"version": "v1.33.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/protobuf",
"direct": false,
"version": "v1.36.11",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": false,
"version": "v3.0.1",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 71,
"direct_count": 5,
"indirect_count": 66
}
},
"maintainership": {
"issues": {
"open_prs": 38,
"merged_prs": 1582,
"open_issues": 27,
"closed_ratio": 0.982,
"closed_issues": 1451,
"closed_unmerged_prs": 461
},
"bus_factor": 1,
"bot_contributors": 2,
"top_contributors": [
{
"type": "User",
"login": "vmihailenco",
"commits": 1754,
"avatar_url": "https://avatars.githubusercontent.com/u/290976?v=4"
},
{
"type": "User",
"login": "ndyakov",
"commits": 107,
"avatar_url": "https://avatars.githubusercontent.com/u/1547186?v=4"
},
{
"type": "User",
"login": "monkey92t",
"commits": 102,
"avatar_url": "https://avatars.githubusercontent.com/u/23448594?v=4"
},
{
"type": "User",
"login": "ofekshenawa",
"commits": 99,
"avatar_url": "https://avatars.githubusercontent.com/u/104765379?v=4"
},
{
"type": "User",
"login": "dim",
"commits": 45,
"avatar_url": "https://avatars.githubusercontent.com/u/16614?v=4"
},
{
"type": "User",
"login": "cxljs",
"commits": 42,
"avatar_url": "https://avatars.githubusercontent.com/u/24987055?v=4"
},
{
"type": "User",
"login": "andy-stark-redis",
"commits": 41,
"avatar_url": "https://avatars.githubusercontent.com/u/164213578?v=4"
},
{
"type": "User",
"login": "renovate-bot",
"commits": 22,
"avatar_url": "https://avatars.githubusercontent.com/u/25180681?v=4"
},
{
"type": "User",
"login": "htemelski-oss",
"commits": 16,
"avatar_url": "https://avatars.githubusercontent.com/u/214086837?v=4"
},
{
"type": "User",
"login": "chayim",
"commits": 15,
"avatar_url": "https://avatars.githubusercontent.com/u/1333958?v=4"
}
],
"contributors_sampled": 98,
"top_contributor_share": 0.694
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"build.yml",
"codeql-analysis.yml",
"doctests.yaml",
"golangci-lint.yml",
"govulncheck.yml",
"release-drafter.yml",
"spellcheck.yml",
"stale-issues.yml",
"test-e2e.yml",
"test-redis-enterprise.yml"
],
"has_docs_dir": false,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 10,
"reason": "all changesets reviewed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 34 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 1,
"reason": "dependency not pinned by hash detected -- score normalized to 1",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 10,
"reason": "SAST tool is run on all commits",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "11 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "5c82f57a47e097b32509ac2abd3d7c9d57f5100b",
"ran_at": "2026-07-23T18:39:55Z",
"aggregate_score": 6.8,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T09:56:26Z",
"oldest_open_prs": [
{
"number": 2255,
"created_at": "2022-10-19T07:01:15Z",
"last_comment_at": "2025-04-29T06:43:56Z",
"last_comment_author": "ndyakov"
},
{
"number": 2687,
"created_at": "2023-09-01T21:18:36Z",
"last_comment_at": "2026-06-06T02:14:18Z",
"last_comment_author": "aidandj"
},
{
"number": 2849,
"created_at": "2023-12-21T10:15:30Z",
"last_comment_at": "2026-06-25T00:28:27Z",
"last_comment_author": "github-actions"
},
{
"number": 2946,
"created_at": "2024-03-22T03:39:26Z",
"last_comment_at": "2026-05-19T13:05:08Z",
"last_comment_author": "ndyakov"
},
{
"number": 3007,
"created_at": "2024-05-31T01:46:25Z",
"last_comment_at": "2026-05-09T06:22:39Z",
"last_comment_author": "iangcarroll"
},
{
"number": 3198,
"created_at": "2024-11-25T18:25:26Z",
"last_comment_at": "2026-07-18T08:39:22Z",
"last_comment_author": "AprilFiv"
},
{
"number": 3236,
"created_at": "2025-01-15T17:07:00Z",
"last_comment_at": "2025-02-07T08:54:55Z",
"last_comment_author": "ndyakov"
},
{
"number": 3348,
"created_at": "2025-04-17T00:25:33Z",
"last_comment_at": "2025-04-17T01:46:08Z",
"last_comment_author": "khasanovbi"
},
{
"number": 3425,
"created_at": "2025-07-09T06:53:16Z",
"last_comment_at": "2026-07-18T00:18:25Z",
"last_comment_author": "github-actions"
},
{
"number": 3475,
"created_at": "2025-08-14T07:53:24Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3528,
"created_at": "2025-09-23T15:16:23Z",
"last_comment_at": "2025-09-24T10:06:19Z",
"last_comment_author": "andy-stark-redis"
},
{
"number": 3567,
"created_at": "2025-10-25T21:12:50Z",
"last_comment_at": "2026-02-18T11:58:37Z",
"last_comment_author": "Udhayarajan"
},
{
"number": 3622,
"created_at": "2025-11-27T12:48:18Z",
"last_comment_at": "2026-02-26T17:33:23Z",
"last_comment_author": "ccoVeille"
},
{
"number": 3717,
"created_at": "2026-02-23T03:50:56Z",
"last_comment_at": "2026-05-07T11:35:40Z",
"last_comment_author": "ndyakov"
},
{
"number": 3725,
"created_at": "2026-02-27T15:52:36Z",
"last_comment_at": "2026-02-28T10:57:46Z",
"last_comment_author": "yash9263"
},
{
"number": 3748,
"created_at": "2026-03-23T19:10:29Z",
"last_comment_at": "2026-03-25T13:28:08Z",
"last_comment_author": "cursor"
},
{
"number": 3765,
"created_at": "2026-04-05T11:32:40Z",
"last_comment_at": "2026-04-12T08:48:04Z",
"last_comment_author": "thani-ath-nain"
},
{
"number": 3773,
"created_at": "2026-04-11T08:31:43Z",
"last_comment_at": "2026-04-11T08:33:23Z",
"last_comment_author": "jit-ci"
},
{
"number": 3792,
"created_at": "2026-04-24T09:02:07Z",
"last_comment_at": "2026-04-24T09:02:14Z",
"last_comment_author": "jit-ci"
},
{
"number": 3793,
"created_at": "2026-04-24T09:44:08Z",
"last_comment_at": "2026-04-24T09:45:44Z",
"last_comment_author": "jit-ci"
}
],
"last_merged_pr_at": "2026-07-23T09:56:11Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 1517,
"created_at": "2020-10-05T15:40:12Z",
"last_comment_at": "2026-06-25T00:28:29Z",
"last_comment_author": "github-actions"
},
{
"number": 2024,
"created_at": "2022-02-16T08:37:07Z",
"last_comment_at": "2025-10-21T09:01:13Z",
"last_comment_author": "ndyakov"
},
{
"number": 2556,
"created_at": "2023-04-23T04:00:57Z",
"last_comment_at": "2025-12-22T10:51:49Z",
"last_comment_author": "WGH-"
},
{
"number": 2657,
"created_at": "2023-07-21T09:59:06Z",
"last_comment_at": "2026-04-21T06:17:22Z",
"last_comment_author": "ndyakov"
},
{
"number": 2896,
"created_at": "2024-02-14T13:33:58Z",
"last_comment_at": "2025-12-08T12:03:42Z",
"last_comment_author": "ndyakov"
},
{
"number": 3079,
"created_at": "2024-08-04T19:17:10Z",
"last_comment_at": "2026-07-13T19:06:17Z",
"last_comment_author": "ankit-songara"
},
{
"number": 3100,
"created_at": "2024-09-02T07:54:02Z",
"last_comment_at": "2025-10-21T11:58:50Z",
"last_comment_author": "oldme-git"
},
{
"number": 3104,
"created_at": "2024-09-04T06:35:05Z",
"last_comment_at": "2025-10-21T09:14:07Z",
"last_comment_author": "ndyakov"
},
{
"number": 3133,
"created_at": "2024-09-25T22:39:07Z",
"last_comment_at": "2025-11-18T21:25:48Z",
"last_comment_author": "thx123"
},
{
"number": 3347,
"created_at": "2025-04-17T00:25:18Z",
"last_comment_at": "2026-06-08T07:54:39Z",
"last_comment_author": "ndyakov"
},
{
"number": 3427,
"created_at": "2025-07-14T05:56:25Z",
"last_comment_at": "2025-07-14T08:48:53Z",
"last_comment_author": "htemelski-oss"
},
{
"number": 3440,
"created_at": "2025-07-20T03:43:57Z",
"last_comment_at": "2025-07-25T10:21:50Z",
"last_comment_author": "ndyakov"
},
{
"number": 3479,
"created_at": "2025-08-15T16:09:43Z",
"last_comment_at": "2025-10-25T21:22:01Z",
"last_comment_author": "zadil"
},
{
"number": 3517,
"created_at": "2025-09-12T19:40:57Z",
"last_comment_at": "2025-09-13T21:44:10Z",
"last_comment_author": "ndyakov"
},
{
"number": 3558,
"created_at": "2025-10-24T07:53:35Z",
"last_comment_at": "2025-10-24T12:44:11Z",
"last_comment_author": "ccoVeille"
},
{
"number": 3570,
"created_at": "2025-10-27T15:08:37Z",
"last_comment_at": "2025-10-28T10:00:40Z",
"last_comment_author": "ndyakov"
},
{
"number": 3574,
"created_at": "2025-10-29T17:00:10Z",
"last_comment_at": "2025-10-29T21:04:15Z",
"last_comment_author": "ndyakov"
},
{
"number": 3575,
"created_at": "2025-10-29T17:00:29Z",
"last_comment_at": "2026-02-16T14:52:29Z",
"last_comment_author": "ndyakov"
},
{
"number": 3612,
"created_at": "2025-11-24T13:45:44Z",
"last_comment_at": "2025-11-24T13:59:35Z",
"last_comment_author": "ndyakov"
},
{
"number": 3694,
"created_at": "2026-01-26T15:50:37Z",
"last_comment_at": "2026-01-26T16:29:45Z",
"last_comment_author": "ndyakov"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/redis/go-redis",
"host": "github.com",
"name": "go-redis",
"owner": "redis"
},
"metrics": {
"overall": {
"key": "overall",
"band": "good",
"name": "Overall health",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"security": 74,
"vitality": 98,
"community": 85,
"governance": 74,
"engineering": 76
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 98,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 97,
"inputs": {
"commits_last_year": 292,
"human_commit_share": 0.92,
"days_since_last_push": 0,
"active_weeks_last_year": 48
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "48/52 weeks with commits",
"points": 33.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 48
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "292 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 292
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 68,
"latest_release_tag": "v9.21.0",
"releases_from_tags": false,
"days_since_latest_release": 31,
"mean_days_between_releases": 23.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "68 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 68
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 31 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 31
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~23.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 23.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "excellent",
"name": "Community & Adoption",
"value": 85,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "excellent",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"forks": 2571,
"stars": 22197,
"watchers": 252,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "22,197 stars",
"points": 60,
"status": "met",
"details": [
{
"code": "stars",
"params": {
"count": 22197
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2,571 forks",
"points": 25,
"status": "met",
"details": [
{
"code": "forks",
"params": {
"count": 2571
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "252 watchers",
"points": 13.3,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 252
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (BSD-2-Clause)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "BSD-2-Clause"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "good",
"name": "Sustainability & Governance",
"value": 74,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 39,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 98,
"top_contributor_share": 0.694
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 69% of commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 69
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "98 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 98
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 34 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "excellent",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"merged_prs": 1582,
"open_issues": 27,
"closed_issues": 1451,
"issue_closed_ratio": 0.982,
"closed_unmerged_prs": 461
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "98% of issues closed",
"points": 45.9,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 98
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "1582/2043 decided PRs merged",
"points": 29.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 1582,
"decided": 2043
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "all changesets reviewed",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"followers": 2844,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "redis",
"public_repos": 78,
"account_age_days": 5246
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "2,844 followers of redis",
"points": 24.8,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 2844,
"login": "redis"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "78 public repos, account ~14 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 78
}
},
{
"code": "account_age_years",
"params": {
"years": 14
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/redis/go-redis/v9"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 31
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 31 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 31
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "63 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 63
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 76,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "10 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 10
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [
"go",
"golang",
"redis",
"redis-client",
"redis-cluster"
],
"has_wiki": false,
"homepage": "https://redis.io",
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://redis.io",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "5 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 5
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "good",
"name": "Security",
"value": 74,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 68,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 6.8
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "all changesets reviewed",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 34 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 1",
"points": 0.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is run on all commits",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "11 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 71 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 71
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 15,
"affected_packages": 7,
"assessed_packages": 71,
"unassessed_packages": 0,
"affected_by_severity": "critical 1, moderate 1, unknown 5",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 71,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 8
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 83,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 10574
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "92 of 92 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 92,
"sampled": 92
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 91,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile",
"doctests/Makefile"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.09,
"toolchain_manifests": [
"example/cluster-mget/go.mod",
"example/del-keys-without-ttl/go.mod",
"example/digest-optimistic-locking/go.mod",
"example/disable-maintnotifications/go.mod",
"example/hll/go.mod",
"example/hset-struct/go.mod",
"example/lua-scripting/go.mod",
"example/maintnotifiations-pubsub/go.mod",
"example/otel-metrics/go.mod",
"example/otel/go.mod",
"example/redis-bloom/go.mod",
"example/scan-struct/go.mod",
"example/search-aggregate-steps/go.mod",
"example/tls-cert-auth/go.mod",
"example/tls-connection/go.mod",
"example/zerocopy-buffer/go.mod",
"extra/rediscensus/go.mod",
"extra/rediscmd/go.mod",
"extra/redisotel-native/go.mod",
"extra/redisotel/go.mod",
"extra/redisprometheus/go.mod",
"go.mod",
"internal/customvet/go.mod"
],
"dependency_bot_commit_share": 0.08
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile, doctests/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile, doctests/Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "9 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 9,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "8 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 8,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 1",
"points": 1,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 328028,
"source_files_sampled": 323,
"oversized_source_files": 10
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "10/323 source files over 60KB",
"points": 53.3,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 323,
"oversized": 10
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"example",
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "example, examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "example, examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-23T18:40:26.652744Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/redis/go-redis.svg",
"full_name": "redis/go-redis",
"license_state": "standard",
"license_spdx": "BSD-2-Clause"
}