公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 18:40 UTC

redis / go-redis

Redis Go client

GoBSD-2-Clause★ 22,197 星标⑂ 2,571 复刻始于 2012年7月在 GitHub 上查看 ↗

redis/go-redis 的健康指数为 100 分中的 82 分,处于「良好」区间。 其得分最高的类别是Vitality(98/100),最低的是Security(74/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

82
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

82
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Redis组织
2,844 关注者78 个公开仓库始于 2012年3月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/redis/go-redis/v9v9.21.0-6331 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

98优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
33.2/36提交节奏 — 52 周中有 48 周有提交
18/18提交量 — 最近一年 292 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year292
human_commit_share0.92
days_since_last_push0
active_weeks_last_year48

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 68 个发布版本
36/36发布时效 — 最近一次发布版本于 31 天前
27/27发布节奏 — 约每 23.1 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count68
latest_release_tagv9.21.0
releases_from_tags
days_since_latest_release31
mean_days_between_releases23.1
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

85优秀 · 占总体的 18%
评分方式
60/60星标 — 22,197 个星标
25/25复刻 — 2,571 个复刻
13.3/15关注者 — 252 位关注者
所用输入
forks2,571
stars22,197
watchers252
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(BSD-2-Clause)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

74良好 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
6.9/22.5提交分布 — 头号贡献者编写了 69% 的提交
13.5/13.5贡献者广度 — 98 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 34 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled98
top_contributor_share0.694
评分方式
45.9/46.8议题解决 — 98% 的议题已关闭
29.6/38.3PR 接受 — 已裁定的 PR 中 1,582/2,043 已合并
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs1,582
open_issues27
closed_issues1,451
issue_closed_ratio0.982
closed_unmerged_prs461
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
24.8/25所有者影响力 — redis 有 2,844 位关注者
25/25既往记录 — 78 个公开仓库,账户约 14 年
所用输入
followers2,844
owner_typeOrganization
is_verified
owner_loginredis
public_repos78
account_age_days5,246
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 31 天前
20/20版本历史 — 63 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/redis/go-redis/v9
ecosystemsgo
any_deprecated
min_days_since_publish31

工程质量

基础的工程与文档实践是否到位?

76良好 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 10 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

65中等
评分方式
30/30README
0/25文档目录
15/15文档 / 主页站点 — https://redis.io
10/10仓库描述
10/10主题标签 — 5 个主题标签
0/10Wiki
所用输入
topicsgo, golang, redis, redis-client, redis-cluster
has_wiki
homepagehttps://redis.io
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

74良好 · 占总体的 16%

安全态势

68中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 34 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate6.8
已排除计分(无数据或不适用):branch_protection, packaging, signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories15
affected_packages7
assessed_packages71
unassessed_packages0
affected_by_severitycritical 1, moderate 1, unknown 5
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 71 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

83良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 92 次人类提交中有 92 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10,574
评分方式
18/18一条命令的引导启动 — Makefile, doctests/Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 9 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 8 次为自动依赖更新
1/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile, doctests/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.09
toolchain_manifestsexample/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_share0.08
评分方式
45/45可类型检查的代码 — Go(静态类型)
53.3/55可控的文件大小 — 采样的 323 个源文件中有 10 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes328,028
source_files_sampled323
oversized_source_files10

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — example, examples
所用输入
example_dirsexample, examples
has_mcp_signal
api_schema_files

关键数据

22,197GitHub 星标
98贡献者
292最近 12 个月提交数
0距最近推送天数
68发布版本数
1巴士系数(bus factor)
27开放议题
Go软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

更多细节

Star 与 Fork 历史 0 ★ / 2,571 ⇿
0Star
2,571Fork
62发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

仅显示最近的历史——该仓库超出采集窗口,因此未采集最早的历史记录。

1,4001,6001,8002,0002,2002,4002,6002,571602022-022024-052026-07
主版本 1次版本 20修订 23

每个点涵盖 5 天。

OpenSSF Scorecard 6.8 / 10
6.8综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-23 18:39 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal 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
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 34 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities11 existing vulnerabilities detected
直接依赖 5
注册表软件包版本约束清单文件
Gogithub.com/bsm/ginkgo/v2v2.12.0go.mod
Gogithub.com/bsm/gomegav1.27.10go.mod
Gogithub.com/cespare/xxhash/v2v2.3.0go.mod
Gogithub.com/zeebo/xxh3v1.1.0go.mod
Gogo.uber.org/atomicv1.11.0go.mod
全部依赖 71

来自 GitHub 依赖图的完整解析依赖集合:5 个直接依赖与 66 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
Gogithub.com/bsm/ginkgo/v2v2.12.0直接
Gogithub.com/bsm/gomegav1.27.10直接
Gogithub.com/cespare/xxhash/v2v2.3.0直接
Gogithub.com/zeebo/xxh3v1.1.0直接
Gogo.uber.org/atomicv1.11.0直接
Gogithub.com/beorn7/perksv1.0.1间接
Gogithub.com/cenkalti/backoff/v5v5.0.3间接
Gogithub.com/davecgh/go-spewv1.1.1间接
Gogithub.com/go-logr/logrv1.4.3间接
Gogithub.com/go-logr/stdrv1.2.2间接
Gogithub.com/go-redis/redis/extra/rediscmd/v88.8.2间接
Gogithub.com/go-redis/redis/extra/redisotel/v88.8.2间接
Gogithub.com/go-redis/redis/v88.4.4间接
Gogithub.com/go-redis/redis/v88.8.2间接
Gogithub.com/go-redis/redis/v8/extra/redisotel0.0.0-00010101000000-000000000000间接
Gogithub.com/golang/groupcachev0.0.0-20210331224755-41bb18bfe9da间接
Gogithub.com/golang/protobufv1.5.2间接
Gogithub.com/google/uuidv1.6.0间接
Gogithub.com/grpc-ecosystem/grpc-gateway/v2v2.28.0间接
Gogithub.com/klauspost/cpuid/v2v2.2.10间接
Gogithub.com/matttproud/golang_protobuf_extensionsv1.0.4间接
Gogithub.com/onsi/ginkgo1.15.0间接
Gogithub.com/onsi/gomega1.10.5间接
Gogithub.com/prometheus/client_golangv1.14.0间接
Gogithub.com/prometheus/client_modelv0.3.0间接
Gogithub.com/prometheus/commonv0.39.0间接
Gogithub.com/prometheus/procfsv0.9.0间接
Gogithub.com/uptrace/uptrace-gov1.41.1间接
Gogo.opencensus.io0.22.6间接
Gogo.opencensus.iov0.24.0间接
Gogo.opentelemetry.io/auto/sdkv1.2.1间接
Gogo.opentelemetry.io/contrib/instrumentation/runtimev0.68.0间接
Gogo.opentelemetry.io/contrib/processors/minsevv0.16.0间接
Gogo.opentelemetry.io/otel0.16.0间接
Gogo.opentelemetry.io/otel1.0.0-RC1间接
Gogo.opentelemetry.io/otelv1.43.0间接
Gogo.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttpv0.19.0间接
Gogo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpcv1.43.0间接
Gogo.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttpv1.43.0间接
Gogo.opentelemetry.io/otel/exporters/otlp/otlptracev1.43.0间接
Gogo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttpv1.43.0间接
Gogo.opentelemetry.io/otel/exporters/stdout0.16.0间接
Gogo.opentelemetry.io/otel/exporters/stdout/stdouttrace1.0.0-RC1间接
Gogo.opentelemetry.io/otel/exporters/stdout/stdouttracev1.43.0间接
Gogo.opentelemetry.io/otel/logv0.19.0间接
Gogo.opentelemetry.io/otel/metricv1.43.0间接
Gogo.opentelemetry.io/otel/sdk0.16.0间接
Gogo.opentelemetry.io/otel/sdk1.0.0-RC1间接
Gogo.opentelemetry.io/otel/sdkv1.43.0间接
Gogo.opentelemetry.io/otel/sdk/logv0.19.0间接
Gogo.opentelemetry.io/otel/sdk/metric0.21.0间接
Gogo.opentelemetry.io/otel/sdk/metricv1.43.0间接
Gogo.opentelemetry.io/otel/trace1.0.0-RC1间接
Gogo.opentelemetry.io/otel/tracev1.43.0间接
Gogo.opentelemetry.io/proto/otlpv1.10.0间接
Gogo.uber.org/multierrv1.9.0间接
Gogo.uber.org/zapv1.24.0间接
Gogolang.org/x/modv0.7.0间接
Gogolang.org/x/netv0.52.0间接
Gogolang.org/x/sysv0.30.0间接
Gogolang.org/x/sysv0.4.0间接
Gogolang.org/x/sysv0.42.0间接
Gogolang.org/x/sysv0.43.0间接
Gogolang.org/x/textv0.35.0间接
Gogolang.org/x/toolsv0.5.0间接
Gogoogle.golang.org/genproto/googleapis/apiv0.0.0-20260406210006-6f92a3bedf2d间接
Gogoogle.golang.org/genproto/googleapis/rpcv0.0.0-20260406210006-6f92a3bedf2d间接
Gogoogle.golang.org/grpcv1.80.0间接
Gogoogle.golang.org/protobufv1.33.0间接
Gogoogle.golang.org/protobufv1.36.11间接
Gogopkg.in/yaml.v3v3.0.1间接
依赖安全公告 7

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 71 个包,其中也包含从不交付的开发与测试版本固定:7 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
google.golang.org/grpcv1.80.0间接严重11.82.1
golang.org/x/netv0.52.0间接91.26.3
golang.org/x/sysv0.30.0间接未知10.44.0
golang.org/x/sysv0.4.0间接未知10.44.0
golang.org/x/sysv0.42.0间接未知10.44.0
golang.org/x/sysv0.43.0间接未知10.44.0
golang.org/x/textv0.35.0间接未知10.39.0

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Go.