Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 18:40 UTC

redis / go-redis

Redis Go client

GoBSD-2-Clause★ 22.197 estrellas⑂ 2571 forksdesde jul 2012Ver en GitHub ↗

redis/go-redis tiene un índice de salud de 82 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (98/100) y la más baja, Security (74/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

82
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

82
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

RedisOrganización
2844 seguidores78 repositorios públicosdesde mar 2012

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/redis/go-redis/v9v9.21.0-63hace 31 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

98Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
33.2/36Cadencia de commits — 48/52 semanas con commits
18/18Volumen de commits — 292 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year292
human_commit_share0,92
days_since_last_push0
active_weeks_last_year48
Cómo se puntúa
27/27Publica versiones — 68 versiones publicadas
36/36Recencia de las versiones — última versión hace 31 días
27/27Cadencia de publicación — una versión cada ~23,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count68
latest_release_tagv9.21.0
releases_from_tagsno
days_since_latest_release31
mean_days_between_releases23,1
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

85Excelente · 18% del índice global
Cómo se puntúa
60/60Estrellas — 22.197 estrellas
25/25Forks — 2571 forks
13.3/15Observadores — 252 observadores
Datos de entrada utilizados
forks2571
stars22.197
watchers252
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (BSD-2-Clause)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

74Bueno · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
6.9/22.5Distribución de commits — el principal contribuyente firma el 69% de los commits
13.5/13.5Amplitud de contribuyentes — 98 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 34 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled98
top_contributor_share0,694
Cómo se puntúa
45.9/46.8Resolución de issues — 98% de issues cerradas
29.6/38.3Aceptación de PR — 1582/2043 PR decididos fusionados
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Datos de entrada utilizados
merged_prs1582
open_issues27
closed_issues1451
issue_closed_ratio0,982
closed_unmerged_prs461
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
24.8/25Alcance del propietario — 2844 seguidores de redis
25/25Trayectoria — 78 repos públicos, cuenta de ~14 años
Datos de entrada utilizados
followers2844
owner_typeOrganization
is_verified
owner_loginredis
public_repos78
account_age_days5246
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 31 días
20/20Historial de versiones — 63 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/redis/go-redis/v9
ecosystemsgo
any_deprecatedno
min_days_since_publish31

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

76Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 10 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

65Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://redis.io
10/10Descripción del repositorio
10/10Topics — 5 topics
0/10Wiki
Datos de entrada utilizados
topicsgo, golang, redis, redis-client, redis-cluster
has_wikino
homepagehttps://redis.io
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

74Bueno · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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.5Licencia — 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 — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 11 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate6,8
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories15
affected_packages7
assessed_packages71
unassessed_packages0
affected_by_severitycritical 1, moderate 1, unknown 5
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 71 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

83Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 92 de 92 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10.574
Cómo se puntúa
18/18Arranque con un solo comando — Makefile, doctests/Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 9 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 8 de los últimos 100 commits son actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile, doctests/Makefile
has_devcontainerno
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
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
53.3/55Tamaños de archivo manejables — 10/323 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes328.028
source_files_sampled323
oversized_source_files10
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — example, examples
Datos de entrada utilizados
example_dirsexample, examples
has_mcp_signalno
api_schema_files

Datos clave

22.197estrellas de GitHub
98contribuidores
292commits en los últimos 12 meses
0días desde el último push
68versiones publicadas
1factor bus
27issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 0 ★ / 2571 ⇿
0Estrellas
2571Forks
62Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

Solo se muestra el historial más reciente: este repositorio supera la ventana de recopilación, por lo que no se captura el historial más antiguo.

14001600180020002200240026002571602022-022024-052026-07
Mayor 1Menor 20Parche 23

Cada punto abarca 5 días.

OpenSSF Scorecard 6.8 / 10
6.8agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 18:39 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-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
n/dPackagingpackaging 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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities11 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 71

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 5 paquetes directos y 66 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 71 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 7 tienen avisos conocidos, de los cuales 0 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
google.golang.org/grpcv1.80.0indirectacrítica11.82.1
golang.org/x/netv0.52.0indirectamoderada91.26.3
golang.org/x/sysv0.30.0indirectadesconocida10.44.0
golang.org/x/sysv0.4.0indirectadesconocida10.44.0
golang.org/x/sysv0.42.0indirectadesconocida10.44.0
golang.org/x/sysv0.43.0indirectadesconocida10.44.0
golang.org/x/textv0.35.0indirectadesconocida10.39.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

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

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.