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

451008604 / nets

一个Go语言实现的轻量、性能、实用、对新手友好的网络框架。可同时支持TCP、WS、KCP、HTTP服务

GoApache-2.0★ 2 estrellas⑂ 0 forksdesde mar 2023Ver en GitHub ↗

451008604/nets tiene un índice de salud de 44 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (83/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 8 días. Una sola persona concentra la mayor parte del trabajo reciente.

44
global / 100
En riesgo

Í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.

44
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

Mr.EricCuenta personal
2 seguidores19 repositorios públicosdesde abr 2020hz751.com

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/451008604/netsv1.2.5-13hace 8 días

Métricas por categoría

Vitalidad

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

83Bueno · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 8 días
15.2/36Cadencia de commits — 22/52 semanas con commits
18/18Volumen de commits — 180 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year180
human_commit_share1
days_since_last_push8
active_weeks_last_year22
Cómo se puntúa
27/27Publica versiones — 9 versiones publicadas
36/36Recencia de las versiones — última versión hace 8 días
27/27Cadencia de publicación — una versión cada ~28,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count9
latest_release_tagv1.2.5
releases_from_tagsno
days_since_latest_release8
mean_days_between_releases28,3
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?

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks0
stars2
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/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_contributingno
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?

35En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
3.4/25Alcance del propietario — 2 seguidores de 451008604
21.5/25Trayectoria — 19 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers2
owner_typeUser
is_verified
owner_login451008604
public_repos19
account_age_days2300
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 8 días
20/20Historial de versiones — 13 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/451008604/nets
ecosystemsgo
any_deprecatedno
min_days_since_publish8

Calidad de Ingeniería

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

38En riesgo · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 5 topics
0/10Wiki
Datos de entrada utilizados
topicstcp, wss, http, kcp, golang
has_wikino
homepage
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?

35En riesgo · 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
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0/7.5Vulnerabilities — 24 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,8
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, ci_tests, dangerous_workflow, packaging, signed_releases, token_permissions. Los pesos restantes se han renormalizado.
Cómo se puntúa
14/35Dependencias directas libres de avisos conocidos — 1 afectados: google.golang.org/protobuf v1.31.0 (high 7.5)
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
33.7/40Sin avisos pendientes — 1 paquete(s) con avisos sin atender más allá de 90 días; el más antiguo publicado hace 874 días
Datos de entrada utilizados
sourceosv
advisories39
affected_packages4
assessed_packages14
unassessed_packages0
affected_by_severitycritical 1, high 1, moderate 1, unknown 1
direct_affected_packages1
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos. Los pesos restantes se han renormalizado. Se cotejaron 14 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.

55Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 91 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,91
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod, test/client/go.mod, test/server/go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — Dockerfile, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod, test/client/go.mod, test/server/go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/27 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes12.243
source_files_sampled27
oversized_source_files0
Cómo se puntúa
40/40Esquema de API (OpenAPI/GraphQL/proto) — internal/message.proto
0/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signalno
api_schema_filesinternal/message.proto

Datos clave

2estrellas de GitHub
1contribuidores
180commits en los últimos 12 meses
8días desde el último push
9versiones publicadas
1factor bus
0issues 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

OpenSSF Scorecard 2.8 / 10
2.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-28 18:19 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
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
0Vulnerabilities24 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/451008604/shard-mapv1.2.0go.mod
Gogithub.com/gorilla/websocketv1.5.3go.mod
Gogithub.com/xtaci/kcp-gov5.4.20+incompatiblego.mod
Gogoogle.golang.org/protobufv1.31.0go.mod
Todas las dependencias 14

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

RegistroPaqueteVersiónRelación
Gogithub.com/451008604/shard-mapv1.2.0directa
Gogithub.com/gorilla/websocketv1.5.3directa
Gogithub.com/xtaci/kcp-gov5.4.20+incompatibledirecta
Gogoogle.golang.org/protobufv1.31.0directa
Gogithub.com/klauspost/cpuid/v2v2.2.8indirecta
Gogithub.com/klauspost/reedsolomonv1.12.3indirecta
Gogithub.com/pkg/errorsv0.9.1indirecta
Gogithub.com/templexxx/cpufeatv0.0.0-20180724012125-cef66df7f161indirecta
Gogithub.com/templexxx/xorv0.0.0-20191217153810-f85b25db303bindirecta
Gogithub.com/tjfoc/gmsmv1.4.1indirecta
Gogithub.com/xtaci/lossyconnv0.0.0-20200209145036-adba10fffc37indirecta
Gogolang.org/x/cryptov0.45.0indirecta
Gogolang.org/x/netv0.47.0indirecta
Gogolang.org/x/sysv0.38.0indirecta
Avisos de dependencias 4

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

PaqueteVersiónRelaciónGravedadAvisosCorregido en
golang.org/x/cryptov0.45.0indirectacrítica270.52.0
google.golang.org/protobufv1.31.0directaalta21.33.0
golang.org/x/netv0.47.0indirectamoderada91.26.3
golang.org/x/sysv0.38.0indirectadesconocida10.44.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": [
        "tcp",
        "wss",
        "http",
        "kcp",
        "golang"
      ],
      "is_fork": false,
      "size_kb": 64368,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 71595,
        "Shell": 1809,
        "Dockerfile": 196
      },
      "pushed_at": "2026-07-20T11:10:23Z",
      "created_at": "2023-03-24T19:38:45Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T11:11:19Z",
      "description": "一个Go语言实现的轻量、性能、实用、对新手友好的网络框架。可同时支持TCP、WS、KCP、HTTP服务",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "ggghq.cn",
      "name": "Mr.Eric",
      "type": "User",
      "login": "451008604",
      "company": "hz751.com",
      "location": "HangZhou",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/63437600?v=4",
      "created_at": "2020-04-10T03:28:36Z",
      "is_verified": null,
      "public_repos": 19,
      "account_age_days": 2300
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2026-07-19T19:12:22Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2026-06-29T15:10:41Z"
        },
        {
          "tag": "v1.2.3",
          "kind": "patch",
          "published_at": "2026-05-20T10:19:33Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-05-14T14:09:50Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2025-12-30T17:09:44Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2025-12-30T15:57:39Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2025-12-09T12:19:01Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2025-12-09T03:48:38Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2025-12-05T10:08:37Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "450c4eb3ff9d51c3aea4644d5dc92ac91f3f7688",
          "body": null,
          "is_bot": false,
          "headline": "feat: harden HTTP server",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-07-20T11:10:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fef1b3396138ff3f5771e8e28d2a312b06e79493",
          "body": null,
          "is_bot": false,
          "headline": "docs: refine architecture diagram layout",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-07-20T10:37:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "912ae2afe93277eb8e375b887ffafec8d75bae55",
          "body": null,
          "is_bot": false,
          "headline": "feat: support configurable slog logger",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-07-19T19:08:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bdab54f6118b72fe778ddbc5533fb2b9d9a046b",
          "body": null,
          "is_bot": false,
          "headline": "refactor(log): 引入全局 slog 替换 fmt.Printf,支持通过 AppConf.LogLevel 动态配置日志级别",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-29T15:04:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25b9ecb7379f389d0ce9928f3875351f615c99f0",
          "body": "- 在判断任务执行错误时排除 context.Canceled 错误\n- 避免错误上下文被误认为任务失败\n- 添加了 errors 包的导入以支持错误类型",
          "is_bot": false,
          "headline": "fix(pool): 修复任务执行错误判断逻辑",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-29T14:30:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a5843b3a702c6d1e23d6ee13af8a88560194866",
          "body": "- 删除TCP、WS、KCP、HTTP客户端中错误打印语句\n- 注释读取和写入时的错误日志打印,避免日志冗余\n- 在测试服务器中新增/debug接口,返回内存和运行时统计信息\n- 使用json格式化输出内存使用情况、GC次数、协程数量等数据\n- 方便调试和监控测试服务器运行状态",
          "is_bot": false,
          "headline": "refactor(test): 移除多余打印并添加内存调试接口",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-29T14:30:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e9751e96706bad02b6a94f339913de86914ef77",
          "body": "- 删除 /debug 端点及相关内存和连接统计监控代码\n- 移除对 runtime 和 os 包的依赖\n- 统一服务器启动错误日志打印方式,避免重复错误判断\n- 优化代码结构,减少冗余判断和代码复杂度",
          "is_bot": false,
          "headline": "refactor(server): 简化服务器启动和日志打印逻辑",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-29T13:50:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bca99fd419888fc65470a97c73e0c89d495f1da8",
          "body": "- Docker 基础镜像从 centos:7.9 改为 ubuntu:24.04\n- 注释掉 healthcheck 配置,简化测试流程\n- 客户端超时从 10 秒增加到 30 秒\n- 客户端连接数从 10000 调整为 5000\n- 服务端副本数从 5 增加到 10\n- 更新测试服务器错误捕获函数签名\n- 简化测试脚本,移除不必要的步骤",
          "is_bot": false,
          "headline": "test: 更新测试基础设施",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-27T11:25:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e86b080ee9105d5bc69b998cbf0731ea15b32863",
          "body": "- IErrCapture 签名从 string 改为 any,直接传递 recover 值\n- GetErrCapture 添加双重 panic 保护,防止回调函数再次 panic\n- GetErrCapture 内部打印堆栈信息,方便调试\n- GetFilter 改为直接调用并返回 bool,简化调用逻辑\n- 移除 MsgHandler 中的互操作锁,回调函数在启动前设置无需保护\n- HTTP 服务器 debug 端点仅在显式请求 gc=1 时触发 GC",
          "is_bot": false,
          "headline": "refactor: 改进错误处理机制",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-27T11:25:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "121a1d32672f1b4d3004acaaf28f31a4764e8971",
          "body": "- 移除 worker 中的 panic 恢复,改用统一的 GetErrCapture 处理\n- 移除 TotalCompleted 统计字段,减少原子操作开销\n- 简化 HashWorkerId,移除 hex 解析逻辑,统一使用 FNV-32a 哈希\n- 调整关闭顺序:先停止 WorkerPool 再等待 WaitGroup,避免死锁\n- NewWorkerPool 参数改为 uint 类型,0 值使用默认配置",
          "is_bot": false,
          "headline": "refactor: 简化 WorkerPool 实现",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-27T11:25:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34e8385b0f1b6628af2eca29428b101c963ec2dd",
          "body": "- 移除 ConnectionManager 中的 callbackMutex,回调函数在启动前设置无需保护\n- 移除 Register() 方法,HTTP 连接直接使用 Add() 简化流程\n- 移除 readerTask 池化结构,改用 DoTask 直接提交任务\n- DoTask 返回 bool 值指示任务是否成功提交\n- 移除 submitReaderTask 方法,统一使用 DoTask\n- 简化 FlowControl 限流逻辑,移除内联的连接关闭逻辑",
          "is_bot": false,
          "headline": "refactor: 简化连接管理,移除不必要的并发保护",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-27T11:25:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d71a98e85d27eac389bfb47ac82290e09311221",
          "body": "- AppConf 字段 MaxPackSize/MaxConn/WorkerTaskMaxLen/WorkerPoolSize/MaxMsgChanLen/ConnRWTimeOut 从 int 改为 uint\n- GetServerConf() 改为返回值而非指针,避免调用方误修改默认配置\n- CustomServer.AppConf 从 *AppConf 改为 AppConf\n- 所有比较处添加 int()/uint() 类型转换确保兼容性",
          "is_bot": false,
          "headline": "refactor: 配置字段类型从 int 改为 uint 提升类型安全",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-27T11:25:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b84b252abc284ee9197204f30a9a7b74b0e07ff",
          "body": null,
          "is_bot": false,
          "headline": "升级SDK版本至1.24.13",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-23T15:56:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c62bfbec397b28ef262947277957089e3e64d33",
          "body": "Three connection-management fixes:\n\n1. TCP/KCP/WS StartReader used a single conn.Read into a head-sized\n   buffer and bailed out on partial reads. net.Conn.Read is not\n   guaranteed to return the requested length, so any header split\n   across multiple kernel reads would terminate the connection\n   \n[…]\n   behavior under concurrent delete. Now collects all ids first, then\n   removes them after the Range completes — deterministic regardless\n   of the underlying map's iteration-during-delete semantics.",
          "is_bot": false,
          "headline": "fix(connection): short-read defense, callback mutex, two-phase ClearConn",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:31:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6898450c58f7ec1aed2719cb1e0360768cc17e40",
          "body": "GetServerTCP/WS/HTTP/KCP all used a non-atomic check-then-init pattern\non a package-level IServer variable. Concurrent first-callers from\nmultiple goroutines could each observe nil, allocate a fresh instance,\nand race on the package variable assignment.\n\nAligns all four getters with the sync.Once pattern already used\nelsewhere in the package (msgHandler, workerPool, connManager), so the\nfactory runs exactly once and subsequent callers see the same instance.",
          "is_bot": false,
          "headline": "fix(server): use sync.Once for all four server singletons",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:31:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "816633f272a683c9f392043ac23852a73f1dffae",
          "body": "Three WorkerPool fixes:\n\n1. Stop() used a select-default-close pattern that was not atomic; two\n   concurrent Stop calls could both pass the default branch and the\n   second close(p.done) would panic. Replaced with stopOnce.\n\n2. Stop() previously closed every per-worker channel after closing done.\n \n[…]\nesult is always non-negative before modulo.\n\nAlso adds NewWorkerPool input validation (poolSize > 0, maxTaskLen >= 0)\nto fail fast on misconfiguration instead of panicking deep inside the\nconstructor.",
          "is_bot": false,
          "headline": "fix(workerpool): stopOnce guard, no channel close, masked hash",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:31:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3101c37f0dffa43ccbd67ba0cf8a8412ab3d34b4",
          "body": "MsgHandler.apis was read by worker goroutines and written by\nAddRouter with no synchronization — any runtime router registration\nwould trigger a Go race detector hit. Adds apisMutex (RWMutex) covering\nAddRouter, GetRouter, and GetApis (which now returns a shallow copy to\nprevent callers from mutatin\n[…]\ning on the first message that hits the broken route.\n\nIntroduces a typed GetRouter(msgId) entry point that readers prefer\nover the full GetApis map copy, reducing lock contention on the hot\nread path.",
          "is_bot": false,
          "headline": "fix(msghandler): add RWMutex for apis map and filter/errCapture fields",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:30:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbff2d9975d1699d70d6147e942ed858b780f625",
          "body": "Three concurrency/lifecycle fixes touching connectionbase.go and\nservermanager.go:\n\n1. ConnectionBase.Close used atomic.AddInt32 which increments on every\n   call, risking int32 overflow that would flip IsClose back to false.\n   Replaced with CompareAndSwap(0, 1) so Close is genuinely idempotent\n   \n[…]\nutdown race where Wait could return before the Add lands (negative\ncounter panic). Same change to SetWriteDeadline now propagates errors\nand triggers connection exit instead of silently ignoring them.",
          "is_bot": false,
          "headline": "fix(connection): CAS-based Close, pool return on all exit paths",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:30:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "238eb1f60bbf69827b9bf83b7ef832554a6dfacf",
          "body": "Two HTTP short-connection bugs:\n\n1. connectionHTTP.StartWriter unconditionally called WriteHeader(StatusOK)\n   on every invocation. Handlers that SendMsg more than once would trigger\n   'http: superfluous response.WriteHeader call' warnings and have the\n   second header silently ignored. Now guarded\n[…]\nt the\n   cap. Now performs a post-Set re-check and rolls back via Delete if a\n   burst pushed the count over MaxConn. serverhttp.go handles the new\n   false return by emitting 503 Service Unavailable.",
          "is_bot": false,
          "headline": "fix(http): guard against double WriteHeader and MaxConn over-admission",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:30:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4851c40f50a6d02024caebad1e13f9238bf2930c",
          "body": "dataPack.Pack previously wrote a truncated DataLen (65535) for messages\nwhose body exceeded 65535 bytes, then copied the full body. The receiver\nwould read only 65535 bytes and misinterpret the trailing bytes as the\nnext message header, corrupting the entire subsequent stream.\n\nNow Pack returns nil for oversize payloads, matching SendMsg's existing\nnil-short-circuit and preserving stream integrity.",
          "is_bot": false,
          "headline": "fix(datapack): reject oversize payloads to prevent stream desync",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-13T09:30:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ed2e529bab5d96cf2a89b62bc1397bbe38050e0",
          "body": "Remove mergeStructValues reflection-based merge. Callers should now\nobtain defaults via GetServerConf(), mutate needed fields, then pass\nthe result to SetCustomServer. This eliminates zero-value ambiguity.",
          "is_bot": false,
          "headline": "refactor: simplify SetCustomServer by removing reflection merge",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-01T08:12:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afcde9703ec1cef98d8bcdb661ef53e6a4f6de12",
          "body": "- HTTP/WS: use http.Server.Shutdown for graceful shutdown\n- HTTP/WS: filter http.ErrServerClosed from error logs\n- HTTP: defer Remove to cleanup on StartReader panic\n- TCP/KCP: close listener on shutdown to unblock Accept",
          "is_bot": false,
          "headline": "fix: server graceful shutdown and connection cleanup",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-01T08:11:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce6ba08bb9648fa59dd375bef0ad6d2cfb8c8627",
          "body": "- Add write deadline lazy-refresh (refresh when <50% remaining)\n- Add readHandler panic recovery to prevent goroutine leak\n- Remove msgBuffChan=nil assignment (data race)\n- Add readerTask pool to reduce closure allocations\n- Add submitReaderTask for pooled task submission\n- Cache readTimeout/writeTimeout to struct fields\n- Add WS frame bounds check to prevent slice panic\n- Fix message leak on worker pool submission failure",
          "is_bot": false,
          "headline": "fix: connection layer bug fixes and performance optimization",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-06-01T08:10:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db96248332c3729403ddf8f7ddc8e4b7aa4d37ff",
          "body": "- Add nil check in RemoteAddrStr() to prevent panic\n- Remove SIGKILL from signal handler (cannot be caught)\n- Remove proto.Message nil assignment in PutMessage()\n- Add MaxPackSize default limit when configured as 0",
          "is_bot": false,
          "headline": "fix: multiple code issues",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-30T17:55:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95395dd893ad669196d22b4092a614120ab9df3e",
          "body": "- Add length validation before reading binary data\n- Prevent index out of range panic for small payloads",
          "is_bot": false,
          "headline": "fix: datapack UnPack boundary check",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-30T17:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da1734f48fc9bcde7356182b91d7b32c4a777783",
          "body": "- Ensure Close() only executes once using atomic counter\n- Remove close(msgBuffChan) from Open() defer to avoid race condition\n- Set msgBuffChan to nil instead of closing to prevent panic",
          "is_bot": false,
          "headline": "fix: send on closed channel panic",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-30T17:53:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d44be0768b051144a18a2a3f2b5372a9ca1ba42",
          "body": "- Add Register() method for short-lived connections (HTTP)\n- Register/Remove HTTP connections in serverhttp.go\n- Close HTTP request body after reading",
          "is_bot": false,
          "headline": "fix: HTTP connection resource leak",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-30T17:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8aff79ae2d2be043773aca1077b5e1c71bfe3b87",
          "body": null,
          "is_bot": false,
          "headline": "test: update Docker base images, compose config, scripts and docs",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-28T15:20:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "113c072798eb97d54ff764bdd837b69b2532a0a7",
          "body": null,
          "is_bot": false,
          "headline": "refactor(serverhttp): format JSON output with indentation",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-28T15:20:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7e639fa56702468ae5d2889db33a09e54afe626",
          "body": null,
          "is_bot": false,
          "headline": "fix(workerpool): add panic logging to recover blocks",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-28T15:20:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "862e958eeb511559b6d975ac5790347596603dc4",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor(serverhttp): use JSON marshal for stats endpoint",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T17:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a14ff555a9d994b366e22202c364c6c27aba440",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "fix: reorder select cases and update worker pool",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T17:07:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53d53af5703cefa04230f2543f3702ae2d375a12",
          "body": "- Submit/SubmitWithWorker: check p.done before sending\n- SubmitCtx/SubmitWithWorkerCtx: check ctx.Done() and p.done before sending\n- TrySubmit/TrySubmitWithWorker: check p.done before sending\n- SendMsg: check ConnCtx().Done() before sending to msgBuffChan\n\nAll select statements now use non-blocking check first pattern to\nensure cancellation signals are respected immediately.",
          "is_bot": false,
          "headline": "fix: select priority for graceful shutdown",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T10:22:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f50b70e15d3c8ab9ebdd68f979297c62f1a9036d",
          "body": "- Update test server/client to use new worker pool configuration",
          "is_bot": false,
          "headline": "test: update test examples",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:45:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca824167a3caa58dbabc28c7d5b91b536be31de6",
          "body": "- Remove unused imports across TCP/HTTP/WebSocket/KCP connections",
          "is_bot": false,
          "headline": "refactor(protocol): update protocol implementations",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8213327bcdbaa5e3b88b14f24b5ed68ecd959a3",
          "body": "- Remove unnecessary imports\n- Standardize error handling patterns",
          "is_bot": false,
          "headline": "refactor(message): clean up message handling",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:45:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1be2df54412901ae51685264c1141e899ba06ea8",
          "body": "- Update server managers to use new worker pool API\n- Remove unnecessary imports",
          "is_bot": false,
          "headline": "refactor(server): update server implementations",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:44:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "424217656481c6f8f6925b021ae1846086cb7093",
          "body": "- Update DoTask to use SubmitWithWorker with HashWorkerId\n- Ensure connection handlers execute on same worker for data consistency",
          "is_bot": false,
          "headline": "refactor(connection): use SubmitWithWorker for ordered execution",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:44:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b47fd1ee5886f6cc96729ed9942076fb674b1f2",
          "body": "- Add WorkerPoolSize and WorkerTaskMaxLen to AppConf\n- Update default values for pool configuration",
          "is_bot": false,
          "headline": "refactor(config): update worker pool configuration",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:44:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d01d7b2cba894b6e99da334b67a6061da887a843",
          "body": "…D binding\n\n- Replace RWMutex with done channel pattern for graceful shutdown\n- Add SubmitWithWorker/SubmitWithWorkerCtx for ordered execution\n- Add HashWorkerId utility for string-to-int conversion\n- Add panic recovery in worker goroutines\n- Add WorkerPoolStats for monitoring\n- Remove ErrInvalidWorker (modulo handled internally)",
          "is_bot": false,
          "headline": "feat(workerpool): refactor worker pool with done channel and worker I…",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-26T09:44:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bb7eef145ecd2a7be4bf97a52919598b6dc1b86",
          "body": "- 客户端默认连接数改为 1,便于单次调试\n- 服务端 MaxConn 提升至 1000000\n- start.sh 改为后台运行 client 并用 wait 等待,支持信号中断\n- 优化清理逻辑,仅停止 client 容器",
          "is_bot": false,
          "headline": "chore: 优化测试配置和启动脚本",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-20T10:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ef0ee045ef425beafac08072359ecae4fe03201",
          "body": "- 移除 HTTP/KCP/TCP/WS 连接构造中冗余的 propertyMutex 初始化\n- 移除未使用的 sync 包导入\n- TCP 连接移除已废弃的 bufio.Writer 缓冲层",
          "is_bot": false,
          "headline": "refactor: 清理连接实现中冗余的 propertyMutex 字段和 sync 导入",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-20T10:03:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c23b44f1ecc15eabeea4528a33bca9ca3832b002",
          "body": null,
          "is_bot": false,
          "headline": "fix: 将 isClosed 原子操作从 Open() defer 移到 Close(),修复连接关闭时序",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-20T10:03:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b31ac34ae2defc9a134fd62239065cd4fd224d1",
          "body": null,
          "is_bot": false,
          "headline": "docs: 完善功能描述,新增高性能特性说明",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-20T10:03:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d94d5ad0d6e81397ff497c031a9c28b40d6d0c0",
          "body": "- Refactor client: remove semaphore, add 10s response timeout, fix race conditions\n- Add cleanup trap in start.sh for graceful shutdown\n- Docker: increase client replicas to 10, use TCP-only for stress test\n- Reduce healthcheck retries from 10 to 3 for faster startup",
          "is_bot": false,
          "headline": "refactor(test): improve client logic and docker config",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-14T11:28:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cae9d1b225fad3a6cdb20253ae795f140cc9f4d3",
          "body": "- Remove flagSend and flagReceive stats (not used)\n- Reduce ConnRWTimeOut from 60s to 5s for faster testing\n- Downgrade dependencies to match root module",
          "is_bot": false,
          "headline": "chore(test/server): simplify stats and adjust timeout",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-14T11:28:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc35ca6a0a09a8c282fd81f24e25b36cd660c4b0",
          "body": "- Change Go version from 1.25 to 1.21 with toolchain go1.21.1\n- Downgrade protobuf, crypto, net, sys and other dependencies\n- Fix README Go version requirement from 1.25 to 1.21.1",
          "is_bot": false,
          "headline": "chore: downgrade Go to 1.21 and update dependencies",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-14T11:28:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02e0f3b1dc561ebfb46cb68ccfc4cc08b5048010",
          "body": "Expose connection context done channel for external goroutine coordination,\nreplacing direct connCtx.Done() calls with the new public method.",
          "is_bot": false,
          "headline": "feat: add ConnCtxDone() method to IConnection interface",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-14T11:28:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "822e32f4a287bd8a1991ee4e7fd03bc08dedf6b4",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-12T11:06:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c45f333cc8d5c7d18d2464fb4eb683a34c83579a",
          "body": "Enhance test/server/server.go:\n\n- Add step-by-step numbered comments\n\n- Reformat handler code for readability\n\n- Use defer pattern for response sending\n\n- Improve atomic operations formatting\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "docs(test): improve server example code comments and structure",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-12T11:04:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a1a64abc948290308d60b4ce48a193c2fbc2985",
          "body": "Streamline README.md:\n\n- Reduce detailed configuration docs\n\n- Remove directory structure section\n\n- Update quick start example\n\n- Add performance testing reference\n\n- Clean up commented-out sections\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "docs: simplify README structure and content",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-12T11:04:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb24c5a8b47524e686f6f60bf34f0d227fcd59e4",
          "body": "Remove unused guide files:\n\n- PPROF_GUIDE.md\n\n- PROJECT_ARCHITECTURE.md\n\n- assets/logo2.webp\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "chore: remove obsolete documentation files and assets",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-12T11:04:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87ea016d5fbf45f9b46206d892289cc961c2374b",
          "body": "- Refactor client.go: simplify concurrent connection handling,\n  remove intermediate client slice, inline read/write operations\n- Update docker-compose.yml: adjust healthcheck interval (2s→5s),\n  add TCP tuning sysctls (tw_reuse, fin_timeout),\n  remove http from protocol list for test clients",
          "is_bot": false,
          "headline": "refactor(test): optimize client connection logic and docker config",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-12T02:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbd4675157000011cf5aa8971c68da87d69c99ba",
          "body": "Add per-protocol connection counts (http/tcp/ws/kcp) to the /debug\nendpoint response for better observability.",
          "is_bot": false,
          "headline": "feat: add connection type statistics to debug endpoint",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-12T02:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4848ab26411adb9df7daed0bacfaf907e25fcbd2",
          "body": "- Update test server dependencies to match main module\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "chore: update test server dependencies",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:29:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1df7e5255667e1bb91a4be4142a1b24fef3ba2dd",
          "body": "- Upgrade Go from 1.24.0 to 1.25.0\n- Update shard-map to v1.2.0\n- Update protobuf to v1.36.11\n- Update reedsolomon to v1.14.0\n- Update golang.org/x packages to latest versions\n- Remove unused google/go-cmp dependency\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "chore: update Go and dependencies",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:28:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c32ad80fa3aedc41fdbd04c865d229e2d64be400",
          "body": "- Change Message.Data from string to []byte for efficiency\n- Reduce default connection count from 20000 to 1000\n- Enable container restart policy in docker-compose\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "test: optimize test client and Docker config",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:27:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "310f23c398131a07502bcb0204491a536aa5c50c",
          "body": "- Remove Message field from CustomServer (using message pool instead)\n- Add HTTP method validation to reject non-POST requests\n- Use http.StatusText for consistent error responses\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor: simplify server configuration and HTTP handling",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:27:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75b356d25cc491db47dc0a56a1fb86f4af3f524c",
          "body": "- Use GenerateConnID for consistent connection ID format across HTTP/KCP/TCP/WS\n- Apply message pool optimization to HTTP connection\n- Remove redundant RemoteAddrStr from individual implementations (now in base)\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor: unify connection implementations",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:27:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe7fe9e3c8081ad0b47270027082c5eb51c7a232",
          "body": "- Add GenerateConnID for unique hex connection identifiers\n- Remove waitGroup, simplify connection lifecycle with defer cleanup\n- Streamline Close() to only signal context cancellation\n- Optimize SendMsg with message pool for reduced allocations\n- Add RemoteAddrStr convenience method\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor: optimize connection base lifecycle",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:26:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38d11667196422450b13e219bbbd38b86ae9ba91",
          "body": "- Remove redundant NewMsgPackage constructor\n- Enhance GetDataLen to fallback to Data slice length when DataLen is 0\n- Add early return on duplicate msgId in AddRouter to prevent overwrite\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor: improve message handling",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:26:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0730c0355ebe060b9501991a81e083a6cf4016da",
          "body": "- Simplify IConnection.Close() to return void instead of bool\n- Reduce default WorkerTaskMaxLen and MaxMsgChanLen from 1000 to 100\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor: update interface and config defaults",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:26:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e068fe5a012805859dce4af6479ef105fad68d",
          "body": "Remove benchmark test files from the repository as they are being refactored to external package.\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "test: remove benchmark test files",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-11T10:26:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e25c9ca412c4c3c49284566e0f6b27af842d4b09",
          "body": "Move benchmark package from internal (nets) to external (benchmark) with\nqualified imports. Simplify Docker cleanup in start.sh by using --rmi all\nflag instead of separate docker rmi commands.",
          "is_bot": false,
          "headline": "test: refactor benchmark to external package and simplify Docker cleanup",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-08T18:22:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7d25b4c20b09e3b831538d304ff50c1515b4c0f",
          "body": "Increase WorkerTaskMaxLen and MaxMsgChanLen defaults from 100 to 1000 for\nhigher throughput. Tune KCP NoDelay and window size. Increase WebSocket\nWriteBufferSize to 64KB for better write batching.",
          "is_bot": false,
          "headline": "perf: tune default config and optimize KCP/WS buffer sizes",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-08T18:22:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44fd1bad7de3bdb080140ef5e17229635d994d65",
          "body": "Wrap TCP connection writes with a 64KB bufio.Writer to batch small writes\nand reduce syscall overhead on the hot path.",
          "is_bot": false,
          "headline": "perf: add buffered writer for TCP connections",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-08T18:21:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce8ab16b5ba8c52141575a751c9aaeca187ab6e2",
          "body": "Initialize json/proto Marshal/Unmarshal function pointers once at startup\nusing sync.Once instead of checking ProtocolIsJson config on every\nProtocolToByte/ByteToProtocol call, reducing per-message overhead.",
          "is_bot": false,
          "headline": "perf: cache protocol serialization functions with sync.Once",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-08T18:21:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15ab3f061fa7adfe9d988723fc97600a16c82a17",
          "body": "Replace sync.Pool + binary.Write/Read with direct slice allocation and\nbinary.LittleEndian.PutUint16/Uint16 operations in Pack/UnPack, eliminating\nbuffer pool overhead. Change Message.Data from string to []byte to remove\nstring<->[]byte conversion overhead in hot path.",
          "is_bot": false,
          "headline": "perf: optimize datapack with zero-alloc direct byte operations",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-05-08T18:21:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14a01e4481f8c0827db786a73bdaff7e81d82b0a",
          "body": "- Refactor test client for cleaner connection and message handling\n- Add periodic stats printing in test server\n- Remove unused Test_MsgId_Test_None handler\n- Improve send/receive counter tracking",
          "is_bot": false,
          "headline": "test: optimize test client and server",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-08T13:00:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c04c1a34e7f3156da2df255172fa64b9b9f1d15d",
          "body": "- Switch base images from debian to alpine for smaller image size\n- Add sysctl/ulimit configs for 1M+ concurrent connections\n- Enable CGO_ENABLED=0 for static cross-compilation\n- Add image cleanup step in start.sh",
          "is_bot": false,
          "headline": "test: improve Docker infrastructure for high-connection testing",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-08T13:00:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16e878979837b608a1569f2c36bb23ea1b5d00bc",
          "body": "Remove the deadTime field and connRWTimeOut() goroutine that polled\nconnection timestamps every 5s. Instead, use net.Conn.SetReadDeadline()\nin the read loop to leverage OS-level timeout, which is more efficient\nand eliminates unnecessary goroutine overhead.\n\n- Add GetNetConn() to IConnection interfa\n[…]\netDeadTime() and deadTime field from all connection types\n- Centralize conn.Close() in ConnectionBase.Close() instead of each type\n- Unify time handling to time.Now() replacing the custom getUTCTime()",
          "is_bot": false,
          "headline": "refactor: replace deadTime polling with net.Conn.SetReadDeadline",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-08T13:00:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a74a1d79ac76f750920c3e5a0d64f45459194f78",
          "body": "Add sync.Pool for bytes.Buffer in DataPack.Pack() (copied before\nreturn to guard against async msgBuffChan reuse) and for *Message in\nDataPack.UnPack(). All error paths in UnPack return messages to the\npool. Connection layers (TCP/KCP/WS/HTTP) call PutMessage after\nreaderTaskHandler completes, ensuring the message is not reused\nwhile handlers still reference it.",
          "is_bot": false,
          "headline": "perf: pool Message and bytes.Buffer to reduce per-message allocations",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-07T14:28:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7efacd525c78c2c06ff82a0b09def436976fa86",
          "body": null,
          "is_bot": false,
          "headline": "test: reduce docker-compose client replicas from 20 to 10",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-07T11:06:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b787234d4d5939fce5dd3373d7c6ff7d271644e",
          "body": "Add select on serverCtx.Done() before Accept() in TCP and KCP\nservers so that accept loops exit promptly during graceful shutdown\ninstead of blocking indefinitely on Accept().",
          "is_bot": false,
          "headline": "fix: add graceful shutdown check in server accept loops",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-07T11:06:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e2ca01ca16da88198743c3ed31a147e81ea55d7",
          "body": "When a connection exceeds ConnRWTimeOut, using Remove() ensures\nproper cleanup through the standard connection removal flow rather\nthan calling Close() directly, which skips rate-limiting callbacks\nand connection manager bookkeeping.",
          "is_bot": false,
          "headline": "fix: use Remove instead of Close for connection timeout cleanup",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-07T11:06:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "692047a9aca3ae3931a6d74b5582d7167d824f2e",
          "body": "- Extract getUTCTime() helper to replace scattered time.Now() calls\n- Add sync.WaitGroup to ConnectionBase to ensure read/write handlers\n  exit before task goroutine closes\n- Initialize deadTime in all connection constructors (HTTP/WS/KCP/TCP)\n- Set deadline before closing TCP/KCP/WS connections to unblock pending I/O\n- Remove redundant waitGroup zero-value initialization in ServerManager",
          "is_bot": false,
          "headline": "refactor: unify time handling and improve connection lifecycle safety",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-07T11:05:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4378689fb9ea87a2bddeaa36e775544514768fb6",
          "body": "- Increase client replicas from 4 to 20 for higher load testing\n\n- Simplify step numbering from 4 steps to 3 steps in start.sh\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "test: update Docker test configuration and simplify startup script steps",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-06T12:21:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8eda10fb8f08278958245bf5c8c35973851e1c7",
          "body": "… for KCP close\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "fix: close request body on rejected HTTP connections and set deadline…",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-05-06T12:20:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13bc4148306aacc6f745a7085ded7bde96db4928",
          "body": "将 serverhttp.go 和 test/client/client.go 的换行符规范化为 Unix 格式 (LF)",
          "is_bot": false,
          "headline": "style: normalize line endings to LF",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-30T08:48:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b3882c4729b62acc345529571143f8a0e7069d8",
          "body": "- 重构 docker-compose.yml:\n  - 将服务重命名为 server_big/server_small 和 client_big/client_small\n  - 使用 replicas 批量启动客户端\n  - 添加对照组配置\n  - 调整端口映射(6060→16060, 26060)\n- 延长 ConnRWTimeOut 从 30 到 60 秒\n  - 分布式压力测试时避免连接被过早关闭",
          "is_bot": false,
          "headline": "test: update docker-compose config and server timeout",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-30T08:47:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98df4d3d2a64e9522b538ab1f21aff31053da3b1",
          "body": "删除 Close() 方法中重复的 GetInstanceConnManager().Remove(c.conn) 调用\n避免连接管理器的重复清理操作",
          "is_bot": false,
          "headline": "fix: remove redundant connection removal in Close()",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-30T08:47:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e7f44c8d642eb524a36afa2584a6ce52a671bdb",
          "body": "- Enable multi-protocol testing (tcp, ws, http, kcp)\n\n- Increase test connection count to 10000\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "chore(test): update Docker compose test configuration",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-04-29T17:14:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd82a47e8186075e879cc3c726a6161c9d007538",
          "body": "- Close connection immediately after receiving response\n\n- Reduce log output frequency threshold\n\n- Remove redundant connection cleanup code\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "refactor(test): optimize client connection handling",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-04-29T17:14:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a266b6a766ea4a69fbf5142c75cd255adbe361a",
          "body": "- Increase ConnRWTimeOut from 10 to 30 seconds\n\n- Remove CGO_ENABLED=1 from build script\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "chore(test): update server timeout and build configuration",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-04-29T17:14:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4940b591160221c126478f0bee1145ca3b903a2",
          "body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
          "is_bot": false,
          "headline": "feat: improve /debug endpoint with GC trigger and formatted JSON output",
          "author_name": "Mr.Eric",
          "author_login": "451008604",
          "committed_at": "2026-04-29T17:13:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a666f29665d4759b4c9061642167a84e5ef7bb1f",
          "body": "- Add comprehensive guide for Go performance profiling\n- Include usage examples for pprof tool integration",
          "is_bot": false,
          "headline": "docs: add pprof performance profiling guide",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-29T14:02:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "431bfcd88ef59b486eb6b63e6a81f778dcff4b71",
          "body": "- Expand docker-compose with multi-service configuration\n- Simplify start.sh script by removing complex options\n- Update default test parameters",
          "is_bot": false,
          "headline": "chore(test): update docker compose and startup script",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-29T14:02:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7289a57a7b5c0d79bb109f8c44588572140e92ef",
          "body": "- Simplify test client by removing memtest and complex modes\n- Change default protocol from tcp to kcp\n- Update default connection count to 20000\n- Fix message structure to use JSON tags\n- Add error logging for connection failures\n- Remove unused imports and complex test scenarios",
          "is_bot": false,
          "headline": "refactor(test): major client test tool overhaul",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-29T14:02:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5036c2b9b9fe93fb922792ee3291dff612a9f17c",
          "body": "- Update msgId handling and message structure\n- Clean up test server code",
          "is_bot": false,
          "headline": "refactor(test): simplify test server configuration",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-29T14:01:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5558b913655899a6c2c4349a7093cc286f2fec49",
          "body": "- Fix message packing in connectionhttp.go to properly handle msgId\n- Clean up formatting in serverhttp.go",
          "is_bot": false,
          "headline": "fix: improve HTTP connection message handling",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-29T14:01:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2992525e617163ed2a16d225441f962fa2ff3b9",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove compiled binary files from test directory",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-29T14:01:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14d35553a04247040b4a859a0920e492dfb35d14",
          "body": null,
          "is_bot": false,
          "headline": "Add /debug endpoint to HTTP server for memstats",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-28T18:01:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b12661ede39cec4d3f4c7e32cc7477e4f4660f80",
          "body": null,
          "is_bot": false,
          "headline": "Add /debug endpoint to HTTP server for memstats",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-28T16:13:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b9a484f2cb140b5c9cba3e37c44042ef17758fd",
          "body": "…sting",
          "is_bot": false,
          "headline": "Merge memtest.go into client.go: add -memtest flag for memory leak te…",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-28T16:06:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54ff373b0c3ecaef9fb4f8250abfe3028b9e5c8a",
          "body": null,
          "is_bot": false,
          "headline": "test: wait for client completion in start.sh",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-25T17:06:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35a6cffa6bf3d8269d4579ec0b3fb9374fa4d654",
          "body": null,
          "is_bot": false,
          "headline": "test: fix client.go for proper test result output",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-25T16:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f3984f5edb3889798069e55dc4743be40b70998",
          "body": null,
          "is_bot": false,
          "headline": "修正步骤编号为[1/4]->[4/4]",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-25T15:34:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "012e666e2a712991bffe8f81d05c45f03ef1db8d",
          "body": null,
          "is_bot": false,
          "headline": "修正步骤编号[1/5]->[4/5]",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-25T15:33:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50741991c23351c225880267dee3bfe033a5c8bf",
          "body": "- 移除无用的二进制检查步骤\n- 移除docker logs的-f参数\n- 清理多余空行",
          "is_bot": false,
          "headline": "简化start.sh脚本",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-25T15:30:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc2053542accd40b7aa1db42036f8a84d0ed18b8",
          "body": "- HTTP客户端Write时保存响应数据到respBuf\n- HTTP客户端Read时从respBuf返回数据\n- 添加sync.Mutex保护并发访问",
          "is_bot": false,
          "headline": "修复HTTP客户端响应读取,确保短连接也能正确计数",
          "author_name": "451008604",
          "author_login": "451008604",
          "committed_at": "2026-04-25T15:23:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 9,
      "commits_last_year": 180,
      "latest_release_at": "2026-07-19T19:12:22Z",
      "latest_release_tag": "v1.2.5",
      "releases_from_tags": false,
      "days_since_last_push": 8,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 28.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/451008604/nets",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/451008604/nets",
          "is_deprecated": false,
          "latest_version": "v1.2.5",
          "repository_url": "https://github.com/451008604/nets",
          "versions_count": 13,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T19:08:10Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 2,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [
        "internal/message.proto"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod",
        "test/client/go.mod",
        "test/server/go.mod"
      ],
      "largest_source_bytes": 12243,
      "source_files_sampled": 27,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.45.0",
            "severity": "critical",
            "ecosystem": "go",
            "cvss_score": 10,
            "advisory_ids": [
              "GHSA-45gg-vh54-h5m9",
              "GHSA-5cgq-3rg8-m6cv",
              "GHSA-78mq-xcr3-xm33",
              "GHSA-89gr-r52h-f8rx",
              "GHSA-9m57-25v3-79x9",
              "GHSA-f5wc-c3c7-36mc",
              "GHSA-jppx-rxg9-jmrx",
              "GHSA-q4h4-gmj2-qvw2",
              "GHSA-qpw4-5x99-6vjp",
              "GHSA-rm3j-f69w-wqmq"
            ],
            "fixed_version": "0.52.0",
            "advisory_count": 27,
            "oldest_advisory_days": 67
          },
          {
            "name": "google.golang.org/protobuf",
            "direct": true,
            "version": "v1.31.0",
            "severity": "high",
            "ecosystem": "go",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-8r3f-844c-mc37",
              "GO-2024-2611"
            ],
            "fixed_version": "1.33.0",
            "advisory_count": 2,
            "oldest_advisory_days": 874
          },
          {
            "name": "golang.org/x/net",
            "direct": false,
            "version": "v0.47.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": 81
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.38.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5024"
            ],
            "fixed_version": "0.44.0",
            "advisory_count": 1,
            "oldest_advisory_days": 66
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1,
          "unknown": 1,
          "critical": 1,
          "moderate": 1
        },
        "advisory_count": 39,
        "affected_count": 4,
        "assessed_count": 14,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/451008604/shard-map",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.0"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/xtaci/kcp-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.4.20+incompatible"
        },
        {
          "name": "google.golang.org/protobuf",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.31.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/451008604/shard-map",
            "direct": true,
            "version": "v1.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/gorilla/websocket",
            "direct": true,
            "version": "v1.5.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/xtaci/kcp-go",
            "direct": true,
            "version": "v5.4.20+incompatible",
            "ecosystem": "go"
          },
          {
            "name": "google.golang.org/protobuf",
            "direct": true,
            "version": "v1.31.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/klauspost/cpuid/v2",
            "direct": false,
            "version": "v2.2.8",
            "ecosystem": "go"
          },
          {
            "name": "github.com/klauspost/reedsolomon",
            "direct": false,
            "version": "v1.12.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/pkg/errors",
            "direct": false,
            "version": "v0.9.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/templexxx/cpufeat",
            "direct": false,
            "version": "v0.0.0-20180724012125-cef66df7f161",
            "ecosystem": "go"
          },
          {
            "name": "github.com/templexxx/xor",
            "direct": false,
            "version": "v0.0.0-20191217153810-f85b25db303b",
            "ecosystem": "go"
          },
          {
            "name": "github.com/tjfoc/gmsm",
            "direct": false,
            "version": "v1.4.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/xtaci/lossyconn",
            "direct": false,
            "version": "v0.0.0-20200209145036-adba10fffc37",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.45.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/net",
            "direct": false,
            "version": "v0.47.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.38.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 14,
        "direct_count": 4,
        "indirect_count": 10
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "451008604",
          "commits": 317,
          "avatar_url": "https://avatars.githubusercontent.com/u/63437600?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not 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 0 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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "24 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "450c4eb3ff9d51c3aea4644d5dc92ac91f3f7688",
        "ran_at": "2026-07-28T18:19:24Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T11:10:24Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/451008604/nets",
    "host": "github.com",
    "name": "nets",
    "owner": "451008604"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 44,
      "inputs": {
        "security": 35,
        "vitality": 83,
        "community": 24,
        "governance": 35,
        "engineering": 38
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 180,
              "human_commit_share": 1,
              "days_since_last_push": 8,
              "active_weeks_last_year": 22
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 8 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "180 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 180
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 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": 9,
              "latest_release_tag": "v1.2.5",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 28.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~28.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 28.3
                    }
                  }
                ],
                "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": 8,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 8 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 35,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "451008604",
              "public_repos": 19,
              "account_age_days": 2300
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "2 followers of 451008604",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "451008604"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "19 public repos, account ~6 yr old",
                "points": 21.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 19
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/451008604/nets"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "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 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "13 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 38,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [
                "tcp",
                "wss",
                "http",
                "kcp",
                "golang"
              ],
              "has_wiki": false,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "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": "at_risk",
        "name": "Security",
        "value": 35,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "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 0 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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "24 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "moderate",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 14 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"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 14
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "source": "osv",
              "advisories": 39,
              "affected_packages": 4,
              "assessed_packages": 14,
              "unassessed_packages": 0,
              "affected_by_severity": "critical 1, high 1, moderate 1, unknown 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: google.golang.org/protobuf v1.31.0 (high 7.5)",
                "points": 14,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "google.golang.org/protobuf v1.31.0 (high 7.5)"
                    }
                  }
                ],
                "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": "1 advisory-carrying package(s) unaddressed past 90 days; oldest published 874 days ago",
                "points": 33.7,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_stale",
                    "params": {
                      "days": 90,
                      "count": 1,
                      "oldest": 874
                    }
                  }
                ],
                "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": 14,
              "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": 2
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 55,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.91,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "91 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 91,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod",
                "test/client/go.mod",
                "test/server/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod, test/client/go.mod, test/server/go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod, test/client/go.mod, test/server/go.mod"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 12243,
              "source_files_sampled": 27,
              "oversized_source_files": 0
            },
            "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": "0/27 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 27,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": false,
              "api_schema_files": [
                "internal/message.proto"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "internal/message.proto",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "internal/message.proto"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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-28T18:19:28.450315Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/4/451008604/nets.svg",
  "full_name": "451008604/nets",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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.