Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 2.5.0 · 2026-07-29 00:41 UTC

zendev-sh / goai

Go AI SDK, the Go way. One unified API across 21+ providers. Streaming, structured output, MCP support, stdlib only. Go AI SDK for AI applications inspired by Vercel AI SDK.

GoMIT★ 171 estrellas⑂ 24 forksdesde mar 2026Ver en GitHub ↗
TipoBibliotecacómo se determina

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

78
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

78
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas 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.

El resultado global ponderado 67 se calibra a 78 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

zendev.shOrganización
5 seguidores3 repositorios públicosdesde feb 2026

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/zendev-sh/goaiv0.9.2-46hace 0 días

Métricas por categoría

Vitalidad

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

86Excelente · 21% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
11.8/36Cadencia de commits — 17/52 semanas con commits
18/18Volumen de commits — 224 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_year224
human_commit_share0,84
days_since_last_push0
active_weeks_last_year17
Cómo se puntúa
27/27Publica versiones — 46 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~5,8 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count46
latest_release_tagv0.9.2
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases5,8
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?

62Moderado · 17% del índice global
Cómo se puntúa
36.2/60Estrellas — 171 estrellas
11.3/25Forks — 24 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks24
stars171
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
readme_badges
has_contributing
has_issue_templateno
has_code_of_conductno
readme_badge_services
has_pull_request_template

Sostenibilidad y Gobernanza

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

59Moderado · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
2.5/22.5Distribución de commits — el principal contribuyente firma el 89% de los commits
13.5/13.5Amplitud de contribuyentes — 10 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled10
top_contributor_share0,89
Cómo se puntúa
42/42Resolución de issues — 100% de issues cerradas
26.7/30Aceptación de PR — 97/109 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
6/15OpenSSF Scorecard: Code-Review — Found 12/30 approved changesets -- score normalized to 4
Datos de entrada utilizados
merged_prs97
open_issues0
closed_issues21
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs12
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
5.6/25Alcance del propietario — 5 seguidores de zendev-sh
5.3/25Trayectoria — 3 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers5
owner_typeOrganization
is_verified
owner_loginzendev-sh
public_repos3
account_age_days165
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 46 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/zendev-sh/goai
ecosystemsgo
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

81Excelente · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 4 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

100Excepcional
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://goai.sh/
10/10Descripción del repositorio
10/10Topics — 19 topics
10/10Wiki
Datos de entrada utilizados
topicsai, ai-agents, ai-tools, llm, sdk-go, ai-sdk, anthropic, azure-op, bedro, cerebra, gemini, minimax, openai, openrouter, vercel, vertex-ai, go-ai-sdk, goai, zenflow
has_wiki
homepagehttps://goai.sh/
has_readme
has_docs_dir
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?

37Débil · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 12/30 approved changesets -- score normalized to 4
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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 — sin datos
0/5SAST — sin datos
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate3,7
Excluidos de la puntuación (sin datos o no aplicable): dangerous_workflow, packaging, pinned_dependencies, sast, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

79Bueno · 4% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
15/15Documentación legible por máquinas (llms.txt) — llms.txt presente
40/40Historial de commits legible — 84 de 84 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4968
Cómo se puntúa
18/18Arranque con un solo comando — Makefile, bench/Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
2/10Práctica demostrada con agentes — 1 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfileno
typed_language
bootstrap_filesMakefile, bench/Makefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,01
toolchain_manifestsbench/go/go.mod, examples/langfuse/go.mod, examples/otel/go.mod, go.mod, observability/langfuse/go.mod, observability/otel/go.mod
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
51.6/55Tamaños de archivo manejables — 13/210 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes212.337
source_files_sampled210
oversized_source_files13
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

171estrellas de GitHub
10contribuidores
224commits en los últimos 12 meses
0días desde el último push
46versiones publicadas
1factor bus
0issues abiertas
Go, npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

Historial de estrellas y forks 0 ★ / 24 ⇿
0Estrellas
24Forks
43Versiones

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

048121620242422026-032026-052026-07
Mayor 0Menor 5Parche 38
OpenSSF Scorecard 3.7 / 10
3.7agregado

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-29 00:40 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
4Code-ReviewFound 12/30 approved changesets -- score normalized to 4
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
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/dPackaginginternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
n/dPinned-Dependenciesinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
n/dSASTinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-Permissionsinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
1Vulnerabilities9 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Gogo.uber.org/goleakv1.3.0go.mod
Gogolang.org/x/oauth2v0.36.0go.mod
npmlucide-vue-next^0.577.0package.json
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "ai",
        "ai-agents",
        "ai-tools",
        "llm",
        "sdk-go",
        "ai-sdk",
        "anthropic",
        "azure-op",
        "bedro",
        "cerebra",
        "gemini",
        "minimax",
        "openai",
        "openrouter",
        "vercel",
        "vertex-ai",
        "go-ai-sdk",
        "goai",
        "zenflow"
      ],
      "is_fork": false,
      "size_kb": 23178,
      "has_wiki": true,
      "homepage": "https://goai.sh/",
      "languages": {
        "Go": 3209182,
        "Shell": 19464,
        "Makefile": 1829,
        "TypeScript": 9056
      },
      "pushed_at": "2026-07-28T21:02:32Z",
      "created_at": "2026-03-17T21:57:16Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T21:03:18Z",
      "description": "Go AI SDK, the Go way.  One unified API across 21+ providers. Streaming, structured output, MCP support, stdlib only. Go AI SDK for AI applications inspired by Vercel AI SDK.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "zendev.sh",
      "type": "Organization",
      "login": "zendev-sh",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/261401316?v=4",
      "created_at": "2026-02-13T10:32:24Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 165
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-28T21:00:18Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-27T11:34:10Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-20T10:30:49Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-07-08T10:07:27Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-06-20T12:26:55Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-06-12T03:54:31Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-06-08T01:47:52Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-06-07T12:29:24Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-06-07T09:23:23Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-07T02:09:05Z"
        },
        {
          "tag": "v0.7.11",
          "kind": "patch",
          "published_at": "2026-05-30T23:02:10Z"
        },
        {
          "tag": "v0.7.10",
          "kind": "patch",
          "published_at": "2026-05-28T23:57:13Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-05-28T23:20:54Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-05-27T23:25:40Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-05-16T23:03:17Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-05-08T10:24:59Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-05-07T10:10:13Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-05-03T11:01:24Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-04-27T05:43:17Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-04-23T03:18:30Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-04-19T01:35:06Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-19T00:13:58Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-04-15T03:50:47Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-04-13T23:47:15Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-04-12T09:39:26Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-04-10T03:46:59Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-04-09T03:09:02Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-04-08T21:44:27Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-04-07T08:26:40Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-04-05T07:21:09Z"
        },
        {
          "tag": "v0.5.10",
          "kind": "patch",
          "published_at": "2026-04-04T10:24:32Z"
        },
        {
          "tag": "v0.5.9",
          "kind": "patch",
          "published_at": "2026-04-04T08:46:22Z"
        },
        {
          "tag": "v0.5.8",
          "kind": "patch",
          "published_at": "2026-04-02T07:51:00Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2026-04-02T02:21:38Z"
        },
        {
          "tag": "v0.5.6",
          "kind": "patch",
          "published_at": "2026-04-02T02:02:18Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2026-04-01T23:38:12Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-03-31T01:59:28Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-03-30T09:11:23Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-03-29T12:22:01Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-03-27T02:51:06Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-26T11:19:05Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-25T10:49:57Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-24T05:39:41Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-23T07:57:02Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-23T03:59:41Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-17T22:06:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9ee1031a674c6d636bfe941212f76941c473a7d7",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-28T21:02:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f84e7c70598a22d7f948056786ae0e0f4ef34f64",
          "body": "DiscoverAuth now follows the full MCP authorization discovery chain:\n- reads the resource_metadata pointer from the WWW-Authenticate 401 challenge (RFC 9728 §5.1)\n- probes the path-aware protected-resource well-known (.../oauth-protected-resource/{path})\n- fetches AS metadata from openid-configurati\n[…]\nn, the openid-configuration\nfallback in both forms, and the non-answers that must fall through: a\nProtected Resource document with no authorization_servers, and an empty array.\nPackage coverage 95.9%.",
          "is_bot": false,
          "headline": "feat(mcp): follow the full OAuth discovery chain",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T20:59:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3291adcaa7b2d90477f5237a09f9381f59b66671",
          "body": "Responses can return several summary segments under one reasoning item,\ntold apart by summary_index. The deltas of each segment carry no separator:\nthe boundary exists only in that index. Concatenating them therefore runs two\nsummaries together, and since each one tends to open with a bold title, th\n[…]\ny, a lone\nsummary, a second reasoning item starting clean, a first index that is not\nzero, deltas with no reasoning item to track, and that reasoningId still\nreports the index. Package coverage 98.8%.",
          "is_bot": false,
          "headline": "fix(openai): keep the boundary between reasoning summaries",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T20:59:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17765c647bcf82980d08bf44697f6d2b9a3303cb",
          "body": "Gemini's function_declarations validator rejects \"const\", so it was dropped\nalong with the other unsupported keywords. Dropping it also drops the\nconstraint: a schema that pinned a field to one value now accepts anything of\nthat type, and the model is free to fill it in wrongly.\n\n\"const\" has an exac\n[…]\n a type gets \"string\", which Gemini requires alongside an enum.\n\nThis shows up with MCP tool schemas and discriminated unions, where a const\ntag is what tells the model which variant it is filling in.",
          "is_bot": false,
          "headline": "fix(gemini): rewrite schema \"const\" to a single-value \"enum\"",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9efb630eac0183bad974253e8c2a5f02cef43d8",
          "body": "response.function_call_arguments.delta finalized the call as soon as the\naccumulated buffer parsed as JSON, and then reset that buffer. This assumes\nthe delta that completes the object is the last one for the call. It usually\nis, but nothing guarantees it: any delta that follows -- down to a trailin\n[…]\nbeing dropped.\n\nThe added test drives a delta after the arguments already parse: it emitted\ntwo calls before this change and one after, plus the cancellation path of the\nflush. Package coverage 98.8%.",
          "is_bot": false,
          "headline": "fix(openai): emit a Responses tool call once, not per valid buffer",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "686527a4def192da6228645fcd9cad99f2e60921",
          "body": "The Gemini API reports thinking separately in thoughtsTokenCount, and\ntotalTokenCount is prompt + candidates + thoughts. Subtracting thoughts from\ncandidatesTokenCount double-counts them: once thoughts outgrow the answer the\nsubtraction goes negative and OutputTokens clamps to 0, so a reasoning-heavy\nturn reports no output at all.\n\nOutput now maps to candidatesTokenCount directly. ReasoningTokens already\ncarries thoughtsTokenCount, so nothing is lost.",
          "is_bot": false,
          "headline": "fix(google): count output tokens as candidatesTokenCount",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33aea297efcca5a356bd97cbb3a7a39a8c47f82a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T11:36:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c9b39b8d22bb87de3ad586480ce1e9795c0b428",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.10.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T11:33:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f67a9929bab8afa06dae73dbadadbccd1c1ffad",
          "body": "Anthropic's prompt caching accepts a `ttl` on the ephemeral cache_control\nmarker, selecting a 5-minute or 1-hour cache lifetime. The SDK always\nemitted the bare marker, so callers were pinned to the 5m default and had\nno way to opt into the 1h TTL, which is the better trade for long-lived\nsystem pro\n[…]\ncaching.go propagation,\nthe option-to-params plumbing, and an end-to-end mock-server check that\nthe TTL reaches the wire. Patch coverage 100%; package coverage unchanged\n(root 97.6%, anthropic 98.0%).",
          "is_bot": false,
          "headline": "feat(anthropic): configurable ephemeral cache TTL (5m/1h)",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-27T11:24:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42ed186f1e6e4624919bf9af22920cf42d242cb5",
          "body": "A single SSE delta can carry both reasoning and content fields at the\nreasoning-to-answer transition (observed with GLM via NVIDIA NIM).\nParseStream processed content first, which inverts the logical order:\nreasoning must always precede the answer it produces.\n\nThe result is a corrupted chunk order \n[…]\ned for deltas\ncarrying only one of the two fields, which is the common case.\n\nAdds TestParseStream_ReasoningBeforeTextInCombinedDelta, which fails on\nthe previous ordering and passes with this change.",
          "is_bot": false,
          "headline": "fix(openaicompat): emit reasoning before text within a combined delta",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-27T11:24:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "869e50543b0451f66064583d7091c96bce45aaaa",
          "body": "- Add v0.9.0 (file upload) to README, docs/index, ROADMAP, homepage\n- Add FileUpload/RemoteRef to API types docs and capabilities tables\n- Add file upload notes to OpenAI/Anthropic/Google/Compat provider docs\n- Fix '22+ providers' → '25+ providers' in LLM context files\n- Add .vibeflow, *.out, docs/drift-report to .gitignore\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix: docs drift audit — file upload docs, homepage, gitignore (#116)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-20T21:00:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eea8799e3421b1d03480970e92edb4ac5017ea3a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T10:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b790921317a3875c19a04531fade2fbab0df1396",
          "body": "…enAI, Anthropic, Gemini) (#115)\n\n- Add FileUpload, RemoteFileRef, FileUploader, FileUploadCapableModel to provider/types.go\n- Add Part.RemoteRef and ModelCapabilities.FileUpload\n- Add ErrFileUploadUnsupported sentinel error\n- OpenAI: multipart upload to /v1/files, RemoteRef → file_id in Responses A\n[…]\nm RemoteRef.Data → inline base64 (no behavioral change)\n- 100% coverage on all new code (unreachable Go stdlib multipart error paths excluded)\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "feat: add provider-neutral file upload and remote file references (Op…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-20T10:28:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d023d6cda69eff78edd5624bf0fedbd2f42e88d",
          "body": "…tion (#112) (#113)",
          "is_bot": false,
          "headline": "fix: OpenRouter reasoning dropped (#111) and server-tool loop termina…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-08T10:03:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40eb6dfff92b007e2388aab234e0485ccd3fefeb",
          "body": "…tion (#112)\n\n#111: Add reasoning field fallback to openaicompat for OpenRouter\n- Add Reasoning field to streaming Delta and non-streaming Message structs\n- Fall back to delta.reasoning / message.reasoning when reasoning_content is empty\n- OpenRouter emits reasoning under reasoning, not reasoning_co\n[…]\nlel for server-executed tools (nothing to execute)\n- Preserve reasoning in continuation messages for server-tool steps\n- Enter streamWithToolLoop when provider-defined tools exist even without Execute",
          "is_bot": false,
          "headline": "fix: OpenRouter reasoning dropped (#111) and server-tool loop termina…",
          "author_name": "Dev Admin",
          "author_login": null,
          "committed_at": "2026-07-08T07:29:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0ff039ca03ba71159ab7569de53382bd302c056",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README and roadmap for v0.8.5",
          "author_name": "B",
          "author_login": "vietanh85",
          "committed_at": "2026-06-21T08:18:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4920e1a14b239303b1816d43055838465e22f596",
          "body": null,
          "is_bot": false,
          "headline": "feat(errors): enhance error handling for embedded error messages (#110)",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-20T21:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b48faf7d22a370ab892e04fd5078866ef96a71e",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.5",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-20T12:26:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8563bccfc795b13558f089e9d3b913cbcc8de56e",
          "body": "…07) (#109)\n\nBuffer.com MCP server rejects tools/call when the arguments field is\nabsent. CallTool now initializes nil args to an empty map and always\nserializes arguments as an object.\n\nAlso fixes a flaky test (race/mid-loop-error-monotonic-step) that\nasserted pollers must observe every intermediate step value, which is\nnot guaranteed when the error path completes synchronously.\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix: ensure CallTool sends arguments as {} instead of omitting it (#1…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-20T12:23:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "053026ccdb7c154d4a2577924052e06dea066e7d",
          "body": "…Max/default from schemas (#108)\n\nGemini's function_declarations API rejects JSON Schema keywords like\npropertyNames, patternProperties, const, exclusiveMinimum,\nexclusiveMaximum, and default. MCP tool schemas (e.g. firecrawl) commonly\ncarry these, causing 'Unknown name' errors.\n\nAdd all six to the existing strip list in sanitizeImpl alongside\nadditionalProperties and format.\n\nFixes zendev-sh/zenflow#14\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix(gemini): strip propertyNames/patternProperties/const/exclusiveMin…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-20T11:55:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0108fb761bb688c8348fd987a2bf842e428102a1",
          "body": "Requesty (https://requesty.ai) is an OpenAI-compatible LLM gateway. This adds a\nnative provider package mirroring the existing openrouter provider, built on\ninternal/openaicompat -- a /chat/completions endpoint at\nhttps://router.requesty.ai/v1, provider/model model naming, and the same\noptional HTTP\n[…]\nrified: go build ./..., go test ./... (100% coverage on the new package),\ngo vet, golangci-lint (0 issues), gofmt clean. Also live-tested against\nhttps://router.requesty.ai/v1 with openai/gpt-4o-mini.",
          "is_bot": false,
          "headline": "feat: add Requesty provider (#106)",
          "author_name": "Thibault Jaigu",
          "author_login": "Thibaultjaigu",
          "committed_at": "2026-06-20T11:05:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd18d60a359a5bf940910ff04bd446ce497c09b1",
          "body": "… (#105)\n\nNative structured-output mode (structuredOutputMode=\"outputFormat\")\nemitted the schema as the top-level output_format request field, which\nthe Messages API now rejects: \"output_format: This field is deprecated.\nUse 'output_config.format' instead.\"\n\nbuildRequest now nests the schema under o\n[…]\ntptest handlers use only non-fatal\nassertions so a missing field can no longer panic the handler goroutine\ninto a client-side EOF.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(anthropic): send native structured output as output_config.format…",
          "author_name": "Claudiu",
          "author_login": "claudiunicolaa",
          "committed_at": "2026-06-19T12:32:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6e2fc69c7ce90ac0624d7e69af14824386dbd47",
          "body": null,
          "is_bot": false,
          "headline": "Add Reasoning field to stepResult (#103)",
          "author_name": "Kadir Gün",
          "author_login": "kadirgun",
          "committed_at": "2026-06-15T07:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54c8c5dcd64db58b519bb3a738ffdbfdb7e8f0a8",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct YAML indentation in zenflow-review workflow (#100)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-13T05:59:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7294c6817f7c35a4b982fe572355c3c75cf24583",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.4",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-12T03:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "016e5f7156d9caf38fd38b486e45af73935d09ce",
          "body": "Replace GEMINI_API_KEY with FPT_API_KEY for the zenflow-review action.\nModel changed from gemini-2.0-flash to Qwen3.6-27B.",
          "is_bot": false,
          "headline": "chore: switch zenflow-review to FPT provider (Qwen3.6-27B) (#99)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-12T03:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf9e3608f37d33e57e6dab88a8faa9bf9442aab9",
          "body": "Add WithRetryObserver callback that fires before each retry attempt,\nallowing callers to log or observe retry progress (attempt, error, delay).\n\n- New RetryObserver type and WithRetryObserver option\n- Observer invoked in withRetry loop before sleep\n- All call sites in generate, object, embed pass observer through\n- Tests for observer invocation and GenerateText integration",
          "is_bot": false,
          "headline": "feat: expose retry steps via RetryObserver (#95) (#98)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-12T03:51:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4358effc4344ef2a39e4900fdf05681b628ea77",
          "body": "Add tests for the branches introduced in #96 that codecov/patch flagged:\n- complete valid-JSON args buffered before the name, flushed on start\n- the four TrySend context-cancel early-return paths in ParseStream\n\nBrings patch coverage of the streamed tool-call refactor to 100%.",
          "is_bot": false,
          "headline": "test(openaicompat): cover split tool-call stream patch lines (#97)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-11T12:51:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc66bec53741da19136f738da073268810f9cfc5",
          "body": "* fix: preserve split tool call stream metadata\n\n* fix: stabilize streamed tool call IDs",
          "is_bot": false,
          "headline": "fix: preserve split tool call stream metadata (#96)",
          "author_name": "Sebastian Legarraga",
          "author_login": "slegarraga",
          "committed_at": "2026-06-11T11:57:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74908a92ff793f54490e668b1a3c0b20fc49e98c",
          "body": "Add a redacted_thinking case to the Anthropic streaming switch so the encrypted block (delivered whole in content_block_start) is surfaced as a ChunkReasoning with redactedData metadata and can be replayed on the next turn. Also passes through the adaptive thinking display option.\n\nOriginal work by Nehme Roumani (@nehmeroumani), superseding #93. Adds a coverage test for the context-cancel branch.",
          "is_bot": false,
          "headline": "fix(anthropic): capture redacted_thinking blocks in streaming (#94)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-08T22:56:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f1d8092da460a021b4ba84414f0126228ee4d54",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-08T01:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7d93751f8d83277f73b24462d12e0ddf0d13405",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.3",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-08T01:45:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8466eedbdf233f44829836f298abb4bd10d5f243",
          "body": "Replace the compat layer with a native /api/chat and /api/embed implementation using net/http. Adds think mode, JSON mode via the format field, reasoning via the native thinking field, bounded reads, and typed HTTP errors. No third-party Ollama SDK; go.mod stays at 1.25.",
          "is_bot": false,
          "headline": "provider/ollama: native API with think mode, no third-party SDK (#92)",
          "author_name": "Bruno Clermont",
          "author_login": "bclermont",
          "committed_at": "2026-06-08T01:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df831fb3420f24ce7d3ef95b37db21c388457021",
          "body": "Validate tool name uniqueness in buildToolMap across all tools and all four entry points (GenerateText, StreamText, GenerateObject, StreamObject); transition AgentState to idle on the StreamText validation error.",
          "is_bot": false,
          "headline": "fix: detect duplicate tool names across tool entry points (#91)",
          "author_name": "Bruno Clermont",
          "author_login": "bclermont",
          "committed_at": "2026-06-08T01:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b82078ae915f2a59b7842091d35ba9d85a2ebb71",
          "body": "The codecov-action uploader aborts before uploading because importing\nCodecov's PGP public key returns no data (\"no valid OpenPGP data found\"),\nso the SHA256SUM signature check fails with \"No public key\". This is an\nupstream issue in the uploader's key fetch, unrelated to coverage or the\ntoken, and it fails CI on every PR.\n\nSet skip_validation: true so the uploader skips the binary integrity\ncheck and proceeds to upload. Uploads remain authenticated via\nCODECOV_TOKEN.",
          "is_bot": false,
          "headline": "ci: skip codecov uploader GPG validation",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T21:59:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f48788632eb8bb4c9d6a5df6b8202e72d1d80ec",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T12:29:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccbf1bc6b8c0a512c45b9d005d3a786a12325af1",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.2",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T12:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e104924c9a0ec299f16c3723c236a7bfeaccedd",
          "body": "…… (#90)\n\n* fix(provider): populate ToolName on synthetic orphan tool results for Google AI\n\n* fix(provider): add synthetic orphan tool result test and cloneMessages function for improved message handling\n\n* fix(provider): preserve Message.ProviderOptions in cloneMessages\n\ncloneMessages rebuilt Mess\n[…]\ny message lost ProviderOptions, breaking\nanthropic message-level cache control. Copy the whole struct, then clone\nthe Content slice.\n\n---------\n\nCo-authored-by: vietanh85 <vietanh.nguyen.it@gmail.com>",
          "is_bot": false,
          "headline": "fix(provider): populate ToolName on synthetic orphan tool results for…",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-07T12:25:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2af4a72277e7e216630835053707cc87a3cf2974",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T09:23:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0be968d8ce773f9fb4ff15c72702a49d131023a7",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.1",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T09:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72481862b459b81e7b3683dddcb605e24b270426",
          "body": "…(#89)\n\nThe Responses API error-event handler overwrote the flat message/code\nwith the nested error object unconditionally, so a partial nested object\n(e.g. a nested code with no message) clobbered a flat message with an\nempty string and lost the detail. Fall back per-field with cmp.Or:\nprefer nested when set, otherwise keep the flat value. Follow-up to #88.",
          "is_bot": false,
          "headline": "fix(openai): preserve flat error fields when nested error is partial …",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T09:11:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c6afa81146919d88042a375ec0a5eb9780979a1",
          "body": "… events (#88)",
          "is_bot": false,
          "headline": "fix(openai): handle nested error fields in Responses API stream error…",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-07T08:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a4ab94972b9e0ea5400ec3321035d6ccf27d3f",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T02:09:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a13785d92f353e8c56a73e61d6936cff05b795b",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.0",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T02:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f82a2e5c89d440893343c2243df66e568e5ae600",
          "body": "… (#87)\n\nNewTool[In](name, description, execute) builds a Tool from a typed input\nstruct: the JSON Schema is generated via SchemaFrom and the model's raw\narguments are unmarshaled into In before execute runs, so callers no\nlonger hand-write JSON Schema or unmarshal input (issue #83).\n\nMigrate all ex\n[…]\n NewTool, keeping the raw goai.Tool struct form\ndocumented for hand-written schemas and provider-defined tools. Also bump\nexample model ids from gemini-2.0-flash to gemini-3-flash-preview.\n\nCloses #83",
          "is_bot": false,
          "headline": "feat: add NewTool typed constructor and adopt it across examples/docs…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T01:56:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab9a84e0af9d390f59eda1e412c73e6c0e8b84e8",
          "body": "* feat: surface hook and predicate panics instead of swallowing them\n\nLifecycle hooks and the StopWhen predicate previously ran inside a\nrecover that printed the panic to stderr and discarded it, so callers\ncould not intercept it and observability handlers never saw it.\n\nAdd an OnPanic observability\n[…]\nl\") and reported to OnPanic instead of being\nre-raised as an uncaught panic, so a panic carrying sensitive data is not\nprinted to stderr as a crash dump. Threads o.OnPanic through the five\ncall sites.",
          "is_bot": false,
          "headline": "feat: surface hook and predicate panics instead of swallowing them (#85)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T01:18:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8e46fe59897d0e4e53059426c29c9b4fdc00ad3",
          "body": "…#86)\n\nThe FPT Smart Cloud key for Qwen3.6-27B is rejected (401 Invalid API\nKey), so the review step failed on every run. Switch the reviewer model\nto google/gemini-3-flash-preview, reading GEMINI_API_KEY.",
          "is_bot": false,
          "headline": "ci: switch zenflow-review to Google Gemini (gemini-3-flash-preview) (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T00:24:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c30bd4542c1dd6cdf34b8b2a9e8bb52804d5ef16",
          "body": "Delete the compiled example executables (agent-loop, chat, tools,\nstreaming) that were accidentally committed to the repo root, ignore\nthem in .gitignore, and add a pre-commit check that rejects any staged\nfile whose content is a compiled executable or shared library.\n\nCloses #81",
          "is_bot": false,
          "headline": "fix: remove committed binaries and block them in pre-commit (#84)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-06T22:52:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "336ba79ea944da2761e19c3cf267c0a455d50c91",
          "body": null,
          "is_bot": false,
          "headline": "feat(mcp): native OAuth 2.1 + PKCE for remote MCP servers (#80)",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-06-06T07:08:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ed3e19f80d9ff5b7db831659619c1aacf71720",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.11",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-30T23:01:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c1f3327c778052731adef8e8f13adac946fb030",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.11",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-30T22:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "537d60512b969c5907864a7e238b29c8f91f5a6a",
          "body": "* feat: add llama.cpp server provider\n\nAdd provider/llamacpp package for connecting to llama.cpp server\n(OpenAI-compatible API at http://localhost:8080).\n\n- Chat() and Embedding() constructors\n- Options: WithBaseURL, WithHeaders, WithHTTPClient\n- 12 unit tests, 100% coverage\n- Follows ollama/vllm convenience wrapper pattern\n\n* fix: validate URL scheme is http or https in WithBaseURL",
          "is_bot": false,
          "headline": "feat: add llama.cpp server provider (#77)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-30T22:51:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d3820e117af8fba4c253b2b62e059fdd3b0093f",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.10",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:55:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1979fdff8ca82eadee36990a780c7c7032a2a6da",
          "body": "…#74) (#76)\n\nPer MCP Streamable HTTP spec (2025-03-26), the GET-for-SSE channel is\nOPTIONAL; a server that does not offer it SHOULD return 405. Our\nHTTPTransport.Start treated any non-200 as fatal, so servers like Zoho\nMCP failed with \"SSE connection failed: HTTP 405\". Treat 405 and 404\nas \"POST-only\" and keep the transport usable; POST responses already\ndispatch inline JSON-RPC / SSE results.",
          "is_bot": false,
          "headline": "fix(mcp): HTTPTransport tolerates POST-only Streamable HTTP servers (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:53:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73abb9e287a839e2af1571abeffb6c147aa978de",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.9",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:18:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "523097c2f495df5187199a5815ca278c82536c11",
          "body": "The Responses API stream used bufio.Scanner with a 1MiB cap, so very\nlong output_text.delta or reasoning events still failed with\n\"bufio.Scanner: token too long\" after #73 (which only fixed\ninternal/sse). Switch streamResponses to sse.Scanner and add a\nNextLine method that returns raw event-typed SSE lines while keeping\nthe 16MiB MaxLineSize bound.",
          "is_bot": false,
          "headline": "fix(openai): handle Responses API SSE lines larger than 1MiB (#70) (#75)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:14:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b57bd142c85a25aac30600bbe34fb9738dbbda3",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.8",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-27T23:23:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d51745caa057e8f1ec5711c63f7b12c9deb9bcbd",
          "body": "* fix(sse): handle SSE lines larger than 1MiB\n\nSwitch the SSE scanner from bufio.Scanner (capped at 1MiB) to\nbufio.Reader.ReadString, which grows as needed. Long data lines (e.g.\nlarge tool-call argument deltas or reasoning blocks) no longer fail\nwith \"bufio.Scanner: token too long\". Also strip trai\n[…]\ncious or buggy upstream to force unbounded client allocation. Add\na 16 MiB hard limit (large enough for real-world tool-call argument\ndeltas and reasoning blocks) and surface oversize lines via Err().",
          "is_bot": false,
          "headline": "fix(sse): handle SSE lines larger than 1MiB (#70) (#73)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-27T23:08:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "331a3af59548d7fa7ee5d0c080274392a303e929",
          "body": "…k thinking-mode multi-turn round-trips (#72)",
          "is_bot": false,
          "headline": "openaicompat: echo reasoning_content on assistant messages so DeepSee…",
          "author_name": "tenjinfactory",
          "author_login": "tenjinfactory",
          "committed_at": "2026-05-27T22:03:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e9647d29e21d68865218e932acfb74e9c9a117",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.7",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-16T23:03:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fa1f4a0c9c9fa97ab1215da403088eff656efb3",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.7",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-16T23:01:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1a5b4c19f1221fdd418442ec8494eea2d09c16d",
          "body": "* fix(openai): rename max_tokens by model, not reasoning_effort\n\nReasoning models (o-series, gpt-5+, codex) reject the max_tokens\nparameter and require max_completion_tokens. The rename was gated on a\nreasoning_effort provider option being present, so a caller that set\nWithMaxOutputTokens without re\n[…]\nreview on #69 flagged isReasoningModel being duplicated in\ninternal/openaicompat and provider/openai. Export it as\nopenaicompat.IsReasoningModel and have provider/openai consume the\nsingle definition.",
          "is_bot": false,
          "headline": "fix(openai): rename max_tokens by model, not reasoning_effort (#69)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-16T23:00:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7020860f6ea14626f0fe9c8fff622b8657fddbb",
          "body": "One-line note under \"Submit a PR\" so contributors know maintainers\ncan run the AI code review on demand, pointing at the workflow file\nfor details.",
          "is_bot": false,
          "headline": "docs(contributing): mention /zenflow-review trigger (#65)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T10:07:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e86c5a6b5818b21aab941f7febc9d720a7eb68a9",
          "body": "Without --sandbox, --yolo, or --allow, zenflow denies every tool call\non a non-interactive terminal. First smoke test (issue_comment run\n25853651887 on PR #65) failed because:\n\n- review-idioms and review-security could not call `read` (warning\n  only; their diff is also injected via contextFiles so \n[…]\ned and the \"Post review comment\" step exited 1\n\n--sandbox pre-allows the safe tool set (read, write, grep, glob) and\nexplicitly blocks bash, which matches what the three reviewer agents\nactually need.",
          "is_bot": false,
          "headline": "fix(zenflow-review): pass --sandbox to grant tool permissions (#66)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T09:59:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8666ce44f544bbf08f4a1eefd2692e906c2c9e18",
          "body": "Adds a two-reviewer (Go idiomatics + security) AI code review\nworkflow powered by zenflow v0.1.5 and FPT Smart Cloud's Qwen3.6-27B\n(JP region, 262K context).\n\nTrigger: a maintainer (OWNER / MEMBER / COLLABORATOR) posts a\n`/zenflow-review` comment on the PR. The action fetches the diff,\nruns two revi\n[…]\nrtifacts (diff.patch, events.ndjson, review.md)\n\nSetup: requires `FPT_API_KEY` org-level secret (FPT Smart Cloud JP\nmarketplace API key). Default GITHUB_TOKEN covers diff fetch and PR\ncomment posting.",
          "is_bot": false,
          "headline": "ci(zenflow-review): add comment-triggered AI PR review workflow (#64)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T09:48:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f5f1daa5eaf6155d69968fa5029820bbbb6bc48",
          "body": null,
          "is_bot": false,
          "headline": "docs: point README Orchestration link to zenflow repo",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T10:18:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "220bb077b379e04dad4351ca354fc323a2c34a94",
          "body": "…ME header",
          "is_bot": false,
          "headline": "docs: promote zenflow to top-level Orchestration link in nav and READ…",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T10:17:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "926612fcb0a4c43114624357c358329a90d35bf5",
          "body": "Add zenflow to the GoAI homepage and README so readers building agents\nhave a natural next step beyond a single MaxSteps loop. Two touchpoints:\na one-line bullet in the features list and a Companion Projects section.\nREADME links target the zenflow repo; docs site links the zenflow site.",
          "is_bot": false,
          "headline": "docs: introduce zenflow as companion project on home and README",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T09:50:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "123bbffbdd0915ba5d451de0cc9f479762cc3138",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore .zencode and testdata, drop tracked artifacts",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T10:47:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "479c787e0b74477dc5be012d390566b497566076",
          "body": "* chore: roadmap entry for v0.7.6\n\n* chore: update versions.json for v0.7.6",
          "is_bot": false,
          "headline": "chore: release v0.7.6 (#63)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T10:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1fdf10c4fa561c54ae645e0320cf68cf29def2f",
          "body": "Mirrors the goai SDK link that zenflow's docsite already exposes.",
          "is_bot": false,
          "headline": "docs: add zenflow link to nav Links menu (#62)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T07:53:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bb120c8ddee006bcd2a4ce09ba6612e5971394f",
          "body": "…alls (#61)\n\n* fix(anthropic,openai,bedrock,core): round-trip server-executed tool calls\n\nProvider-executed tools (Anthropic web_search/code_execution/web_fetch/mcp,\nOpenAI Responses web_search_call/file_search_call/code_interpreter_call/\nimage_generation_call/local_shell_call/mcp_call/computer_call\n[…]\nat:\n\n- Default base URL when WithBaseURL is omitted.\n- Cross-region inference profile region override.\n- base.RoundTrip error propagation.\n- Body sent without anthropic_beta when no betas are present.",
          "is_bot": false,
          "headline": "fix(anthropic,openai,bedrock,core): round-trip server-executed tool c…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T03:51:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3543cdf0d81bf067e4e578f57981542dc7bcce55",
          "body": "…#58)\n\nThe ChunkToolCallDelta TrySend cancel branch added in #57 lacked\ntest coverage. Add nested cancel tests that exercise the new return\npath in both adapters, and (for openai-responses) a test that lets\nthe delta succeed and cancels at the final ChunkToolCall TrySend.",
          "is_bot": false,
          "headline": "test(openai,cohere): cover cancel path on streaming tool-call delta (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dfd32443e949d18e42feea017e1bcc501776cc8",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.5",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-07T10:10:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99d8f3160b29275a5e81df9394e2ac73cc290fe1",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.5",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9df2503ca913ba5c42ec9ecae2d14f578bf1ac1e",
          "body": "…ming (#57)\n\nThe openai-responses and cohere streaming adapters buffered tool-call\nargument fragments internally and only emitted ChunkToolCall once the\naccumulated buffer parsed as JSON (or at done/end). Consumers wanting\nprogressive rendering of large tool inputs (e.g. write/edit content)\nsaw a lo\n[…]\ning consumers are unaffected and new ones can render progress.\n\nAligns these two adapters with anthropic, bedrock-converse, and the\nshared openaicompat codec, which already forward deltas. Closes #56.",
          "is_bot": false,
          "headline": "fix(openai,cohere): forward ChunkToolCallDelta during tool-call strea…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:01:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d352b962310b05cf1f9f9ab0428b3921668ed3b3",
          "body": "Consumers importing observability/langfuse and observability/otel as\nseparate Go modules need per-submodule tags (<path>/vX.Y.Z) for go get\nto resolve. Tag every sub-module with its own go.mod at the root tag's\ncommit, excluding internal-only paths (examples/*, bench/*).",
          "is_bot": false,
          "headline": "ci(release): tag Go sub-modules at root tag commit (#55)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T23:40:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64a791349dd797956e2093239e3323de16784461",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.4",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-03T11:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72a32a9bc656cb4924b8e54ba63fbd7bd2b8643e",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.4",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T10:59:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc0938adbfb723d44bdc8e8ecb014242135749e0",
          "body": "* fix(azure): drop api-version query on v1 GA path\n\nAzure's v1 GA spec removed the dated `api-version` parameter; sending\nit on `/openai/v1{path}` is rejected by spec-strict resources with\n\"API version not supported\" (observed on gpt-5.5). The legacy\ndeployment-based path still requires it, so api-v\n[…]\n legacy\n  deployment-based path\n- URL Format section spells out the v1 GA contract, the api-version\n  rejection from spec-strict resources, and when to opt back into the\n  legacy deployment-based path",
          "is_bot": false,
          "headline": "fix(azure): drop api-version query on v1 GA path (#54)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T10:59:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e308dc447951187ab631071818ddaec2cc8f8dc5",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb7cf6772ef5655dc9fa7a41c6a4e630e0727268",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.3",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "512eb7c69fb0da06473de55903181a01b8cc585f",
          "body": "* feat: surface reasoning text on TextResult and StepResult\n\nAdds a Reasoning field to provider.GenerateResult, goai.StepResult,\nand goai.TextResult so callers can render extended-thinking output\nwithout digging into ProviderMetadata. Wired through Bedrock's\nnon-streaming Converse parser and through\n[…]\nult_ReasoningSummary to lock the\nnon-streaming path that concatenates reasoning.summary entries into\nGenerateResult.Reasoning. Closes the patch-coverage gap reported by\ncodecov on the previous commit.",
          "is_bot": false,
          "headline": "feat: surface reasoning text on TextResult and StepResult (#53)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2ae1739b938c8ae517cfd28ee0e7436b281be36",
          "body": "- update 24+ to 25+ across README, compare, architecture, getting-started, providers index, vitepress meta\n- dedupe NVIDIA NIM row in README; mark nvidia E2E as Full; add NVIDIA to providers-and-models list\n- types.md: add StopCause, ToolResult; add ToolResults to StepResult; add StoppedBy to StreamChunk; reorder TextResult/ObjectResult/Embed fields to match code\n- nvidia.md: note 100-value embedding batch limit",
          "is_bot": false,
          "headline": "docs: bump provider count to 25+ and refresh type/nvidia docs (#52)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-24T04:36:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3bdb3c67fe05181f03a115c9188aad8c9f892c7",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove accidental binary file nvidia.test",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cca8932ecd93ff278b28c232da7486355f88a6c",
          "body": "docs: update homepage for v0.7.2",
          "is_bot": false,
          "headline": "Merge pull request #51 from zendev-sh/docs/homepage-v0.7.2",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab969885ddf3e5f58eab9fa722fd6a96101af05d",
          "body": null,
          "is_bot": false,
          "headline": "docs: update homepage for v0.7.2 and add NVIDIA logo",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:34:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d93bad98e224e9268cc5f14a3a8adc358f61927",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-23T03:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5fba307c5cb2ce32c4d2db57c3e1718b4c311fe",
          "body": "feat: add NVIDIA NIM provider (v0.7.2)",
          "is_bot": false,
          "headline": "Merge pull request #50 from zendev-sh/feat/nvidia-provider",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:15:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77b8d521345da4b8b72136735201fae471f06d59",
          "body": null,
          "is_bot": false,
          "headline": "merge: resolve conflicts with main",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac54ca942bf28c79285628a1312a7d86b82ce2d8",
          "body": "…thropic, add nvidia tests",
          "is_bot": false,
          "headline": "fix: test failures - env vars in Google tests, ProviderMetadata in An…",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:08:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14210a1c9355177b84000be1e4e67e2ad24eeae9",
          "body": null,
          "is_bot": false,
          "headline": "feat: add NVIDIA NIM provider (v0.7.2)",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T01:29:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62348ff6f40b3fd6f8e55ae30675783ff43b7387",
          "body": null,
          "is_bot": false,
          "headline": "fix: test failures",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T01:25:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32a80270afbc59d216f671043a85a028979db337",
          "body": "Adds a concepts page covering the full tool-loop lifecycle: StepKind\nprogression (Starting → LLMInFlight → StepFinished → ToolExecuting →\nIdle, plus terminal Done/Cancelled/Error), Observe polling, safe sync\npoints for StreamText vs GenerateText, the SetTerminal CAS protocol,\nand WithStopWhen semant\n[…]\nafety, aliasing\ncontract, stream StoppedBy).\n\nAdds WithStopWhen and WithStateRef entries to the options reference\nwith pointers into the concepts page. Adds the new page to the\nsidebar under Concepts.",
          "is_bot": false,
          "headline": "docs: document AgentState, WithStateRef, WithStopWhen (#49)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T23:37:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8d7f70f9358d549a51b07d6fa7b8e64306cf91e",
          "body": "* feat: add terminal StepKinds and SetTerminal CAS on AgentState\n\nIntroduce StepDone/StepCancelled/StepError as sticky terminal states\ndistinct from StepIdle. SetTerminal(kind) uses CAS so the first caller\nwins and the step counter is preserved across the transition. Intended\nfor consumers (e.g. zen\n[…]\ns IsTerminal() helper and covers: per-kind transition, stickiness,\nnil receiver no-op, panic on non-terminal arg, and concurrent single-\nwinner race.\n\n* test: cover String() for new terminal StepKinds",
          "is_bot": false,
          "headline": "feat: add terminal StepKinds and SetTerminal CAS on AgentState (#48)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T23:33:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e56d09f06f04df31612e453899f362982bf0f5d",
          "body": "* feat: add AgentState, WithStopWhen, ToolResult, and StopCause\n\n- AgentState + WithStateRef: race-free, atomically-packed (kind, step)\n  observable into the tool loop lifecycle, with a monotonic step counter\n  preserved across error paths.\n- WithStopWhen: Vercel-parity StopCondition evaluated after\n[…]\nAllBranches mirrors the StateRef test\n  to cover the StreamObject and default switch arms.\n- ToolResult.UnmarshalJSON gains a type-mismatch case that exercises\n  the inner json.Unmarshal error return.",
          "is_bot": false,
          "headline": "feat: add AgentState, WithStopWhen, ToolResult, StopCause (#47)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T10:03:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d89a1e93f1e004849072b3d91e7f98c155bc9c9a",
          "body": null,
          "is_bot": false,
          "headline": "chore: update versions.json and roadmap for v0.7.1",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T01:34:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a846a8ee13472d2b9f843c6a9f638a06912f40c8",
          "body": "… (#46)\n\n* refactor(openaicompat): extract NewChatModel / NewEmbeddingModel factories\n\nAbsorbs the common boilerplate (options wiring, HTTP dispatch, token\nresolution, env-var fallback plumbing) from 14 OpenAI-compat provider\npackages into shared factories in internal/openaicompat.\n\nPer-provider fil\n[…]\nactory has direct tests in internal/openaicompat/factory_test.go.\nAll 14 refactored providers at 100% statement coverage; factory at 99%.\n\n* test(openaicompat): cover io.ReadAll error paths in factory",
          "is_bot": false,
          "headline": "refactor(openaicompat): extract shared factories for chat + embedding…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T01:34:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9aa01ed8fd07095c0ba139d95d69ff53068d1129",
          "body": null,
          "is_bot": false,
          "headline": "fix(homepage): nested anchor in v0.7.0 release card breaking layout",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T00:23:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a5687653b17bef8ce51ab8538a8c078edc6ec3a",
          "body": "* feat: add Cloudflare Workers AI and FPT Smart Cloud providers\n\nBoth providers use the OpenAI-compatible Chat Completions and Embeddings\nendpoints with full unit test coverage (92% and 94%) and E2E verification\nagainst real APIs.\n\n- provider/cloudflare: chat + embeddings, builds URL from CLOUDFLARE\n[…]\n\nAdds tests for uncovered branches flagged by codecov/patch: embedding WithHeaders, connection errors, invalid JSON parsing, stream HTTP error, stream PromptCaching branch, and embeddingModel.ModelID.",
          "is_bot": false,
          "headline": "feat: add Cloudflare Workers AI and FPT Smart Cloud providers (#45)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T00:13:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 46,
      "commits_last_year": 224,
      "latest_release_at": "2026-07-28T21:00:18Z",
      "latest_release_tag": "v0.9.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 5.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/zendev-sh/goai",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/zendev-sh/goai",
          "is_deprecated": false,
          "latest_version": "v0.9.2",
          "repository_url": "https://github.com/zendev-sh/goai",
          "versions_count": 46,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-28T20:59:57Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 24,
      "stars": 171,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-27",
            "count": 2
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          },
          {
            "date": "2026-07-25",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 24,
        "total_forks": 24
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "bench/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "bench/go/go.mod",
        "examples/langfuse/go.mod",
        "examples/otel/go.mod",
        "go.mod",
        "observability/langfuse/go.mod",
        "observability/otel/go.mod"
      ],
      "largest_source_bytes": 212337,
      "source_files_sampled": 210,
      "oversized_source_files": 13,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4968
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "go.uber.org/goleak",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "golang.org/x/oauth2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.36.0"
        },
        {
          "name": "lucide-vue-next",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.577.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 97,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 21,
        "closed_unmerged_prs": 12
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "vietanh85",
          "commits": 170,
          "avatar_url": "https://avatars.githubusercontent.com/u/547198?v=4"
        },
        {
          "type": "User",
          "login": "DevLumuz",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/124409412?v=4"
        },
        {
          "type": "User",
          "login": "nehmeroumani",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/10393081?v=4"
        },
        {
          "type": "User",
          "login": "oscarbc96",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/4248262?v=4"
        },
        {
          "type": "User",
          "login": "bclermont",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/474302?v=4"
        },
        {
          "type": "User",
          "login": "claudiunicolaa",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/15197275?v=4"
        },
        {
          "type": "User",
          "login": "kadirgun",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1864516?v=4"
        },
        {
          "type": "User",
          "login": "slegarraga",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/64795732?v=4"
        },
        {
          "type": "User",
          "login": "Thibaultjaigu",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/84420566?v=4"
        },
        {
          "type": "User",
          "login": "tenjinfactory",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/250921212?v=4"
        }
      ],
      "contributors_sampled": 10,
      "top_contributor_share": 0.89
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "docs.yml",
        "release.yml",
        "zenflow-review.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 4,
            "reason": "Found 12/30 approved changesets -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "9ee1031a674c6d636bfe941212f76941c473a7d7",
        "ran_at": "2026-07-29T00:40:43Z",
        "aggregate_score": 3.7,
        "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-28T21:02:34Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-28T20:59:58Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/zendev-sh/goai",
    "host": "github.com",
    "name": "goai",
    "owner": "zendev-sh"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 67 is calibrated to 78 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 67,
            "calibrated": 78,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 78,
      "inputs": {
        "security": 37,
        "vitality": 86,
        "community": 62,
        "governance": 59,
        "calibration": "2026-08-02",
        "engineering": 81,
        "ai_readiness": 79,
        "weighted_overall_raw": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 224,
              "human_commit_share": 0.84,
              "days_since_last_push": 0,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "224 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 224
                    }
                  }
                ],
                "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": "exceptional",
            "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": 46,
              "latest_release_tag": "v0.9.2",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 5.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "46 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.8
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 62,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "weak",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "forks": 24,
              "stars": 171,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "171 stars",
                "points": 36.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 171
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "24 forks",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 59,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 10,
              "top_contributor_share": 0.89
            },
            "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 89% of commits",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "10 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 86,
            "inputs": {
              "merged_prs": 97,
              "open_issues": 0,
              "closed_issues": 21,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 12,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "97/109 decided PRs merged",
                "points": 26.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 97,
                      "decided": 109
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 12/30 approved changesets -- score normalized to 4",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "weak",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "followers": 5,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "zendev-sh",
              "public_repos": 3,
              "account_age_days": 165
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "5 followers of zendev-sh",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "zendev-sh"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~0 yr old",
                "points": 5.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/zendev-sh/goai"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "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 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "46 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai",
                "ai-agents",
                "ai-tools",
                "llm",
                "sdk-go",
                "ai-sdk",
                "anthropic",
                "azure-op",
                "bedro",
                "cerebra",
                "gemini",
                "minimax",
                "openai",
                "openrouter",
                "vercel",
                "vertex-ai",
                "go-ai-sdk",
                "goai",
                "zenflow"
              ],
              "has_wiki": true,
              "homepage": "https://goai.sh/",
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://goai.sh/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "19 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 37,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, SAST, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "sast",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 3.7
            },
            "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": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 12/30 approved changesets -- score normalized to 4",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "exceptional",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4968
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 84 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 84
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "bench/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [
                "bench/go/go.mod",
                "examples/langfuse/go.mod",
                "examples/otel/go.mod",
                "go.mod",
                "observability/langfuse/go.mod",
                "observability/otel/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, bench/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, bench/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": 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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 212337,
              "source_files_sampled": 210,
              "oversized_source_files": 13
            },
            "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": "13/210 source files over 60KB",
                "points": 51.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 210,
                      "oversized": 13
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library"
      ],
      "labels": [
        "library"
      ],
      "scores": {
        "library": 5
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 3
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "low",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T00:41:00.380446Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/z/zendev-sh/goai.svg",
  "full_name": "zendev-sh/goai",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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 v2.5.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.