Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 13:30 UTC

Kevinrob / guzzle-cache-middleware

A HTTP Cache for Guzzle 6. It's a simple Middleware to be added in the HandlerStack.

PHPMIT★ 435 estrellas⑂ 80 forksdesde jun 2015Ver en GitHub ↗

Kevinrob/guzzle-cache-middleware tiene un índice de salud de 59 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (65/100) y la más baja, Security (42/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

59
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

Kevin RobatelCuenta personal
50 seguidores6 repositorios públicosdesde may 2013@qoqa

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
Packagistkevinrob/guzzle-cache-middleware8.0.0-RC2429.04959hace 49 díasperformancephphttpcacheguzzlevalidationmiddlewarehandlerexpirationcache-controletagpromiseflysystempsr6psr7guzzle6http-1.1rfc7234

Métricas por categoría

Vitalidad

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

65Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
4.2/36Cadencia de commits — 6/52 semanas con commits
10.8/18Volumen de commits — 15 commits en el último año
2/10OpenSSF Scorecard: Maintained — 2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2
Datos de entrada utilizados
commits_last_year15
human_commit_share1
days_since_last_push0
active_weeks_last_year6
Cómo se puntúa
27/27Publica versiones — 60 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
12.6/27Cadencia de publicación — una versión cada ~128,9 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count60
latest_release_tag8.0.0-RC3
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases128,9
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?

65Moderado · 18% del índice global
Cómo se puntúa
42.8/60Estrellas — 435 estrellas
15.8/25Forks — 80 forks
5.3/15Observadores — 10 observadores
Datos de entrada utilizados
forks80
stars435
watchers10
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)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
75.1/80Descargas mensuales — 429.049 descargas/mes en packagist
13.9/20Dependientes en el registro — 119 paquetes dependen de él
Datos de entrada utilizados
packageskevinrob/guzzle-cache-middleware
dependents119
ecosystemspackagist
total_downloads19.032.589
monthly_downloads429.049

Sostenibilidad y Gobernanza

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

63Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
6/22.5Distribución de commits — el principal contribuyente firma el 73% de los commits
13.5/13.5Amplitud de contribuyentes — 54 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 5 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled54
top_contributor_share0,733
Cómo se puntúa
35.9/46.8Resolución de issues — 77% de issues cerradas
31.1/38.3Aceptación de PR — 104/128 PR decididos fusionados
7.5/15OpenSSF Scorecard: Code-Review — Found 16/27 approved changesets -- score normalized to 5
Datos de entrada utilizados
merged_prs104
open_issues21
closed_issues69
issue_closed_ratio0,767
closed_unmerged_prs24
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
12.3/25Alcance del propietario — 50 seguidores de Kevinrob
18.2/25Trayectoria — 6 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers50
owner_typeUser
is_verified
owner_loginKevinrob
public_repos6
account_age_days4815
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en packagist
35/35Recencia de publicación — última publicación hace 49 días
20/20Historial de versiones — 59 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageskevinrob/guzzle-cache-middleware
ecosystemspackagist
any_deprecatedno
min_days_since_publish49

Calidad de Ingeniería

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

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

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 13 topics
0/10Wiki
Datos de entrada utilizados
topicslaravel-cache, guzzle, middleware, flysystem, doctrine, cache, http, psr-6, psr-7, rfc-7234, performance, handlerstack, psr-16
has_wikino
homepage
has_readme
has_docs_dirno
has_description

Seguridad

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

42En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
1/2.5CI-Tests — 13 out of 28 merged PRs checked by a CI test -- score normalized to 4
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3.8/7.5Code-Review — Found 16/27 approved changesets -- score normalized to 5
2.5/2.5Contributors — project has 5 contributing companies or organizations
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
1.5/7.5Maintained — 2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate4,2
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, dangerous_workflow, packaging, pinned_dependencies, 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? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

65Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .github/copilot-instructions.md, GEMINI.md
0/15Documentación legible por máquinas (llms.txt)
28.8/40Historial de commits legible — 54 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,54
agent_instruction_files.github/copilot-instructions.md, GEMINI.md
agent_instruction_max_bytes5742
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — Dockerfile
6/10Práctica demostrada con agentes — 3 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
lockfiles
has_dockerfile
typed_languageno
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,03
toolchain_manifests
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
0/45Código verificable por tipos — PHP sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/44 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePHP
largest_source_bytes15.258
source_files_sampled44
oversized_source_files0

Datos clave

435estrellas de GitHub
54contribuidores
15commits en los últimos 12 meses
0días desde el último push
60versiones publicadas
1factor bus
21issues abiertas
Packagistecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

Más detalle

Historial de estrellas y forks 0 ★ / 80 ⇿
0Estrellas
80Forks
55Versiones

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.

0204060807932015-072021-012026-07
Mayor 5Menor 7Parche 29

Cada punto abarca 11 días.

OpenSSF Scorecard 4.2 / 10
4.2agregado

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 13:29 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
4CI-Tests13 out of 28 merged PRs checked by a CI test -- score normalized to 4
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
5Code-ReviewFound 16/27 approved changesets -- score normalized to 5
10Contributorsproject has 5 contributing companies or organizations
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
2Maintained2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
Packagistpsr/clock^1.0 || ^2.0 || ^3.0composer.json
Packagistguzzlehttp/guzzle^7.9.2 || ^8.0composer.json
Packagistguzzlehttp/promises^2.0.3 || ^3.0composer.json
Packagistguzzlehttp/psr7^2.7.0 || ^3.0composer.json
Todas las dependencias 14

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

RegistroPaqueteVersiónRelación
Packagistguzzlehttp/guzzledirecta
Packagistguzzlehttp/promisesdirecta
Packagistguzzlehttp/psr7directa
Packagistpsr/clockdirecta
Packagistcache/array-adapterindirecta
Packagistcache/simple-cache-bridgeindirecta
Packagistilluminate/cacheindirecta
Packagistleague/flysystemindirecta
Packagistphpindirecta
Packagistphpunit/phpunitindirecta
Packagistpsr/cacheindirecta
Packagistsymfony/cacheindirecta
Packagistsymfony/clockindirecta
Packagistsymfony/phpunit-bridgeindirecta
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies carried a version and a supported ecosystem

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "laravel-cache",
        "guzzle",
        "middleware",
        "flysystem",
        "doctrine",
        "cache",
        "http",
        "psr-6",
        "psr-7",
        "rfc-7234",
        "performance",
        "handlerstack",
        "psr-16"
      ],
      "is_fork": false,
      "size_kb": 434,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "PHP": 167078,
        "Makefile": 189
      },
      "pushed_at": "2026-07-29T13:18:27Z",
      "created_at": "2015-06-07T13:25:41Z",
      "owner_type": "User",
      "updated_at": "2026-07-29T13:19:11Z",
      "description": "A HTTP Cache for Guzzle 6. It's a simple Middleware to be added in the HandlerStack.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP"
      ]
    },
    "owner": {
      "blog": "http://ch.linkedin.com/in/kevinrobatel",
      "name": "Kevin Robatel",
      "type": "User",
      "login": "Kevinrob",
      "company": "@qoqa ",
      "location": "Switzerland",
      "followers": 50,
      "avatar_url": "https://avatars.githubusercontent.com/u/4509277?v=4",
      "created_at": "2013-05-23T12:28:52Z",
      "is_verified": null,
      "public_repos": 6,
      "account_age_days": 4815
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "8.0.0-RC3",
          "kind": "prerelease",
          "published_at": "2026-07-29T13:18:27Z"
        },
        {
          "tag": "8.0.0-RC2",
          "kind": "prerelease",
          "published_at": "2026-06-10T06:38:40Z"
        },
        {
          "tag": "v8.0.0-RC1",
          "kind": "prerelease",
          "published_at": "2026-03-11T06:59:29Z"
        },
        {
          "tag": "7.0.0",
          "kind": "major",
          "published_at": "2025-09-19T09:37:37Z"
        },
        {
          "tag": "6.0.0",
          "kind": "major",
          "published_at": "2024-11-28T09:55:01Z"
        },
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2023-11-09T06:54:31Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2023-11-05T12:38:49Z"
        },
        {
          "tag": "v4.1.2",
          "kind": "patch",
          "published_at": "2023-06-14T11:19:55Z"
        },
        {
          "tag": "v4.1.1",
          "kind": "patch",
          "published_at": "2023-05-31T07:07:07Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2023-05-26T11:23:26Z"
        },
        {
          "tag": "v4.0.2",
          "kind": "patch",
          "published_at": "2022-11-14T20:05:42Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2022-03-15T21:48:37Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2022-02-07T05:58:06Z"
        },
        {
          "tag": "v3.5.0",
          "kind": "minor",
          "published_at": "2022-01-10T19:28:54Z"
        },
        {
          "tag": "v3.4.1",
          "kind": "patch",
          "published_at": "2021-07-11T09:02:14Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2021-07-09T08:17:01Z"
        },
        {
          "tag": "v3.3.1",
          "kind": "patch",
          "published_at": "2020-02-14T11:17:55Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2020-01-08T10:09:42Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2018-01-11T07:41:40Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2017-11-21T12:41:44Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2017-11-13T08:28:39Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2017-11-08T20:22:00Z"
        },
        {
          "tag": "v2.1.1",
          "kind": "patch",
          "published_at": "2017-08-17T12:25:08Z"
        },
        {
          "tag": "v2.1",
          "kind": "other",
          "published_at": "2017-07-11T06:06:09Z"
        },
        {
          "tag": "v2.0.2",
          "kind": "patch",
          "published_at": "2017-03-30T13:19:55Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2017-02-27T07:43:07Z"
        },
        {
          "tag": "v2.0",
          "kind": "other",
          "published_at": "2017-02-04T09:58:21Z"
        },
        {
          "tag": "v1.5.2",
          "kind": "patch",
          "published_at": "2017-01-16T07:03:03Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2017-01-05T11:27:24Z"
        },
        {
          "tag": "v1.5",
          "kind": "other",
          "published_at": "2016-12-01T09:44:35Z"
        },
        {
          "tag": "v1.4.3",
          "kind": "patch",
          "published_at": "2016-09-02T16:44:15Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2016-08-26T14:39:49Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2016-06-17T08:35:56Z"
        },
        {
          "tag": "v1.4",
          "kind": "other",
          "published_at": "2016-05-10T18:50:20Z"
        },
        {
          "tag": "v1.3",
          "kind": "other",
          "published_at": "2016-05-03T14:52:46Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2016-04-07T06:48:55Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2016-03-23T20:09:53Z"
        },
        {
          "tag": "v1.2",
          "kind": "other",
          "published_at": "2016-03-12T16:16:25Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2016-02-27T17:36:47Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2016-02-14T09:37:57Z"
        },
        {
          "tag": "v1.1",
          "kind": "other",
          "published_at": "2016-01-22T21:38:25Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2015-11-23T16:44:51Z"
        },
        {
          "tag": "v1.0",
          "kind": "other",
          "published_at": "2015-11-13T15:10:45Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2015-11-13T12:34:21Z"
        },
        {
          "tag": "v0.8",
          "kind": "other",
          "published_at": "2015-10-11T12:56:26Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2015-09-26T17:04:56Z"
        },
        {
          "tag": "v0.7",
          "kind": "other",
          "published_at": "2015-09-19T18:38:57Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2015-09-17T09:30:59Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2015-09-06T12:24:34Z"
        },
        {
          "tag": "v0.6",
          "kind": "other",
          "published_at": "2015-08-16T10:15:50Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2015-07-30T17:57:31Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2015-07-25T22:12:32Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2015-07-21T08:18:55Z"
        },
        {
          "tag": "v0.5",
          "kind": "other",
          "published_at": "2015-07-19T14:45:57Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2015-07-17T14:43:05Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2015-07-17T07:49:17Z"
        },
        {
          "tag": "v0.4",
          "kind": "other",
          "published_at": "2015-07-16T12:36:27Z"
        },
        {
          "tag": "v0.3",
          "kind": "other",
          "published_at": "2015-07-07T14:41:06Z"
        },
        {
          "tag": "v0.2",
          "kind": "other",
          "published_at": "2015-06-30T21:05:17Z"
        },
        {
          "tag": "v0.1",
          "kind": "other",
          "published_at": "2015-06-30T11:22:53Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9c05662892a53f646f4cc50e6dbe28730ff32b5c",
          "body": null,
          "is_bot": false,
          "headline": "Add support for Guzzle 8 (#220)",
          "author_name": "Graham Campbell",
          "author_login": "GrahamCampbell",
          "committed_at": "2026-07-29T13:17:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78dd5a19d085108b0c86402efce0ebb82cbba571",
          "body": "* Fix Age header value type to string for PSR compliance\n\n* Update and test Age header handling for PSR compliance",
          "is_bot": false,
          "headline": "Fix Age header value type to string for PSR compliance (#218)",
          "author_name": "Eugen Skliarenko",
          "author_login": "ievgeniiskliarenko",
          "committed_at": "2026-06-10T06:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d4df7245a60effb2758bbca26489b7f80ef6645",
          "body": "…ions (#217)\n\n* Fix #82: Fully honor Guzzle 'sink' option on cache hits and revalidations\n\n* Refactor sink application and tests based on PR review",
          "is_bot": false,
          "headline": "Fix #82: Fully honor Guzzle 'sink' option on cache hits and revalidat…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2026-03-11T06:58:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2f752a76ef999d49f19c6d03a2f4d6cc84d2aa6",
          "body": "…ers (#216)\n\n* Fix #172: Invalidate corrupted cache entries across all storage adapters\n\n* Implement configurable class whitelist for secure unserialization",
          "is_bot": false,
          "headline": "Fix #172: Invalidate corrupted cache entries across all storage adapt…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2026-03-11T06:58:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "daffa41fadeee6864f0ea87e6e4cd81c87679c4e",
          "body": "…ession test (#215)\n\n* Fix DST caching bug by using strict timestamp arithmetic and add regression test\n\nThis ensures that during DST transitions (Summer -> Winter), relative date calculations (like -1 seconds) are absolute and not affected by timezone ambiguity. Fixes #194\n\n* Apply suggestion from @Kevinrob\n\n* Address code review: refactor stale entry creation and improve test isolation",
          "is_bot": false,
          "headline": "Fix DST caching bug by using strict timestamp arithmetic and add regr…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2026-03-11T06:58:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69cdaddbea8824180bbedac5e2cc8dc6b01cf81a",
          "body": "… composer.json (#214)",
          "is_bot": false,
          "headline": "Upgrade dependencies to support Laravel 13 and Symfony 8, and cleanup…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2026-03-07T14:31:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce4e86b140120d90f4eea3c47b5c9d28c186c919",
          "body": "…ests (#213)\n\n* Implement PSR-20 Clock for deterministic time management and faster tests\n\n* Optimize CacheEntry constructor by using toImmutable helper",
          "is_bot": false,
          "headline": "Implement PSR-20 Clock for deterministic time management and faster t…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2026-03-07T14:24:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de928f37551ed2c5f7718cc4db5ca7f1c3668465",
          "body": "* Modernize PHP support: drop PHP < 8.2 and add PHP 8.5\n\n* Upgrade dev-dependencies for PHP 8.2+ and 8.5 compatibility\n\n* Address code review: pin installer version, restrict permissions, and improve test stability",
          "is_bot": false,
          "headline": "Modernize PHP support: drop PHP < 8.2 and add PHP 8.5 (#212)",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2026-03-07T13:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d63aaf136c5a52ce751a63c2169b3a49b26841f",
          "body": "* Add deletion tests for GreedyCacheStrategy\n\n* Fix GreedyCacheStrategy delete() cache key to use varyHeaders",
          "is_bot": false,
          "headline": "Fix greedy cache deletion (#209)",
          "author_name": "Clément Baconnier",
          "author_login": "cbaconnier",
          "committed_at": "2025-09-04T18:27:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e6f5eb6b99aaf8a5d697ae4850e68150e3602ce",
          "body": null,
          "is_bot": false,
          "headline": "Update Github action versions (#206)",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2025-08-12T17:13:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8514d2defc4a021f4aa23cb0dec5d98578161b0b",
          "body": "* Initial plan\n\n* Add GitHub Copilot instructions for repository\n\nCo-authored-by: Kevinrob <4509277+Kevinrob@users.noreply.github.com>\n\n* Update .github/copilot-instructions.md\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: Kevinrob <4509277+Kevinrob@users.noreply.github.com>\nCo-authored-by: Kevin Robatel <kevinrob2@gmail.com>",
          "is_bot": false,
          "headline": "✨ Add GitHub Copilot instructions for repository (#205)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2025-08-12T14:40:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "adf8c1d5d4088933554f11cf4fa1d1e558523eb7",
          "body": "* Update dev Docker container\n\n* Remove useless data",
          "is_bot": false,
          "headline": "Update dev Docker container (#203)",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2025-08-11T10:37:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80d925e86b3d4fefa9853482ccba0eda27129391",
          "body": null,
          "is_bot": false,
          "headline": "Remove Scrutinizer",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2025-08-11T09:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7012ce038a6952c6e070934eae6f87e91beb38e",
          "body": "…HTTP Caching RFC 9111 (#200)\n\n* Initial plan\n\n* Add Authorization header caching restrictions per RFC 9111\n\nCo-authored-by: Kevinrob <4509277+Kevinrob@users.noreply.github.com>\n\n* Move Authorization header caching logic from PrivateCacheStrategy to PublicCacheStrategy per RFC 9111\n\nCo-authored-by: \n[…]\nuthored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: Kevinrob <4509277+Kevinrob@users.noreply.github.com>\nCo-authored-by: Kevin Robatel <kevinrob2@gmail.com>",
          "is_bot": false,
          "headline": "Fix Authorization header caching in PublicCacheStrategy according to …",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2025-08-11T09:27:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a63dfa79a708c1f472b6c019475bddd9dc6f5646",
          "body": "* Initial plan\n\n* Remove doctrine/cache dependency and related code\n\nCo-authored-by: Kevinrob <4509277+Kevinrob@users.noreply.github.com>\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: Kevinrob <4509277+Kevinrob@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Drop doctrine/cache support (fixes #155, #188) (#201)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2025-08-03T07:52:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8c04f9a9901b747312a98d29e4be639a477dc242",
          "body": "* (feat): upgrading to flysystem v3\n\n* (feat): changed method name from `put` to `write`\n\n---------\n\nCo-authored-by: Kevin Robatel <kevinrob2@gmail.com>",
          "is_bot": false,
          "headline": "upgrade to flysystem v3 (#182)",
          "author_name": "Maruf Alom",
          "author_login": "marufmax",
          "committed_at": "2025-08-01T09:44:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23cd61505ce989a0c011429939487f5f3efa02b5",
          "body": null,
          "is_bot": false,
          "headline": "Use correct class name (#198)",
          "author_name": "Carsten Witt",
          "author_login": "tomkyle",
          "committed_at": "2025-05-23T10:58:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79fba8d190f4e8ede4f6714767964ca8440c928b",
          "body": "When the cached Guzzle response is unserialized, the request/response\nstream is passed through PumpStream. The problem is that PumpStream uses\nplain `strlen()` to measure data \"pumped\" into the buffer (which is\nlogically correct IMHO), whereas BodyStore and CacheEntry use `mb_`\nfunctions.\n\nThis work\n[…]\n in case of binart data (images etc.). The `mb_strlen()`\ncounts some bytes as multibyte characters, returning smaller size,\neffectively causing the file being truncated when it's cached...\n\nFixes #196",
          "is_bot": false,
          "headline": "Fix binary files being truncated when cached (#197)",
          "author_name": "Vojta Grec",
          "author_login": "vojtagrec",
          "committed_at": "2025-05-23T10:55:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "61305ed694e763e887a04f61e71e2292bb4fbad1",
          "body": "* Support PHP 8.4\r\n\r\n* Add tests in GitHub Action\r\n\r\n* Explicitly declare nullable parameters as nullable\r\n\r\n* Supply a default value for defaultTtl\r\n\r\n* Adjust dependency versions\r\n\r\nMany of the dependencies were outdated and did not support the full\r\nrange of PHP versions supported by this project\n[…]\nzlehttp/promises\r\n- guzzlehttp/psr7\r\n- phpunit/phpunit\r\n- symfony/phpunit-bridge\r\n\r\nMeanwhile the highest possible version of each of the above already\r\nsupported PHP 8.1 and above, including PHP 8.4.",
          "is_bot": false,
          "headline": "Support PHP 8.4 (#191)",
          "author_name": "Andrew Lyons",
          "author_login": "andrewnicols",
          "committed_at": "2024-10-17T09:11:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e4e9eefcdfa46a03d18a6b16aa8ea3a10f2cdec",
          "body": null,
          "is_bot": false,
          "headline": "Skip igbinary tests if extension not available (#192)",
          "author_name": "Andrew Lyons",
          "author_login": "andrewnicols",
          "committed_at": "2024-10-07T11:55:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "750808892cea1925b4a51c6891a2478df4ad3431",
          "body": "* Drop PHP <8.1 (EOL)\r\n\r\n* Fix GreedyCacheStrategy with negative TTL\r\n\r\n* Disable fail-fast when testing\r\n\r\n* Fix sprintf format",
          "is_bot": false,
          "headline": "Drop PHP <8.1 (EOL) (#190)",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2024-09-12T07:26:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0dac345cad3fe27bcefce9a401018d85535085c1",
          "body": null,
          "is_bot": false,
          "headline": "Add Buy Me a Coffee to README",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2024-08-30T15:44:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c80bed932ed8efd065374b9f38d82ab514e9a46b",
          "body": "…of self (#189)",
          "is_bot": false,
          "headline": "Reference Middleware and Strategy Headers via static keyword instead …",
          "author_name": "Jeff Bowen",
          "author_login": "jblz",
          "committed_at": "2024-08-28T06:05:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f258533be4ac2b8c1160d98d2513024937e32c7",
          "body": "Closes #185",
          "is_bot": false,
          "headline": "Add missing returns (#186)",
          "author_name": "Dezső BICZÓ",
          "author_login": "mxr576",
          "committed_at": "2024-03-18T11:56:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bd64dbbe5155107d84a0f67140a8822a709c6d0",
          "body": null,
          "is_bot": false,
          "headline": "always return stale on rejection (#169)",
          "author_name": "e-zannelli",
          "author_login": "e-zannelli",
          "committed_at": "2023-11-09T06:53:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65f85ca874c7d9b357359c6d38c6cd56e942b58c",
          "body": null,
          "is_bot": false,
          "headline": "(feat): Upgrade to Flysystem v2 (#183)",
          "author_name": "Maruf Alom",
          "author_login": "marufmax",
          "committed_at": "2023-11-05T12:31:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "523573cd560285ce454ab6ec4078ca0dc0a7997b",
          "body": "* Update workflow actions versions\r\n\r\n* Trying to fix timeout fetching composer\r\n\r\n* COMPOSER_PROCESS_TIMEOUT",
          "is_bot": false,
          "headline": "Update workflow actions versions (#184)",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2023-10-30T10:36:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d2d7661cac2a711e75f242b969ec78592a383ec",
          "body": "* [ENHANCEMENT] Add `.phpunit.result.cache` to ignore\r\n\r\n(cherry picked from commit d2504717f4155c7eb65339f85c451354df62602b)\r\n\r\n* [ENHANCEMENT] add docker-compose for easy jump in development\r\n\r\n(cherry picked from commit d03b46d481c4ce9ad675f870387b60b8a197347f)\r\n\r\n* Makefile + Documentation\r\n\r\n---------\r\n\r\nCo-authored-by: Maxim Ageev <maxim.ageev@paxful.com>",
          "is_bot": false,
          "headline": "Docker config (#179)",
          "author_name": "Max Ageev",
          "author_login": "Legion112",
          "committed_at": "2023-06-14T13:52:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2546d1035e844da378b03e1fb42d3d1cf53187e2",
          "body": null,
          "is_bot": false,
          "headline": "fix: restore cache entry unserialization compatibility (#181)",
          "author_name": "e-zannelli",
          "author_login": "e-zannelli",
          "committed_at": "2023-06-14T11:19:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e12dccf3c811a18bb2f6c93882c5b5727e1b859",
          "body": null,
          "is_bot": false,
          "headline": "use __serialize instead of __sleep on CacheEntry (#163)",
          "author_name": "e-zannelli",
          "author_login": "e-zannelli",
          "committed_at": "2023-05-31T07:04:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8528f8c040c333480cbf885ef669dfb33a21f1e8",
          "body": "* Update CacheMiddleware.php\r\n\r\nThe inspect_all function has been replaced with a Utils::inspect_all function due to \"mitigate problems with functions conflicting between global and local copies of the package\".\r\n\r\n* Update CacheMiddleware.php\r\n\r\nThe name of the new function is inspectAll and not in\n[…]\nser.json\r\n\r\nMake promises accept both version 1.4 or 2.0.\r\n\r\nCo-authored-by: Christoph Reiter <reiter.christoph@gmail.com>\r\n\r\n---------\r\n\r\nCo-authored-by: Christoph Reiter <reiter.christoph@gmail.com>",
          "is_bot": false,
          "headline": "The inspect_all function has been changed to Utils::inspectAll. (#178)",
          "author_name": "Lars Hansen",
          "author_login": "dbclkh",
          "committed_at": "2023-05-26T10:54:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24b93edc942f2eaaeb17f7ae0d6db0f77f4ed4ea",
          "body": "* Update composer allow-plugins directive\r\n\r\n* fix json\r\n\r\n* fix json",
          "is_bot": false,
          "headline": "Update composer allow-plugins directive (#168)",
          "author_name": "Kieran",
          "author_login": "bytestream",
          "committed_at": "2022-10-02T13:13:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45ba0feeadeff117e90c065c03488a1e1c27bdf7",
          "body": null,
          "is_bot": false,
          "headline": "Set empty string as default value (#161)",
          "author_name": "Herpaderp Aldent",
          "author_login": "herpaderpaldent",
          "committed_at": "2022-10-02T13:11:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a61532ee8bf278a0d875a86a536aeeab592da5a",
          "body": "after calling CacheEntry::__sleep we need to rewind",
          "is_bot": false,
          "headline": "Merge pull request #159 from oleg-andreyev/rewind-issue",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2022-03-15T21:47:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04ea3a136874cb4b70d3e45c568e7d26c6af15f2",
          "body": null,
          "is_bot": false,
          "headline": "after calling CacheEntry::__sleep we need to rewind",
          "author_name": "Oleg Andreyev",
          "author_login": "oleg-andreyev",
          "committed_at": "2022-03-15T16:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22d79bb234861469e0c1d6b9541eb6d8e97ecd72",
          "body": "…thods\n\nInvalidate items for all methods on unsafe method",
          "is_bot": false,
          "headline": "Merge pull request #157 from rhysemmerson/invalidate-items-for-all-me…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2022-02-07T05:49:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fda11c55bba8fd0a0113ed00cc8fd0d873da90e1",
          "body": "Fix #148 igbinary_serialize cannot serialize resource(stream)",
          "is_bot": false,
          "headline": "Merge pull request #156 from xavierleune/fix/igbinary_serialize",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2022-01-31T09:01:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "726955a68ae6636c1fec39b4752219c66f9fd2a3",
          "body": null,
          "is_bot": false,
          "headline": "Handle stream on request + specific tests on igbinary",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-20T16:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1830d780636128d7de68ebc34f0fdf2bee4a7585",
          "body": "Co-authored-by: Kevin Robatel <kevinrob2@gmail.com>",
          "is_bot": false,
          "headline": "Update src/CacheMiddleware.php",
          "author_name": "Rhys Emmerson",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-18T22:38:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b4a7dab49e276d5f4ed85cd9fb195b823ffcabb",
          "body": null,
          "is_bot": false,
          "headline": "fix 7.2 trailing comma",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-17T11:06:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7af3d89780beb45d248532f935bd2f29c1c1f1be",
          "body": null,
          "is_bot": false,
          "headline": "use isset instead of in array, code style, fix typo",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-17T11:05:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a595880a11ae482ca0ac5699414d775c4f19c40",
          "body": null,
          "is_bot": false,
          "headline": "fix test name",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T22:16:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "515d2d31957beba9eb65245264652a8cfb264488",
          "body": null,
          "is_bot": false,
          "headline": "use safe methods as defined by spec",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T22:13:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80abb16cd65a122fac80ef9f3abea79c653304ae",
          "body": null,
          "is_bot": false,
          "headline": "add getter and setter, add test for configuration of unsafe methods",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T22:07:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77e54f43ca4f9423bc2ccaebbbd3dcb9f0f83264",
          "body": null,
          "is_bot": false,
          "headline": "cs",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T22:01:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "344f079d0cca5d07b16fca331fd28afc98618781",
          "body": null,
          "is_bot": false,
          "headline": "cs",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T21:56:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "196397cfcf76afeb5dec1728d7cc03e148dc81e9",
          "body": null,
          "is_bot": false,
          "headline": "add unsafe method config",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T21:54:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7482f22b5c68e1ceb8262f6298ef512a65d1b8e3",
          "body": null,
          "is_bot": false,
          "headline": "fixes #149 invalidate items for all methods on unsafe method",
          "author_name": "Rhys",
          "author_login": "rhysemmerson",
          "committed_at": "2022-01-16T08:54:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "787a06ea4f326623a90a53d6ffa95eac3334cb55",
          "body": null,
          "is_bot": false,
          "headline": "Fix #148 igbinar_serialize cannot serialize resource(stream)",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-14T09:40:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b63aa3d81bce33ef70d20b890c27acb09b95ecd",
          "body": "Update matrix with lowest & highest deps + PHP 8.0 & 8.1",
          "is_bot": false,
          "headline": "Merge pull request #154 from xavierleune/feature/tests-matrix",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2022-01-10T19:34:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b11516ec66b24dfc818c88d83c5bda6bf56d79a",
          "body": null,
          "is_bot": false,
          "headline": "Add return type for php 8.1",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T09:13:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d8636cedadae8c4b5c2edbac814f50a3f0471d0",
          "body": null,
          "is_bot": false,
          "headline": "Add return type",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T09:10:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5963ba07d4444e752dff0880de68ead7a3f27ad8",
          "body": null,
          "is_bot": false,
          "headline": "doctrine/cache 1.10 min for php8 support",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T09:06:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "079c0d79a74a70e85c5fe66cac29ece63b17628b",
          "body": null,
          "is_bot": false,
          "headline": "Should not use doctrine/cache < 1.4",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T09:01:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f856572510a979235315e0c6807d58c81f3caad",
          "body": null,
          "is_bot": false,
          "headline": "PHP Unit < 8.5.15 does not work with PHP 8.1",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T08:49:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf5d10138ac69a8ffb2bdc3a6073f71940d9f9e7",
          "body": null,
          "is_bot": false,
          "headline": "Drop PHP < 7.2.0",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T08:32:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4546036e14481e13610d3efd391d7efcac55f917",
          "body": null,
          "is_bot": false,
          "headline": "Update matrix with lowest & highest deps + PHP 8.0 & 8.1",
          "author_name": "Xavier Leune",
          "author_login": null,
          "committed_at": "2022-01-10T08:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45b8a7fc3d98d9828852560ed1b70f08037367e1",
          "body": "This library supports Guzzle 6 and 7, the actual readme only states support for guzzle 6.",
          "is_bot": false,
          "headline": "Update readme to reflect guzzle 7 support",
          "author_name": "Xavier Leune",
          "author_login": "xavierleune",
          "committed_at": "2022-01-10T08:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af22fe1daf629b5a023ef0d6cae7d06d1480f779",
          "body": null,
          "is_bot": false,
          "headline": "Allow `guzzlehttp/psr7` to use version `^2.0.0`",
          "author_name": "Hugo Hamon",
          "author_login": "hhamon",
          "committed_at": "2022-01-10T08:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c699f4623a7be6c92468876a1b2404d499a4f22f",
          "body": "Update readme to reflect guzzle 7 support",
          "is_bot": false,
          "headline": "Merge pull request #153 from xavierleune/patch-1",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2022-01-04T16:40:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa3b62d8cc3a51899c6d6d5a81f9cd2ba31a5e69",
          "body": "This library supports Guzzle 6 and 7, the actual readme only states support for guzzle 6.",
          "is_bot": false,
          "headline": "Update readme to reflect guzzle 7 support",
          "author_name": "Xavier Leune",
          "author_login": "xavierleune",
          "committed_at": "2022-01-03T09:19:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51434e01d02fb67eff87e4a9b67d13fb21772733",
          "body": "Allow `guzzlehttp/psr7` to use version `^2.0.0`",
          "is_bot": false,
          "headline": "Merge pull request #151 from hhamon/feature/allow-guzzle-psr7-version-2",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2021-11-23T19:32:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4756effb1f4527eafdf9d35f5ec27b8762c5e4e6",
          "body": null,
          "is_bot": false,
          "headline": "Support PHPUnit 8 and PHPUnit 9 versions",
          "author_name": "Hugo Hamon",
          "author_login": "hhamon",
          "committed_at": "2021-11-23T17:44:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0ca8230b20ac1e847fb07c035828c10f60388f6",
          "body": null,
          "is_bot": false,
          "headline": "Allow `guzzlehttp/psr7` to use version `^2.0.0`",
          "author_name": "Hugo Hamon",
          "author_login": "hhamon",
          "committed_at": "2021-11-23T17:27:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fb10725c6777e98ad3e4cdb29da457bef8363ea",
          "body": "Fix the link to apisyouwonthate.com",
          "is_bot": false,
          "headline": "Merge pull request #150 from coudenysj/patch-1",
          "author_name": "Hannes Van De Vreken",
          "author_login": "hannesvdvreken",
          "committed_at": "2021-10-20T14:05:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfa84828a7d3ca5d9a08d1fdcb94a0804041abd1",
          "body": null,
          "is_bot": false,
          "headline": "Fix the link to apisyouwonthate.com",
          "author_name": "Jachim Coudenys",
          "author_login": "coudenysj",
          "committed_at": "2021-10-20T14:03:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "122e309f64934511146a88d5645599f561b6fae3",
          "body": null,
          "is_bot": false,
          "headline": "Remove deprecated option to composer",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2021-07-11T09:00:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e4dfb47e02f2b6f9b36c5ec510da98ca96306b9",
          "body": null,
          "is_bot": false,
          "headline": "Set ^1.7.0 constraint for guzzlehttp/psr7",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2021-07-11T08:59:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d40eb54f08362d01da598da1b0e7421e8c3a52f6",
          "body": null,
          "is_bot": false,
          "headline": "Remove Sensiolab Insight",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2021-07-02T15:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dc6830c81f758406f2960bf2c3ee0f22e787ea4",
          "body": "The Guzzle 7 is complaining about the stream_for method.",
          "is_bot": false,
          "headline": "Merge pull request #143 from DBCDK/master",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2021-07-02T09:13:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "482b2d7bb92e823463cdf88a07facf91b857c34b",
          "body": "Exclude files from composer distribution",
          "is_bot": false,
          "headline": "Merge pull request #139 from bytestream/gitattributes",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2021-07-02T09:12:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2316543cc56e84b6d46290e8b989dc368f1d7ba",
          "body": "…ated and they want to use Utils::streamFor instead",
          "is_bot": false,
          "headline": "The Guzzle 7 is complaining about the stream_for method. It is deprec…",
          "author_name": "Lars Krogsgård Hansen",
          "author_login": "dbclkh",
          "committed_at": "2021-07-02T06:33:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "521a5f89edaf7f0f8fc839c601691f730ce7a58f",
          "body": null,
          "is_bot": false,
          "headline": "Exclude files from composer distribution",
          "author_name": "Kieran Brahney",
          "author_login": "bytestream",
          "committed_at": "2021-02-03T21:07:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57c579392ef24d6afe72a00ccd73f09ae35a9d24",
          "body": "…_badge\n\nReplace Travis CI with GitHub Action badge link",
          "is_bot": false,
          "headline": "Merge pull request #137 from open-source-contributions/replace_travis…",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-12-11T08:15:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fa3941273e97a24aa384638f65a15c8147dcb43",
          "body": null,
          "is_bot": false,
          "headline": "Replace Travis CI with GitHub Action badge link",
          "author_name": "peter279k",
          "author_login": "peter279k",
          "committed_at": "2020-12-10T02:52:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6879c80b2d8865b7dfbe9aeb1bf40e9ac9e0831f",
          "body": "Improve class namespace and assertions",
          "is_bot": false,
          "headline": "Merge pull request #135 from open-source-contributions/test_enhancement",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-12-09T23:29:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfb45cdf6836e5a8a655ccc19277734dd6ec8a06",
          "body": "Drop Travis CI building",
          "is_bot": false,
          "headline": "Merge pull request #136 from open-source-contributions/drop_travis",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-12-09T23:28:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25abd447817e96af0fc7435095041d7e24b2ff80",
          "body": null,
          "is_bot": false,
          "headline": "Drop Travis CI building",
          "author_name": "peter279k",
          "author_login": "peter279k",
          "committed_at": "2020-12-09T08:28:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "684c7326105cf6417155c788de8906eb7377e828",
          "body": null,
          "is_bot": false,
          "headline": "Improve class namespace and assertions",
          "author_name": "peter279k",
          "author_login": "peter279k",
          "committed_at": "2020-12-08T18:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c49a6933e775963521f02ab42c96c08bb0545c1c",
          "body": "Bring travis configuration up to date",
          "is_bot": false,
          "headline": "Merge pull request #133 from hannesvdvreken/patch-1",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-29T08:03:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cccca8a50e862f021507d89b627fd6ad24675f1e",
          "body": null,
          "is_bot": false,
          "headline": "Make travis retry when failing",
          "author_name": "Hannes Van De Vreken",
          "author_login": "hannesvdvreken",
          "committed_at": "2020-07-29T03:31:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bfa7bdc9f7a2545d1ad68acf1ffafb7aeaf04d9",
          "body": null,
          "is_bot": false,
          "headline": "Fix yml",
          "author_name": "Hannes Van De Vreken",
          "author_login": "hannesvdvreken",
          "committed_at": "2020-07-29T03:26:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcdfc0c2363cec39a9962b84b9c0952e82ba70e9",
          "body": null,
          "is_bot": false,
          "headline": "Use trusty for reaaaaaly old php versions",
          "author_name": "Hannes Van De Vreken",
          "author_login": "hannesvdvreken",
          "committed_at": "2020-07-29T03:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "765aab2f969b26b4ad754ea6493c0103a2a5ceef",
          "body": null,
          "is_bot": false,
          "headline": "Bring travis configuration up to date",
          "author_name": "Hannes Van De Vreken",
          "author_login": "hannesvdvreken",
          "committed_at": "2020-07-29T03:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "810adad9161618254203a6c8de7f4c88938b2a2e",
          "body": "Scrutinizer Auto-Fixes",
          "is_bot": false,
          "headline": "Merge pull request #132 from Kevinrob/scrutinizer-patch-1",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-20T12:46:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ae3a7b2dee71ddd158eb60281a339f207f2bfe2",
          "body": "This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com",
          "is_bot": false,
          "headline": "Scrutinizer Auto-Fixes",
          "author_name": "Scrutinizer Auto-Fixer",
          "author_login": "scrutinizer-auto-fixer",
          "committed_at": "2020-07-20T12:46:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "506dd9edc97b2088d32f434af803f9a4393239ac",
          "body": "Allow guzzle 7",
          "is_bot": false,
          "headline": "Merge pull request #129 from gmponos/patch-1",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-20T12:37:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cfd53cbf62438e7af3c071bcbcab6ce9708340a",
          "body": null,
          "is_bot": false,
          "headline": "Fix composer",
          "author_name": "Mponos George",
          "author_login": "gmponos",
          "committed_at": "2020-07-20T06:22:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31e07916fb2cbe0fefbd79d059b7b21eb16cdfd8",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'kevinrob/master' into patch-1",
          "author_name": "Mponos George",
          "author_login": "gmponos",
          "committed_at": "2020-07-20T06:20:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d35f0d94987b61f7ca9f90272df70442b7cd1d81",
          "body": "Update tests.yml for running on PR",
          "is_bot": false,
          "headline": "Merge pull request #131 from Kevinrob/Github-actions-CI-PR",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-19T19:11:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0ccb7fb3046853faa2795e839c708b3b8a8e2e5",
          "body": null,
          "is_bot": false,
          "headline": "Update tests.yml",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-19T19:06:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec7f2e260b7f6fe1824257b0f234ef8002ef8d3e",
          "body": null,
          "is_bot": false,
          "headline": "Update tests.yml",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-19T19:06:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b34d6336d51fe281d7d86b654da731f64d43933e",
          "body": "Catch and ignore file not found errors.",
          "is_bot": false,
          "headline": "Merge pull request #130 from kicken/fix-file-not-found",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-07-19T18:47:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6a0e9373a7cfa39464b8ff9b82313793c4c9c4b",
          "body": null,
          "is_bot": false,
          "headline": "Catch and ignore file not found errors.",
          "author_name": "Keith Maika",
          "author_login": "kicken",
          "committed_at": "2020-07-17T22:21:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c6618c1e5191cc51d3aeac869a4d6c1814fea68",
          "body": null,
          "is_bot": false,
          "headline": "Allow guzzle 7",
          "author_name": "Mponos George",
          "author_login": "gmponos",
          "committed_at": "2020-06-30T19:51:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cd04b49699e6e8ba7549686529c4c64819601ce",
          "body": "Fix typo in README",
          "is_bot": false,
          "headline": "Merge pull request #126 from lmammino/patch-1",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-04-03T11:02:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30dc01ae443d1030144e6338c154611684192a5a",
          "body": null,
          "is_bot": false,
          "headline": "Fix typo in README",
          "author_name": "Luciano Mammino",
          "author_login": "lmammino",
          "committed_at": "2020-03-30T14:13:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f978b8da7484a16e26589a5518d6bacc6ccdee99",
          "body": "* Also put entries into the cache that allow stale-while-revalidate\r\n\r\n* Rename phpunit.xml to phpunit.xml.dist\r\n\r\n* Add require-dev dependency on symfony/phpunit-bridge to allow for clock mocking\r\n\r\nSee https://symfony.com/doc/current/components/phpunit_bridge.html#time-sensitive-tests.\r\n\r\nThis hel\n[…]\ndocblock explanation\r\n\r\n* Allow symfony/phpunit-bridge 4.4 as well\r\n\r\n... so we get compatibility even with PHPUnit 4.\r\n\r\n* Ensure BC with PHPUnit 4\r\n\r\n* Avoid failing tests due to deprecation notices",
          "is_bot": false,
          "headline": "Also put entries into the cache that allow stale-while-revalidate (#125)",
          "author_name": "Matthias Pigulla",
          "author_login": "mpdude",
          "committed_at": "2020-02-14T11:17:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f18549a88c8b00bfc69aefe1dad44b2f1f67eaa",
          "body": null,
          "is_bot": false,
          "headline": "Test enhancement",
          "author_name": "peter279k",
          "author_login": "peter279k",
          "committed_at": "2020-01-09T19:26:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a1bb0c383fcef5c778dac4b097d8de3868439de",
          "body": null,
          "is_bot": false,
          "headline": "Fix #116 issue about Laravel cache duration in minutes or seconds",
          "author_name": "Kevin Robatel",
          "author_login": "Kevinrob",
          "committed_at": "2020-01-08T10:06:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 60,
      "commits_last_year": 15,
      "latest_release_at": "2026-07-29T13:18:27Z",
      "latest_release_tag": "8.0.0-RC3",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 128.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "kevinrob/guzzle-cache-middleware",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "performance",
            "php",
            "http",
            "cache",
            "Guzzle",
            "validation",
            "middleware",
            "handler",
            "expiration",
            "cache-control",
            "Etag",
            "promise",
            "Flysystem",
            "psr6",
            "psr7",
            "guzzle6",
            "http 1.1",
            "rfc7234"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/kevinrob/guzzle-cache-middleware",
          "is_deprecated": false,
          "latest_version": "8.0.0-RC2",
          "repository_url": "https://github.com/Kevinrob/guzzle-cache-middleware",
          "versions_count": 59,
          "total_downloads": 19032589,
          "dependents_count": 119,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 429049,
          "first_published_at": null,
          "latest_published_at": "2026-06-10T06:35:05Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 49
        }
      ]
    },
    "popularity": {
      "forks": 80,
      "stars": 435,
      "watchers": 10,
      "fork_history": {
        "days": [
          {
            "date": "2015-07-17",
            "count": 1
          },
          {
            "date": "2015-07-25",
            "count": 1
          },
          {
            "date": "2015-08-11",
            "count": 1
          },
          {
            "date": "2015-08-12",
            "count": 1
          },
          {
            "date": "2016-01-07",
            "count": 1
          },
          {
            "date": "2016-03-11",
            "count": 1
          },
          {
            "date": "2016-05-04",
            "count": 1
          },
          {
            "date": "2016-05-13",
            "count": 1
          },
          {
            "date": "2016-06-13",
            "count": 1
          },
          {
            "date": "2016-08-29",
            "count": 1
          },
          {
            "date": "2016-09-02",
            "count": 1
          },
          {
            "date": "2016-09-04",
            "count": 1
          },
          {
            "date": "2016-11-24",
            "count": 1
          },
          {
            "date": "2017-01-16",
            "count": 1
          },
          {
            "date": "2017-02-03",
            "count": 1
          },
          {
            "date": "2017-03-29",
            "count": 1
          },
          {
            "date": "2017-03-30",
            "count": 1
          },
          {
            "date": "2017-06-05",
            "count": 1
          },
          {
            "date": "2017-09-05",
            "count": 1
          },
          {
            "date": "2017-10-13",
            "count": 1
          },
          {
            "date": "2017-11-08",
            "count": 2
          },
          {
            "date": "2018-03-07",
            "count": 1
          },
          {
            "date": "2018-04-09",
            "count": 1
          },
          {
            "date": "2018-04-12",
            "count": 1
          },
          {
            "date": "2018-05-16",
            "count": 1
          },
          {
            "date": "2018-07-10",
            "count": 1
          },
          {
            "date": "2018-07-24",
            "count": 1
          },
          {
            "date": "2018-08-21",
            "count": 1
          },
          {
            "date": "2018-10-03",
            "count": 1
          },
          {
            "date": "2018-12-21",
            "count": 1
          },
          {
            "date": "2019-03-13",
            "count": 1
          },
          {
            "date": "2019-04-22",
            "count": 1
          },
          {
            "date": "2019-05-01",
            "count": 1
          },
          {
            "date": "2019-05-24",
            "count": 1
          },
          {
            "date": "2019-08-09",
            "count": 1
          },
          {
            "date": "2019-10-18",
            "count": 1
          },
          {
            "date": "2019-11-28",
            "count": 1
          },
          {
            "date": "2020-01-09",
            "count": 1
          },
          {
            "date": "2020-02-06",
            "count": 1
          },
          {
            "date": "2020-02-25",
            "count": 1
          },
          {
            "date": "2020-03-30",
            "count": 1
          },
          {
            "date": "2020-06-11",
            "count": 1
          },
          {
            "date": "2020-06-30",
            "count": 1
          },
          {
            "date": "2020-07-29",
            "count": 1
          },
          {
            "date": "2020-08-25",
            "count": 1
          },
          {
            "date": "2020-09-24",
            "count": 1
          },
          {
            "date": "2021-02-03",
            "count": 2
          },
          {
            "date": "2021-02-18",
            "count": 1
          },
          {
            "date": "2021-05-19",
            "count": 1
          },
          {
            "date": "2021-08-20",
            "count": 1
          },
          {
            "date": "2021-10-20",
            "count": 1
          },
          {
            "date": "2021-11-23",
            "count": 1
          },
          {
            "date": "2022-01-03",
            "count": 1
          },
          {
            "date": "2022-01-25",
            "count": 1
          },
          {
            "date": "2022-03-15",
            "count": 1
          },
          {
            "date": "2022-04-29",
            "count": 1
          },
          {
            "date": "2022-06-07",
            "count": 1
          },
          {
            "date": "2022-07-05",
            "count": 1
          },
          {
            "date": "2023-01-26",
            "count": 1
          },
          {
            "date": "2023-02-02",
            "count": 1
          },
          {
            "date": "2023-02-28",
            "count": 1
          },
          {
            "date": "2023-03-01",
            "count": 1
          },
          {
            "date": "2023-05-22",
            "count": 1
          },
          {
            "date": "2023-05-25",
            "count": 1
          },
          {
            "date": "2023-10-07",
            "count": 1
          },
          {
            "date": "2024-03-16",
            "count": 1
          },
          {
            "date": "2024-08-27",
            "count": 1
          },
          {
            "date": "2024-10-02",
            "count": 1
          },
          {
            "date": "2025-01-07",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-22",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 1
          },
          {
            "date": "2025-08-25",
            "count": 1
          },
          {
            "date": "2025-09-02",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-07-12",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 79,
        "total_forks": 80
      },
      "star_history": null,
      "open_issues_and_prs": 23
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 15258,
      "source_files_sampled": 44,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        ".github/copilot-instructions.md",
        "GEMINI.md"
      ],
      "agent_instruction_max_bytes": 5742
    },
    "dependencies": {
      "manifests": [
        "composer.json"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "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": 14,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "packagist"
      ],
      "dependencies": [
        {
          "name": "psr/clock",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^1.0 || ^2.0 || ^3.0"
        },
        {
          "name": "guzzlehttp/guzzle",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^7.9.2 || ^8.0"
        },
        {
          "name": "guzzlehttp/promises",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^2.0.3 || ^3.0"
        },
        {
          "name": "guzzlehttp/psr7",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^2.7.0 || ^3.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "guzzlehttp/guzzle",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "guzzlehttp/promises",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "guzzlehttp/psr7",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "psr/clock",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cache/array-adapter",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cache/simple-cache-bridge",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "illuminate/cache",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "league/flysystem",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "php",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/phpunit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "psr/cache",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/cache",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/clock",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/phpunit-bridge",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 14,
        "direct_count": 4,
        "indirect_count": 10
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 104,
        "open_issues": 21,
        "closed_ratio": 0.767,
        "closed_issues": 69,
        "closed_unmerged_prs": 24
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "Kevinrob",
          "commits": 297,
          "avatar_url": "https://avatars.githubusercontent.com/u/4509277?v=4"
        },
        {
          "type": "User",
          "login": "rhysemmerson",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/2549415?v=4"
        },
        {
          "type": "User",
          "login": "bpolaszek",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/5569077?v=4"
        },
        {
          "type": "User",
          "login": "scrutinizer-auto-fixer",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/6253494?v=4"
        },
        {
          "type": "User",
          "login": "Neirda24",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/7036794?v=4"
        },
        {
          "type": "User",
          "login": "hannesvdvreken",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/1410358?v=4"
        },
        {
          "type": "User",
          "login": "adrian3d",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/3417385?v=4"
        },
        {
          "type": "User",
          "login": "peter279k",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/9021747?v=4"
        },
        {
          "type": "User",
          "login": "e-zannelli",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/41945822?v=4"
        },
        {
          "type": "User",
          "login": "renanbr",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/350222?v=4"
        }
      ],
      "contributors_sampled": 54,
      "top_contributor_share": 0.733
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "tests.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": true,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 4,
            "reason": "13 out of 28 merged PRs checked by a CI test -- score normalized to 4",
            "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": 5,
            "reason": "Found 16/27 approved changesets -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 5 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 2,
            "reason": "2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "9c05662892a53f646f4cc50e6dbe28730ff32b5c",
        "ran_at": "2026-07-29T13:29:51Z",
        "aggregate_score": 4.2,
        "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-29T13:19:02Z",
      "oldest_open_prs": [
        {
          "number": 128,
          "created_at": "2020-05-26T14:19:49Z",
          "last_comment_at": "2023-05-26T11:16:34Z",
          "last_comment_author": "Kevinrob"
        },
        {
          "number": 208,
          "created_at": "2025-08-25T11:41:21Z",
          "last_comment_at": "2025-08-26T06:47:25Z",
          "last_comment_author": "pilif"
        }
      ],
      "last_merged_pr_at": "2026-07-29T13:17:39Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 20,
          "created_at": "2015-07-30T18:03:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 24,
          "created_at": "2015-08-06T13:11:18Z",
          "last_comment_at": "2017-05-02T12:01:33Z",
          "last_comment_author": "Kevinrob"
        },
        {
          "number": 42,
          "created_at": "2016-02-14T09:36:45Z",
          "last_comment_at": "2017-05-02T12:00:05Z",
          "last_comment_author": "afoeder"
        },
        {
          "number": 87,
          "created_at": "2017-07-14T13:50:33Z",
          "last_comment_at": "2020-01-17T13:23:05Z",
          "last_comment_author": "lazka"
        },
        {
          "number": 99,
          "created_at": "2017-11-15T15:20:41Z",
          "last_comment_at": "2018-03-07T11:13:20Z",
          "last_comment_author": "bpolaszek"
        },
        {
          "number": 106,
          "created_at": "2018-05-14T10:16:20Z",
          "last_comment_at": "2019-06-29T18:54:03Z",
          "last_comment_author": "jamieburchell"
        },
        {
          "number": 107,
          "created_at": "2018-05-24T18:45:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 108,
          "created_at": "2018-06-02T19:41:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 112,
          "created_at": "2018-09-26T13:08:13Z",
          "last_comment_at": "2019-04-15T13:40:02Z",
          "last_comment_author": "Kevinrob"
        },
        {
          "number": 117,
          "created_at": "2019-09-14T19:49:16Z",
          "last_comment_at": "2020-04-13T19:07:07Z",
          "last_comment_author": "marcus-at-localhost"
        },
        {
          "number": 118,
          "created_at": "2019-10-16T19:28:49Z",
          "last_comment_at": "2019-12-26T11:00:29Z",
          "last_comment_author": "Kevinrob"
        },
        {
          "number": 134,
          "created_at": "2020-11-17T12:47:31Z",
          "last_comment_at": "2021-07-09T08:43:16Z",
          "last_comment_author": "dbclkh"
        },
        {
          "number": 140,
          "created_at": "2021-04-20T10:15:26Z",
          "last_comment_at": "2021-07-04T16:01:24Z",
          "last_comment_author": "Kevinrob"
        },
        {
          "number": 142,
          "created_at": "2021-06-09T10:25:56Z",
          "last_comment_at": "2022-03-08T01:26:55Z",
          "last_comment_author": "rhysemmerson"
        },
        {
          "number": 147,
          "created_at": "2021-08-27T18:49:47Z",
          "last_comment_at": "2022-02-06T19:39:56Z",
          "last_comment_author": "vaclavgreif"
        },
        {
          "number": 158,
          "created_at": "2022-01-25T23:34:05Z",
          "last_comment_at": "2022-02-01T15:46:24Z",
          "last_comment_author": "piotrmerton"
        },
        {
          "number": 165,
          "created_at": "2022-07-15T08:31:17Z",
          "last_comment_at": "2026-03-08T14:23:44Z",
          "last_comment_author": "Kevinrob"
        },
        {
          "number": 166,
          "created_at": "2022-08-23T17:07:18Z",
          "last_comment_at": "2023-01-20T06:15:35Z",
          "last_comment_author": "intel352"
        },
        {
          "number": 170,
          "created_at": "2023-01-26T13:28:07Z",
          "last_comment_at": "2025-01-09T13:25:45Z",
          "last_comment_author": "tomswinkels"
        },
        {
          "number": 187,
          "created_at": "2024-04-17T10:49:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Kevinrob/guzzle-cache-middleware",
    "host": "github.com",
    "name": "guzzle-cache-middleware",
    "owner": "Kevinrob"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 42,
        "vitality": 65,
        "community": 65,
        "governance": 63,
        "engineering": 57
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 65,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "commits_last_year": 15,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 6
            },
            "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": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "15 commits in the last year",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "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": 84,
            "inputs": {
              "releases_count": 60,
              "latest_release_tag": "8.0.0-RC3",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 128.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "60 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "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 ~128.9 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 128.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 65,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "forks": 80,
              "stars": 435,
              "watchers": 10,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "435 stars",
                "points": 42.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 435
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "80 forks",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 80
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "10 watchers",
                "points": 5.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 89,
            "inputs": {
              "packages": [
                "kevinrob/guzzle-cache-middleware"
              ],
              "dependents": 119,
              "ecosystems": "packagist",
              "total_downloads": 19032589,
              "monthly_downloads": 429049
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "429,049 downloads/month across packagist",
                "points": 75.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 429049,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "119 packages depend on it",
                "points": 13.9,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 119
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 63,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 54,
              "top_contributor_share": 0.733
            },
            "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 73% of commits",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 73
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "54 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "merged_prs": 104,
              "open_issues": 21,
              "closed_issues": 69,
              "issue_closed_ratio": 0.767,
              "closed_unmerged_prs": 24
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "77% of issues closed",
                "points": 35.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 77
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "104/128 decided PRs merged",
                "points": 31.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 104,
                      "decided": 128
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 16/27 approved changesets -- score normalized to 5",
                "points": 7.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "followers": 50,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Kevinrob",
              "public_repos": 6,
              "account_age_days": 4815
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "50 followers of Kevinrob",
                "points": 12.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 50,
                      "login": "Kevinrob"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "6 public repos, account ~13 yr old",
                "points": 18.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 6
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "kevinrob/guzzle-cache-middleware"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 49
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on packagist",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 49 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 49
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "59 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 59
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 57,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "13 out of 28 merged PRs checked by a CI test -- score normalized to 4",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [
                "laravel-cache",
                "guzzle",
                "middleware",
                "flysystem",
                "doctrine",
                "cache",
                "http",
                "psr-6",
                "psr-7",
                "rfc-7234",
                "performance",
                "handlerstack",
                "psr-16"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "13 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 42,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 42,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 4.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "13 out of 28 merged PRs checked by a CI test -- score normalized to 4",
                "points": 1,
                "status": "partial",
                "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 16/27 approved changesets -- score normalized to 5",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 5 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 15
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 65,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.54,
              "agent_instruction_files": [
                ".github/copilot-instructions.md",
                "GEMINI.md"
              ],
              "agent_instruction_max_bytes": 5742
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".github/copilot-instructions.md, GEMINI.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".github/copilot-instructions.md, GEMINI.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "54 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 54,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "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": 62,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.03,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "3 of the last 100 commits agent-authored or agent-credited",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 3,
                      "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 15258,
              "source_files_sampled": 44,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/44 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 44,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T13:30:24.881905Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/Kevinrob/guzzle-cache-middleware.svg",
  "full_name": "Kevinrob/guzzle-cache-middleware",
  "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 v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

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