Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 00:35 UTC

stefankroes / ancestry

Organise ActiveRecord model into a tree structure

RubyMIT★ 3878 estrellas⑂ 472 forksdesde oct 2009Ver en GitHub ↗

stefankroes/ancestry tiene un índice de salud de 67 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Community & Adoption (86/100) y la más baja, AI Readiness (48/100). Se actualizó por última vez hace 26 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

67
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

Stefan KroesCuenta personal
40 seguidores3 repositorios públicosdesde dic 2008Booking Experts

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
RubyGemsancestry5.1.0-38hace 135 días

Métricas por categoría

Vitalidad

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

67Moderado · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 26 días
13.8/36Cadencia de commits — 20/52 semanas con commits
18/18Volumen de commits — 145 commits en el último año
9/10OpenSSF Scorecard: Maintained — 8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9
Datos de entrada utilizados
commits_last_year145
human_commit_share0,99
days_since_last_push26
active_weeks_last_year20
Cómo se puntúa
16.2/27Publica versiones — 28 etiquetas de versión (sin releases de GitHub)
27/36Recencia de las versiones — última versión hace 135 días
12.6/27Cadencia de publicación — una versión cada ~221,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count28
latest_release_tagv5.1.0
releases_from_tags
days_since_latest_release135
mean_days_between_releases221,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

86Excelente · 18% del índice global
Cómo se puntúa
58.2/60Estrellas — 3878 estrellas
22.3/25Forks — 472 forks
9.1/15Observadores — 45 observadores
Datos de entrada utilizados
forks472
stars3878
watchers45
growth_stateorganic
growth_factor_pct100
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conduct
has_pull_request_template
Cómo se puntúa
78.8/80Descargas totales — 38.034.866 descargas históricas en rubygems
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesancestry
dependents
ecosystemsrubygems
total_downloads38.034.866
monthly_downloads
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

62Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
6.6/22.5Distribución de commits — el principal contribuyente firma el 71% de los commits
13.5/13.5Amplitud de contribuyentes — 99 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 13 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled99
top_contributor_share0,708
Cómo se puntúa
43.8/46.8Resolución de issues — 94% de issues cerradas
30.3/38.3Aceptación de PR — 323/408 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 1/12 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs323
open_issues22
closed_issues323
issue_closed_ratio0,936
closed_unmerged_prs85
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11.6/25Alcance del propietario — 40 seguidores de stefankroes
16.4/25Trayectoria — 3 repos públicos, cuenta de ~17 años
Datos de entrada utilizados
followers40
owner_typeUser
is_verified
owner_loginstefankroes
public_repos3
account_age_days6440
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 rubygems
35/35Recencia de publicación — última publicación hace 135 días
20/20Historial de versiones — 38 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesancestry
ecosystemsrubygems
any_deprecatedno
min_days_since_publish135

Calidad de Ingeniería

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

69Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .rubocop.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 12 out of 13 merged PRs checked by a CI test -- score normalized to 9
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
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
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
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?

50Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.2/2.5CI-Tests — 12 out of 13 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/12 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 13 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
6.8/7.5Maintained — 8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
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 — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. 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.

48En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 82 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,828
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .rubocop.yml
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 34 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 1 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,34
toolchain_manifests
dependency_bot_commit_share0,01
Cómo se puntúa
0/45Código verificable por tipos — Ruby sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/49 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRuby
largest_source_bytes20.293
source_files_sampled49
oversized_source_files0

Datos clave

3878estrellas de GitHub
99contribuidores
145commits en los últimos 12 meses
26días desde el último push
28versiones publicadas
1factor bus
22issues abiertas
RubyGemsecosistemas de paquetes

Advertencias de recopilación de datos

  • No resolved dependencies carried a version and a supported ecosystem

Más detalle

Historial de estrellas y forks 3878 ★ / 472 ⇿
3878Estrellas
472Forks
28Versiones

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

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

010002000300040003878450542009-122018-032026-07
Mayor 4Menor 9Parche 15

Cada punto abarca 16 días.

OpenSSF Scorecard 5.0 / 10
5.0agregado

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-22 00:35 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
9CI-Tests12 out of 13 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/12 approved changesets -- score normalized to 0
10Contributorsproject has 13 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
9Maintained8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
RubyGemsactiverecord~> 7.2Gemfile
RubyGemsmysql2Gemfile
RubyGemstrilogyGemfile
RubyGemspgGemfile
RubyGemssqlite3~> 1.6.9Gemfile
Todas las dependencias 11

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

RegistroPaqueteVersiónRelación
RubyGemsactiverecorddirecta
RubyGemspgdirecta
RubyGemssqlite3directa
RubyGemstrilogydirecta
RubyGemsappraisalindirecta
RubyGemsloggerindirecta
RubyGemsminitestindirecta
RubyGemsrakeindirecta
RubyGemssimplecovindirecta
RubyGemssimplecov-jsonindirecta
RubyGemsyardindirecta
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": [],
      "is_fork": false,
      "size_kb": 9853,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Ruby": 260269,
        "Shell": 190,
        "Mermaid": 2096
      },
      "pushed_at": "2026-06-25T00:51:43Z",
      "created_at": "2009-10-16T13:37:09Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T07:22:32Z",
      "description": "Organise ActiveRecord model into a tree structure",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby"
      ]
    },
    "owner": {
      "blog": "http://www.bookingexperts.nl/",
      "name": "Stefan Kroes",
      "type": "User",
      "login": "stefankroes",
      "company": "Booking Experts",
      "location": "Enschede, the Netherlands",
      "followers": 40,
      "avatar_url": "https://avatars.githubusercontent.com/u/37841?v=4",
      "created_at": "2008-12-02T18:29:23Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 6440
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2026-03-08T21:53:47Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2026-02-08T22:43:01Z"
        },
        {
          "tag": "v4.3.3",
          "kind": "patch",
          "published_at": "2023-03-29T01:54:38Z"
        },
        {
          "tag": "v4.3.2",
          "kind": "patch",
          "published_at": "2023-03-26T22:30:00Z"
        },
        {
          "tag": "v4.3.1",
          "kind": "patch",
          "published_at": "2023-03-20T02:10:54Z"
        },
        {
          "tag": "v4.3.0",
          "kind": "minor",
          "published_at": "2023-03-09T21:19:28Z"
        },
        {
          "tag": "v4.2.0",
          "kind": "minor",
          "published_at": "2022-06-10T03:35:54Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2021-06-28T17:55:51Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2021-04-13T02:21:53Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2020-09-23T23:55:59Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2020-09-23T14:38:05Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2020-08-03T23:03:57Z"
        },
        {
          "tag": "v3.0.7",
          "kind": "patch",
          "published_at": "2019-06-06T16:43:25Z"
        },
        {
          "tag": "v3.0.6",
          "kind": "patch",
          "published_at": "2019-04-24T14:54:05Z"
        },
        {
          "tag": "v3.0.5",
          "kind": "patch",
          "published_at": "2018-11-06T18:08:07Z"
        },
        {
          "tag": "v3.0.4",
          "kind": "patch",
          "published_at": "2018-11-03T00:17:51Z"
        },
        {
          "tag": "v3.0.3",
          "kind": "patch",
          "published_at": "2018-10-23T15:42:35Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2018-04-23T14:21:40Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2017-07-05T18:28:44Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2017-05-20T10:47:20Z"
        },
        {
          "tag": "v2.2.2",
          "kind": "patch",
          "published_at": "2016-11-01T21:03:03Z"
        },
        {
          "tag": "v2.2.1",
          "kind": "patch",
          "published_at": "2016-10-25T21:03:45Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2016-10-25T15:26:39Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2014-04-16T10:22:05Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2013-05-17T15:05:53Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2012-05-04T11:37:14Z"
        },
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2012-03-15T12:10:37Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2011-04-22T07:44:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e8c09d27929a292452901c8b5f34b1b0a1b882b4",
          "body": "…tions/checkout-7\n\nBump actions/checkout from 6 to 7",
          "is_bot": false,
          "headline": "Merge pull request #765 from stefankroes/dependabot/github_actions/ac…",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-06-25T00:51:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8d6299ad4df38106fb23dea045f18f5ba5384f5",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump actions/checkout from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T13:32:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0aa873bc340005389d4f974fd67c50693b43d33",
          "body": "Add rake check_no_db_at_load task",
          "is_bot": false,
          "headline": "Merge pull request #763 from kbrock/check-no-db-at-load",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-05-04T07:52:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c1ea51968f16f5454687bda76799a0280474c88",
          "body": "Motivation\n---\nSchema-touching regressions at class load time can slip in undetected.\nNo automated check existed to catch them.\n\nAfter\n---\n`rake check_no_db_at_load` requires ancestry and fails if any code\ntriggers a database connection during load.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add rake check_no_db_at_load task",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-05-04T07:42:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f353de7f9c66f1cf88cf398a5af6aa7088eeb66a",
          "body": "Docs: restore generated-column links and add version-tag note",
          "is_bot": false,
          "headline": "Merge pull request #762 from sdhull/docs-restore-generated-column-links",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-28T04:35:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "117209be6c251e0ea2b5486ae2612dd684d1b28a",
          "body": "The split of CONFIGURATION.md out of README.md (d8e65f2) dropped the\nlink to MySQL's generated columns docs from the Cached Columns section\nand left the preceding code fence unclosed. Restore the MySQL link,\nadd the equivalent PostgreSQL link, and close the fence.\n\nAlso add a note at the top of READ\n[…]\nmd letting\nreaders know that GitHub's default view is the master branch, which\ntracks active development — so they should switch to the tag matching\ntheir installed version when consulting these docs.",
          "is_bot": false,
          "headline": "Restore generated-column docs links and add version-tag note",
          "author_name": "Steve Hull",
          "author_login": "sdhull",
          "committed_at": "2026-04-28T03:32:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4641da6e50fabb5a48c877e4074dfd68188ee0d8",
          "body": "Add missing leaves diagram",
          "is_bot": false,
          "headline": "Merge pull request #760 from kbrock/add-leaves-image",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-27T03:41:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3b8edadad91dca1e282b77046edcf5d75ec6554",
          "body": "README references img/leaves.png but the file was never committed.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add missing leaves diagram to navigation images",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-27T03:33:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "86ebfbf8d22ccad65f46ec42daa374f9ae3ad68c",
          "body": "Conditional SQL based upon connector (mysql/pg/sqlite)",
          "is_bot": false,
          "headline": "Merge pull request #758 from kbrock/adapter-module",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T08:32:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d893f6aa01903df3402e7aa7ebcd75c5ecf7167d",
          "body": "Before:\n  # materialized_path.rb\n  class MaterializedPath\n    def self.concat(adapter, *args)\n      if %w(sqlite sqlite3).include?(adapter)\n        args.join('||')\n      else\n        %{CONCAT(#{args.join(', ')})}\n      end\n    end\n  end\n\nAfter:\n  # adapter.rb — mixed into format modules via extend\n \n[…]\ndules call pg?, mysql?, sqlite?, and concat bare.\nmp2/mp3/ltree inherit via class chain. MaterializedPathArray\nextends separately.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adapter: absorb concat helper and mix into format modules",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:32:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06199c33189d29b1bfce541e9bb0ae80acfd9b03",
          "body": "Centralizes the duplicated %w(pg postgresql postgis) / %w(mysql mysql2 trilogy)\nmatchers used across format modules and class_methods. Single source of truth\nfor \"is this Postgres / MySQL / SQLite\" checks.\n\n  Ancestry::Adapter.pg?       # default: current connection\n  Ancestry::Adapter.mysql?(adapte\n[…]\ns in materialized_path*.rb, class_methods.rb,\nand migration.rb can migrate over time — not done in this commit\nto keep it focused.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Ancestry::Adapter detection module",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:32:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e532d29aa0b59f4d39f37d608b968cd17f0a5e4",
          "body": "Memoize child_ancestry_sql on the model class",
          "is_bot": false,
          "headline": "Merge pull request #757 from kbrock/memoize-child-ancestry-sql",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:21:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f09946b388f4461584812f778f784d1a42d18bc1",
          "body": "Before\n======\n\n- every call to child_ancestry_sql was a database call\n\nAfter\n======\n\n- calls to child_ancestry_sql is cached in @child_ancestry_sql\n\nMatches the existing ||= pattern used by ancestry_depth_sql,\nancestry_parent_id_sql, and ancestry_root_id_sql.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Memoize child_ancestry_sql on the model class",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:17:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b5fcf66a6cb93d3bcd5f6ceb5c38306600e5b852",
          "body": "ltree: properly escape child ancestry sql",
          "is_bot": false,
          "headline": "Merge pull request #756 from kbrock/ltree-quoted",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T05:49:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6a8479049db1e74c3c212337a918756af55e919",
          "body": "Before:\n  Arel.sql(\"'#{child_ancestry}'\")\n  Arel.sql(\"nlevel(#{table}.#{col}) > nlevel('#{child_ancestry}')\")\n\nAfter:\n  Arel::Nodes::Quoted.new(child_ancestry)\n  Arel::Nodes::NamedFunction.new('nlevel', [attr]).gt(\n    Arel::Nodes::NamedFunction.new('nlevel', [Arel::Nodes::Quoted.new(child_ancestry)])\n  )\n\nQuoted goes through connection.quote at compile time, escaping\nembedded quotes. Functionally identical for integer ids.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ltree: parameterize child_ancestry values",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T03:04:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14f93b63067cea5b25478a03a0a0ce98ff6cb97e",
          "body": "Move descendants conditions into instance builder methods",
          "is_bot": false,
          "headline": "Merge pull request #755 from kbrock/dynamic_conditions",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-10T02:10:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea91fca947abcae65aebc2a88395756ac65407da",
          "body": "Use Arel::Nodes::Exists and Arel::Nodes::Not instead of raw SQL string\nfor leaves_condition in MaterializedPath and MaterializedPathArray.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Convert leaves_condition to arel",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-10T01:34:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "278aaac5657d139b2bd2dbf163dddf6d96ffb7b1",
          "body": "Most looking forward to leaves conditions",
          "is_bot": false,
          "headline": "Move roots_condition and leaves_conditions into MaterializedPath",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-10T01:34:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7e870eb8e125a9b507c1167d09d2eaabda51159",
          "body": "Move unscoped_descendants and unscoped_descendants_before_last_save from\nInstanceMethods to the builder where they inline the format module call\ndirectly. Delete descendant_conditions and descendant_before_last_save_conditions\n— no callers remain.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Inline descendant conditions into builder",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T19:51:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a6deba49dfa1f8c8d87a276bed3bfedbcda4db70",
          "body": "Remove one layer of indirection. No longer call descendants_by_ancestry\n\nchanges to:\n - descendants_of\n - descendant_conditions\n - descendant_before_last_save_conditions",
          "is_bot": false,
          "headline": "Inline descendants_by_ancestry into its callers",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T19:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e45146750d814daf960c6242792c3d8ad344a514",
          "body": "Move callback methods to static helpers with builder wrappers",
          "is_bot": false,
          "headline": "Merge pull request #754 from kbrock/named_prefix",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T19:00:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cfb5d64c7468bed0af98b8873662842d880eaea",
          "body": "Move 7 callback-registered methods from InstanceMethods (shared module)\nto ClassMethods static helpers with one-line wrappers in the builder.\nParameterize association names in sync/lookup helpers.\n\nMethods moved: ancestry_exclude_self, update_descendants_with_new_ancestry,\napply_orphan_strategy_root\n[…]\nll site gets its own wrapper,\nenabling future multi-column support.\n\nAlso refactored scope_depth to write depth constraints directly instead\nof dispatching through the 5 named scopes. Same SQL output.",
          "is_bot": false,
          "headline": "Move callback methods to static helpers with builder wrappers",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T18:33:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "23c5d42e6115b681c092327f18a2e22bc809fda0",
          "body": "Doc cleanup",
          "is_bot": false,
          "headline": "Merge pull request #753 from kbrock/doc_cleanup",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T17:22:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8e65f25aabc1e8b9f22d151f9148547677fa439",
          "body": null,
          "is_bot": false,
          "headline": "Split more advanced config.md out of readme.md",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T04:59:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8df4a5c45fc468a501c4d4d7011cdd86b81e2a5",
          "body": null,
          "is_bot": false,
          "headline": "Add tests for a few extra operators",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-07T05:00:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe05257ab1639481ed4f689f751d7a8afc8e8d4a",
          "body": "Remove deprecated activerecord-trilogy-adapter from Appraisals",
          "is_bot": false,
          "headline": "Merge pull request #752 from kbrock/drop_trilogy_adapter_gem",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T21:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc4669782dc46810a399c461079a589371e150e4",
          "body": "Trilogy adapter is built into Rails 7.1+. The activerecord-trilogy-adapter\ngem is deprecated and not needed — trilogy support only targets Rails 7.1+.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove deprecated activerecord-trilogy-adapter from Appraisals",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T21:22:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0bc6dda8195be85e4a3d9d40acb4d088ffd69a3e",
          "body": "Add trilogy adapter support and make mysql2 optional",
          "is_bot": false,
          "headline": "Merge pull request #751 from kbrock/optional_mysql",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T04:43:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d70be7d5d29f51256402bebd2f717c005db10126",
          "body": "mysql2 requires native MySQL libraries which not all developers have\ninstalled. Gate mysql2 behind BUNDLE_INSTALL_MYSQL=1 in the main\nGemfile. Appraisal gemfiles keep mysql2 hardcoded for CI.\n\nAdd trilogy adapter support throughout:\n- Add \"trilogy\" to all mysql adapter name checks in format modules\n\n[…]\nmfile_72 for CI\n- Normalize DB=trilogy in test environment\n\nCo-Authored-By: Daniel Berger <78529+djberg96@users.noreply.github.com>\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add trilogy adapter support and make mysql2 optional for development",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T04:30:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42b36c2faafcad412c702f38a783585a57c6e513",
          "body": "Support UUID and string primary keys with array format",
          "is_bot": false,
          "headline": "Merge pull request #750 from kbrock/array_uuid_support",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T03:47:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72815e93f9d4f6e5b1afd4426e63220577b5d06a",
          "body": "The array format hardcoded ::integer[] casts in all SQL, preventing\nUUID or string primary keys from working. Now derives the cast type\nfrom the values (integer vs string) and uses ::varchar[] for non-integer.\n\nChanges:\n- Add array_literal helper to MaterializedPathArray for proper quoting\n  and cas\n[…]\normat: option to t.ancestry migration helper\n  (creates text[] column for non-integer formats)\n- Remove array skip from UUID tests\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support UUID and string primary keys with array format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T03:42:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a33ec3a75ca5520685640b789525dc3130f2db7",
          "body": "Clean up test output and fix cross-format test infrastructure",
          "is_bot": false,
          "headline": "Merge pull request #748 from kbrock/run_all_tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-30T04:01:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a6f4bdca0439355920fd8db05335ee8e33e2a2f",
          "body": "- Create ltree extension on all pg runs, not just FORMAT=ltree\n- Use skip instead of return-unless for pg-only tests (ltree, array)\n- Skip array DB tests on Rails < 7.0 (column cache reset issue)\n- Silence deprecation warning in depth_cache_column test\n- Add assertion to test_node_before_last_save (was raise-only)\n- Add array reparent-across-trees test (verifies prefix matching fix)\n- Add CI status badge to README\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Clean up test output and fix cross-format test infrastructure",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-30T03:40:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cefd004432f36b27749ddcd76674a19e57eba745",
          "body": "Switch descendants_condition from @> containment to slice prefix\nmatching (ancestry[1:N] = ARRAY[...]). Containment is order-independent\nand returns incorrect results during cascading moves when ancestry is\nbeing rewritten (same root cause as stale ancestry bug #735/#739).\n\nPrefix matching is correc\n[…]\n (GIN-indexed, fast reads):\n#   Arel.sql(\"#{col} @> ARRAY[#{ids}]::integer[]\")\n# Restore once stale ancestry fix (#735) is merged.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix array format descendants query to use prefix matching",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-30T03:35:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "855fd2ca93fecc08759e60c3df8b829fad394be1",
          "body": "When a test passes ancestry_format: to with_model (e.g., array test\nrunning on an mp2 CI entry), the table column type differs from what\nActiveRecord cached from the previous test. Reset column information\nbefore and after has_ancestry to ensure the model sees the correct\ncolumn type.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix column cache when tests use non-default ancestry format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-29T17:15:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "054cc50fc5baee2b8a565ed7bd2fc699cd21cb29",
          "body": "- Add array format entry (8.1 + Ruby 3.4)\n- Run mysql tests on one matrix entry only (mp1 + 7.2) instead of all\n- Set ANCESTRY_COLUMN=ancestry_alt globally instead of separate pg steps\n- Remove duplicate run on pg alt column + sql step (was running twice)\n- Skip sqlite for ltree and array (pg-only formats)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Streamline CI matrix: add array format, reduce redundant runs",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-28T07:48:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87108ba6bc73875acd342ed5b8d94642ab0cf41e",
          "body": "- Remove FORMAT guards from mp1/mp2/mp3 tests; use ancestry_format: option\n  so tests run on every local run regardless of FORMAT env var\n- Add array_test.rb and expand ltree_test.rb with parse/generate unit tests\n  (pure Ruby, no DB), DB tree operations, and sql update strategy tests\n- Add sql upda\n[…]\nity\n- Drop unused MaterializedPathArray.delimiter method\n- Document unreachable blank branches in ltree/array replace_ancestry_sql\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Improve test coverage across formats and update strategies",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-28T07:48:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "863e12cd0394309809b65e47f0c64ca646d4e391",
          "body": "Ltree aliased parse_integer to parse, always returning integers via\nto_i. Array did the same. This prevents future use with string-based\nancestry keys since parse would destroy string values.\n\nNow parse returns strings (like mp1/mp2/mp3) and parse_integer returns\nintegers. The builder selects the correct method based on integer_pk\nat build time.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Split parse and parse_integer for ltree and array formats",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-28T07:48:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b25f66b3b851241df4a6b64d178bdd0652aa1ee0",
          "body": "Remove dead primary_key_is_an_integer? and add PR template",
          "is_bot": false,
          "headline": "Merge pull request #746 from kbrock/remove_dead_code",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T05:56:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca68b380760d1c85c796cd36f2b9d6e617aab5eb",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pull request template",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T05:53:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "491e783935b136d4bb15a05c7a88559dbf5109a4",
          "body": "No longer called after #744 baked integer_pk into the builder.\nThe builder now resolves integer vs string PK at build time via\nprimary_key_format symbols (:integer, :uuid, :string).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove dead primary_key_is_an_integer? method",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T05:42:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b816752c121712d59b2e6350a5619634d58bb29",
          "body": "Move ordered_by_ancestry to format modules",
          "is_bot": false,
          "headline": "Merge pull request #745 from kbrock/ordered_by_ancestry",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:48:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7de7d1b91336ee414b0e81219692096f49f0a93c",
          "body": "Extract adapter-sniffing and Arel node construction from generated\ncode into format module methods. The builder now calls a one-liner.\n\nmp1: handles NULL roots with NULLS FIRST (6.1+) or COALESCE fallback\nmp2/mp3/ltree/array: simple ascending (no NULL handling needed)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Move ordered_by_ancestry to format modules",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:29:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c905a82fbb18c72dbca2761daec6e9def3b15511",
          "body": "Add UUID primary key support with primary_key_format symbols",
          "is_bot": false,
          "headline": "Merge pull request #744 from kbrock/uuid_tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:19:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b864073c95b66028a0c29e0009f36a523af9293a",
          "body": "We were determining this at runtime. now we are using the primary_key_format.\nThis removes the variable and gets statically set in the builder.\n\nwe are using 2 methods for parsing: parse, parse_integer. could have passed a true/false.\nroot no longer needs to be passed around as well.",
          "is_bot": false,
          "headline": "primary_key_is_an_integer determined up front",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:06:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b7b2875ca2af515370f10c8acf8fc3d9ec23ad7",
          "body": "Introduce primary_key_format: :uuid (and :string, :integer symbols)\nas alternatives to raw regex strings. Resolves to validation regex +\ninteger_pk boolean at build time.\n\nBake integer_pk as literal (true/false) in generated methods,\neliminating runtime DB introspection for known formats. Custom reg\n[…]\neger?\n\nAdd UUID test coverage: basic tree ops, moves, descendants/ancestors,\npredicates, orphan rootify, arrange, integrity check.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add UUID primary key support and bake integer_pk into builder",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:02:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2c57ed0a3a857834ee4356749366d7ff68c0314",
          "body": "Cache ancestor_ids to avoid re-parsing ancestry column",
          "is_bot": false,
          "headline": "Merge pull request #743 from kbrock/ancestor_ids_cache",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-26T03:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78fd3c2a5d65a113326714de81662a48c907d4f7",
          "body": "ancestor_ids is called by parent_id, root_id, depth, path_ids, and\npredicates — each re-parsing the ancestry string. Cache with ||= and\nclear on ancestor_ids=, reload. Freeze cached arrays to prevent\naccidental mutation.\n\nancestor_ids= caches the value directly (already parsed).\nparent= and parent_i\n[…]\n\nthe result (e.g., delete_if) must use non-mutating alternatives.\nFixed apply_orphan_strategy_adopt to use - instead of delete_if.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Cache ancestor_ids to avoid re-parsing ancestry column",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-26T02:20:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f049e25be599b4e49589f746a5b0ce25854ffdd",
          "body": "Optimize arrange_nodes for default rootify strategy",
          "is_bot": false,
          "headline": "Merge pull request #741 from kbrock/arrange_perf",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T07:02:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8bd54a9a47d42bede2eb76732ddac8247f90108",
          "body": "Check orphan_strategy once before the loop instead of branching\nper node. The default :rootify path uses a single `unless` check\n(matching v4.1 behavior), avoiding if/elsif/case on every iteration.\n\nBefore: 445 i/s (830 nodes)\nAfter:  600 i/s (830 nodes, 1.35x faster)\n\nNon-default strategies (:destroy, :restrict) use the branching path\nunchanged.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Optimize arrange_nodes for default rootify strategy",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:56:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f07dd2856d78a61893792d36547646aff9eb0765",
          "body": "Hardcode delimiter in format modules for parse performance",
          "is_bot": false,
          "headline": "Merge pull request #740 from kbrock/parse_perf",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:46:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84de51d1f7041cc9731dbf20bbf324d68cf8c963",
          "body": "Format modules now use their own DELIMITER constant internally.\nNo need to pass delimiter from the builder — each module knows\nits own delimiter. Removes 17 delimiter references from the\ninstance methods builder and 3 from the migration helper.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove delimiter parameter from format module methods",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:41:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a6610317a30954635bc89c90c1ff60ca3519555",
          "body": "Replace dynamic delimiter parameter with DELIMITER constant in\nMaterializedPath, MaterializedPath2, and MaterializedPath3.\n\nKey change: remove delete_if(&:blank?) from parse — mp1/mp3 don't\nneed it (no leading delimiter), mp2 uses [1..] instead (2x faster).\n\nBefore (shared parse with delete_if):\n  m\n[…]\n, no delete_if):\n  mp1 parse: 2.57M i/s  (2.4x faster)\n  mp2 parse: 1.93M i/s  (2.0x faster)\n  mp3 parse: 2.44M i/s  (2.4x faster)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Hardcode delimiter in format modules for parse performance",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:41:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "02641f5bc9dea157e66b16b742d3451426c5d03e",
          "body": "Revert cascading move fix (#735) due to write perf regression",
          "is_bot": false,
          "headline": "Merge pull request #739 from kbrock/rollback_refresh",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T05:02:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9cf83db04f43547d81deb87458c67e95fe1505a",
          "body": "Roll back #735 (refresh_ancestry_from_database). The before_update\nSELECT added +1 query per reparent (~25% write regression) to fix a\nscenario (cascading moves without reload in a single request) that\ndoesn't occur in practice.\n\nStale ancestry tests are kept but skipped — documenting the known\nbug while we work on a zero-cost fix.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Revert cascading move fix due to write performance regression",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T04:57:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab8adc421e4c4c4a79487f9299c5547255b895ae",
          "body": "Add counter cache edge case tests and changelog update",
          "is_bot": false,
          "headline": "Merge pull request #738 from kbrock/test_improvements",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T03:13:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4baee7cbeba417cfe19b19802aaf97b4dcb1b26c",
          "body": "… 7.1+\n\nRails 7.1+ clears the flag between transactions, making our guard\nredundant. The transaction rollback on 0-row DELETE is the real\nprotection against double-decrement.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add TODO to remove @_trigger_destroy_callback guard when min Rails is…",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T03:09:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "776ec5708efedecafc500c02ec3b8cc0ab3a0ae0",
          "body": "Wrap check_ancestry_integrity!(report: :echo) with assert_output\nso the error message doesn't leak into test runner output.\n\nHandle Rails 6.0 same-object double destroy (callbacks fire twice\nbefore 6.1 when @_trigger_destroy_callback isn't cleared).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Capture stdout in integrity echo test and fix Rails 6.0 compat",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T03:01:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e36d339162810a55eb854ed4d5f88933aead1f6",
          "body": "Cover orphan strategies (destroy, rootify, adopt), subtree destroy,\nduplicate destroy (same object, two objects, already-deleted row),\nand a failing reproducer for #521 (move-then-destroy stale object\ncauses children_count = -1).\n\nThe adopt test documents that the guard asymmetry between\nincrease/up\n[…]\nte destroy tests document that Rails' transaction rollback\non 0-row DELETE is the real protection, not @_trigger_destroy_callback.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add counter cache edge case tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T02:37:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c95a2597ed1f8aa0c159c45a4cb4cdad729e1c7a",
          "body": null,
          "is_bot": false,
          "headline": "update changelog to capture new features added.",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T02:37:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "167a39a1df2a40985e175770d11ea906e6afc472",
          "body": "Hardcode pk and ids in builder for mp3 and ltree",
          "is_bot": false,
          "headline": "Merge pull request #737 from kbrock/mp3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T02:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6d5182f2bdd51e7218ad277f46e983d45f8cb6b",
          "body": null,
          "is_bot": false,
          "headline": "hard code the id where possible instead of looking up the primary_key",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-19T04:18:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49f91df16692c8366ede21f519e1c3ed63fc2b60",
          "body": null,
          "is_bot": false,
          "headline": "ltree is a string and the ids are integers. hardcode it",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-19T03:24:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58dd22439958576f83e7b1b10cb97b6c04ea5254",
          "body": null,
          "is_bot": false,
          "headline": "test materialized path 3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-19T03:16:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "448e6b6f396f96da11f234711fbb12c4b9026d2b",
          "body": "Introduce Int array format",
          "is_bot": false,
          "headline": "Merge pull request #736 from kbrock/intarray",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:33:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b280ba9ba4c15f9979b341c4cd1f5a4584a60679",
          "body": "for a new migration, no reason to support a legacy key.\n\nThis was a fixup. Sorry it didn't squash into the original commit",
          "is_bot": false,
          "headline": "Migration Helper: use format key instead of ancestry_format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b75930ed436e5fe048a85125c29117c30a022323",
          "body": "Stores ancestry as PostgreSQL integer arrays instead of delimited strings.\nUses slice prefix matching for descendants_condition (safe with stale\nin-memory state, though not GIN-indexed). Performance optimization to\nuse @> containment is deferred pending a fix for stale ancestry state\nafter cascading moves.",
          "is_bot": false,
          "headline": "Introduce MaterializedPathArray for PostgreSQL integer[] ancestry",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:17:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a29885a56383e5b889e50c330d298e4d9f24b464",
          "body": "Stale ancestry fix",
          "is_bot": false,
          "headline": "Merge pull request #735 from kbrock/stale_ancestry_fix",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:10:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4eb9c26dfec7ce28acbe13d278ee881656cade4d",
          "body": "The stale ancestry fix adds a refresh_ancestry_from_database SELECT\nbefore each move. Update assert_queries counts to reflect the +1 query:\n- setter parent=: 2→3\n- setter parent_id=: 3→4\n- counter cache move: 4→5\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update query count assertions for refresh_ancestry callback",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:51:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf242759f4b1a3e59c5a4d2990da9e650a6529bf",
          "body": "When node A moves, update_descendants changes B's ancestry in the DB\nbut not B's Ruby object. If B then moves without reload, dirty tracking\nhas the wrong \"before\" value, so update_descendants queries the wrong\nprefix and misses B's descendants.\n\nAdds before_update :refresh_ancestry_from_database which picks the real\nDB value and resets dirty tracking. update_descendants stays in\nafter_update — no callback ordering change.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix cascading moves orphaning descendants due to stale ancestry",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:51:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "46729f200acff4f59cf90e7a9cc6f32528d85eb4",
          "body": "Introduce t.ancestry migration helper for table setup",
          "is_bot": false,
          "headline": "Merge pull request #734 from kbrock/migration_helper",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:49:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d33646a73a08d2033d6f3ac7ad8d031553413936",
          "body": null,
          "is_bot": false,
          "headline": "Add migration helper to to readme.md and extract formats_and_columns.md",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:37:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d62705c71855c6d0f1af88ec7b179f97c2688c0",
          "body": "Adds Ancestry::Migration module extending TableDefinition with a\nt.ancestry helper that creates the correct column type, indexes,\ncollation, and cache columns based on format options.\n\nReplaces manual column/index/cache setup in test environment with\nthe new helper, removing the duplicated add_cache_column method.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Introduce t.ancestry migration helper for table setup",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:14:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b35cf64799d4b2f95fac074f4687ca23f6f60768",
          "body": "Add assert_queries test helper for SQL query count assertions",
          "is_bot": false,
          "headline": "Merge pull request #733 from kbrock/count_queries",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:14:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b37654c57287a19fe75e0012fc0c1dd4ed44e364",
          "body": "Introduces assert_queries(expected) helper that counts SQL queries\nin a block, filtering out transactions and schema queries. Supports\nboth exact counts and ranges. Applied to setter tests to document\nthe query cost of parent= and parent_id= moves.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add assert_queries test helper for SQL query count assertions",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T04:27:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f230145d5a53c3a831fdd037480a02e54f0593d8",
          "body": "Test cleanup",
          "is_bot": false,
          "headline": "Merge pull request #732 from kbrock/test_cleanup",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T03:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f54db2b49e5a915ba17d8b14d10e67571c9ec23",
          "body": "for some tests, we need to point to a particular serializer.\nWe have them for all but the original mode",
          "is_bot": false,
          "headline": "Introduce TestEnvironment#materialized_path",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T03:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29e08a2f1833ef5ced86027320769ec587b905a4",
          "body": "Probably want to extract this but for now to a migration helper\nor a generator\n\nFor now, creating it correctly.",
          "is_bot": false,
          "headline": "Add indexes for the various fields in tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T02:56:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58d6f5a3a7aef2ef725e647fd5a2045e1fc4bb09",
          "body": "Add verbose option to rebuild_counter_cache! for reporting",
          "is_bot": false,
          "headline": "Merge pull request #731 from kbrock/fixup_counter_cache",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T02:53:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a433ba020748e695bc51bd8571472d527f23425f",
          "body": "rebuild_counter_cache!(verbose: true) now returns the number of rows\nthat had incorrect counter values before the fix. Default behavior\nis unchanged (no extra query, returns nil).\n\nThe verbose pre-count uses the same correlated subquery as the bulk\nUPDATE — one index lookup per row on the ancestry c\n[…]\nardless of how many rows\nare wrong.\n\nInspired by counter_culture gem's fix_counts which reports\ndiscrepancies rather than silently fixing them.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add verbose option to rebuild_counter_cache! for reporting",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T23:39:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59da340e3bd1a5caf3c89977e35a9f8cca83062a",
          "body": "Make delimiter part of the materialized path format",
          "is_bot": false,
          "headline": "Merge pull request #730 from kbrock/drop_delimiter",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:16:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20a445d68c83d05f5e35af10203397f2f2495625",
          "body": "Introduce MaterializedPath using ltree",
          "is_bot": false,
          "headline": "Merge pull request #729 from kbrock/add_ltree",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:13:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d40a95923d93fb24e6e10a95841b9a6c7949b05",
          "body": null,
          "is_bot": false,
          "headline": "Make delimiter part of the materialized path format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:10:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "605c3e5a07c67233a15784d5aea7c4052f433f19",
          "body": null,
          "is_bot": false,
          "headline": "Introduce MaterializedPath using ltree",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:10:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dcde3dd079c9311f7688cc084537f56dcfffb31",
          "body": "Introduce Materialized path3",
          "is_bot": false,
          "headline": "Merge pull request #728 from kbrock/materialized_path3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T01:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d3b83bdf496818b7c78f6e6de5f7e0e753e5ede",
          "body": "This alters the way we handle the delimiters in materialized path\nmp:   1/2/3\nmp2: /1/2/3/\nmp3:  1/2/3/\n\nDetermining the one with the simplest code to generate sql/ruby code",
          "is_bot": false,
          "headline": "Introduce MaterializedPath3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-12T23:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c0ec12d576360da55a8814cfd6c42fbe9348c52",
          "body": null,
          "is_bot": false,
          "headline": "v6.0 CHANGELOG updated",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-12T23:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b28564d4c161d4486ab2c61fcf0961107e3f089d",
          "body": "Support all databases for virtual columns",
          "is_bot": false,
          "headline": "Merge pull request #727 from kbrock/virtual_everything",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T22:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4306f121a88dbb11790c2ad6e9fb9237bff265f3",
          "body": "For virtual columns, mysql does not support referencing the id column since\nit increments. Have noted that the root_id is not available on that platform",
          "is_bot": false,
          "headline": "Support all databases for virtual columns",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T22:17:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f3db71834247505ede2bdfe00e6d6d1f2f0ad15",
          "body": "Introduce leaves tests",
          "is_bot": false,
          "headline": "Merge pull request #726 from kbrock/leaf_nodes",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T05:57:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0749b59acdfc7b4c95cdcf290767e896e6a2c54",
          "body": "Input taken from #246 and #341\n\nIn a single query, brings back only leaf nodes.",
          "is_bot": false,
          "headline": "Introduce leaves",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T05:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15fae192f43886a8eb51d2005c36909b38fabade",
          "body": "Introduce leaves",
          "is_bot": false,
          "headline": "Merge pull request #725 from kbrock/leaf_nodes",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:20:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "249d86a0b3f81d5bea189ff9ef59c143fe2f06fe",
          "body": "Input taken from #246 and #341\n\nIn a single query, brings back only leaf nodes.",
          "is_bot": false,
          "headline": "Introduce leaves",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:08:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76ffc156d21611bd7c3df2a6392296673f90cafb",
          "body": "Add has_many :children",
          "is_bot": false,
          "headline": "Merge pull request #723 from kbrock/parent_associations",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:06:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2101b49f5cc38aec92327876dc9b63b64e982968",
          "body": "We introduced cached parent_id and root_id.\nThis adds associations for those relations like children, parent, and root\n\nAdd documentation for the developer as well",
          "is_bot": false,
          "headline": "Introduce has_many :children and belongs_to :parent",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:02:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "815c9ae3eccfe59bc525106a2c15abbe42552c6c",
          "body": "Use newer deprecation scheme",
          "is_bot": false,
          "headline": "Merge pull request #724 from kbrock/deprecation_method",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T01:11:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffee0ef2bfdea3842cf44d3bbc844004bf9d5414",
          "body": null,
          "is_bot": false,
          "headline": "Use newer deprecation scheme",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-10T21:29:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5f7e0ec4671f42a4487e331f7348841a04cce04",
          "body": "fix postgres root_id_sql (and extra tests for coverage)",
          "is_bot": false,
          "headline": "Merge pull request #722 from kbrock/more_tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-09T02:58:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90aa428fab60e71836349b194a73ec6ae52f4e76",
          "body": null,
          "is_bot": false,
          "headline": "test coverage",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-09T02:39:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b87fbd14bc8e7e275445e60cd886effaa28e7709",
          "body": null,
          "is_bot": false,
          "headline": "Fix root_id for postgres",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-09T02:39:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 28,
      "commits_last_year": 145,
      "latest_release_at": "2026-03-08T21:53:47Z",
      "latest_release_tag": "v5.1.0",
      "releases_from_tags": true,
      "days_since_last_push": 26,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 135,
      "mean_days_between_releases": 221.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ancestry",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/ancestry",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/stefankroes/ancestry/",
          "versions_count": 38,
          "total_downloads": 38034866,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2009-10-16T16:18:52.272000Z",
          "latest_published_at": "2026-03-08T22:01:59.049000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 135
        }
      ]
    },
    "popularity": {
      "forks": 472,
      "stars": 3878,
      "watchers": 45,
      "fork_history": {
        "days": [
          {
            "date": "2009-12-06",
            "count": 1
          },
          {
            "date": "2010-02-14",
            "count": 1
          },
          {
            "date": "2010-02-21",
            "count": 1
          },
          {
            "date": "2010-02-26",
            "count": 1
          },
          {
            "date": "2010-03-16",
            "count": 1
          },
          {
            "date": "2010-04-08",
            "count": 1
          },
          {
            "date": "2010-04-11",
            "count": 1
          },
          {
            "date": "2010-04-23",
            "count": 1
          },
          {
            "date": "2010-06-16",
            "count": 1
          },
          {
            "date": "2010-06-30",
            "count": 1
          },
          {
            "date": "2010-09-13",
            "count": 1
          },
          {
            "date": "2010-09-27",
            "count": 1
          },
          {
            "date": "2010-09-30",
            "count": 1
          },
          {
            "date": "2010-10-13",
            "count": 1
          },
          {
            "date": "2010-10-16",
            "count": 1
          },
          {
            "date": "2010-10-18",
            "count": 1
          },
          {
            "date": "2010-10-29",
            "count": 1
          },
          {
            "date": "2010-11-18",
            "count": 1
          },
          {
            "date": "2010-11-21",
            "count": 1
          },
          {
            "date": "2010-11-23",
            "count": 1
          },
          {
            "date": "2010-11-26",
            "count": 1
          },
          {
            "date": "2010-12-17",
            "count": 1
          },
          {
            "date": "2011-02-12",
            "count": 1
          },
          {
            "date": "2011-02-17",
            "count": 1
          },
          {
            "date": "2011-02-18",
            "count": 1
          },
          {
            "date": "2011-03-05",
            "count": 1
          },
          {
            "date": "2011-03-31",
            "count": 1
          },
          {
            "date": "2011-04-20",
            "count": 1
          },
          {
            "date": "2011-04-25",
            "count": 1
          },
          {
            "date": "2011-04-29",
            "count": 2
          },
          {
            "date": "2011-05-10",
            "count": 1
          },
          {
            "date": "2011-05-27",
            "count": 1
          },
          {
            "date": "2011-05-30",
            "count": 1
          },
          {
            "date": "2011-06-02",
            "count": 1
          },
          {
            "date": "2011-06-03",
            "count": 1
          },
          {
            "date": "2011-06-07",
            "count": 1
          },
          {
            "date": "2011-06-10",
            "count": 1
          },
          {
            "date": "2011-06-23",
            "count": 1
          },
          {
            "date": "2011-07-17",
            "count": 1
          },
          {
            "date": "2011-07-23",
            "count": 1
          },
          {
            "date": "2011-07-31",
            "count": 1
          },
          {
            "date": "2011-08-22",
            "count": 1
          },
          {
            "date": "2011-08-24",
            "count": 1
          },
          {
            "date": "2011-08-25",
            "count": 1
          },
          {
            "date": "2011-08-27",
            "count": 1
          },
          {
            "date": "2011-09-03",
            "count": 1
          },
          {
            "date": "2011-09-13",
            "count": 1
          },
          {
            "date": "2011-09-21",
            "count": 1
          },
          {
            "date": "2011-11-17",
            "count": 1
          },
          {
            "date": "2011-11-21",
            "count": 1
          },
          {
            "date": "2011-12-03",
            "count": 1
          },
          {
            "date": "2011-12-22",
            "count": 1
          },
          {
            "date": "2012-01-18",
            "count": 1
          },
          {
            "date": "2012-01-28",
            "count": 1
          },
          {
            "date": "2012-02-10",
            "count": 1
          },
          {
            "date": "2012-02-23",
            "count": 1
          },
          {
            "date": "2012-02-27",
            "count": 1
          },
          {
            "date": "2012-03-09",
            "count": 1
          },
          {
            "date": "2012-03-11",
            "count": 1
          },
          {
            "date": "2012-03-14",
            "count": 1
          },
          {
            "date": "2012-04-15",
            "count": 1
          },
          {
            "date": "2012-05-22",
            "count": 1
          },
          {
            "date": "2012-05-28",
            "count": 1
          },
          {
            "date": "2012-06-13",
            "count": 1
          },
          {
            "date": "2012-06-28",
            "count": 1
          },
          {
            "date": "2012-07-02",
            "count": 1
          },
          {
            "date": "2012-08-01",
            "count": 3
          },
          {
            "date": "2012-08-21",
            "count": 1
          },
          {
            "date": "2012-08-23",
            "count": 1
          },
          {
            "date": "2012-09-16",
            "count": 1
          },
          {
            "date": "2012-09-25",
            "count": 1
          },
          {
            "date": "2012-09-26",
            "count": 1
          },
          {
            "date": "2012-09-30",
            "count": 1
          },
          {
            "date": "2012-10-03",
            "count": 1
          },
          {
            "date": "2012-10-04",
            "count": 2
          },
          {
            "date": "2012-10-05",
            "count": 1
          },
          {
            "date": "2012-10-13",
            "count": 1
          },
          {
            "date": "2012-10-24",
            "count": 1
          },
          {
            "date": "2012-12-11",
            "count": 1
          },
          {
            "date": "2012-12-13",
            "count": 1
          },
          {
            "date": "2012-12-18",
            "count": 1
          },
          {
            "date": "2013-01-06",
            "count": 1
          },
          {
            "date": "2013-01-07",
            "count": 1
          },
          {
            "date": "2013-01-11",
            "count": 1
          },
          {
            "date": "2013-01-23",
            "count": 1
          },
          {
            "date": "2013-01-25",
            "count": 1
          },
          {
            "date": "2013-01-29",
            "count": 2
          },
          {
            "date": "2013-01-31",
            "count": 1
          },
          {
            "date": "2013-02-11",
            "count": 1
          },
          {
            "date": "2013-02-18",
            "count": 1
          },
          {
            "date": "2013-02-20",
            "count": 1
          },
          {
            "date": "2013-02-21",
            "count": 1
          },
          {
            "date": "2013-02-22",
            "count": 1
          },
          {
            "date": "2013-03-01",
            "count": 1
          },
          {
            "date": "2013-03-06",
            "count": 2
          },
          {
            "date": "2013-03-16",
            "count": 1
          },
          {
            "date": "2013-03-25",
            "count": 1
          },
          {
            "date": "2013-04-01",
            "count": 1
          },
          {
            "date": "2013-04-03",
            "count": 1
          },
          {
            "date": "2013-04-08",
            "count": 1
          },
          {
            "date": "2013-04-09",
            "count": 1
          },
          {
            "date": "2013-04-11",
            "count": 1
          },
          {
            "date": "2013-04-19",
            "count": 1
          },
          {
            "date": "2013-05-02",
            "count": 1
          },
          {
            "date": "2013-05-03",
            "count": 1
          },
          {
            "date": "2013-05-07",
            "count": 1
          },
          {
            "date": "2013-05-18",
            "count": 1
          },
          {
            "date": "2013-05-21",
            "count": 1
          },
          {
            "date": "2013-06-02",
            "count": 1
          },
          {
            "date": "2013-06-10",
            "count": 1
          },
          {
            "date": "2013-06-14",
            "count": 1
          },
          {
            "date": "2013-06-18",
            "count": 1
          },
          {
            "date": "2013-06-19",
            "count": 1
          },
          {
            "date": "2013-06-24",
            "count": 1
          },
          {
            "date": "2013-07-07",
            "count": 1
          },
          {
            "date": "2013-07-15",
            "count": 1
          },
          {
            "date": "2013-07-19",
            "count": 1
          },
          {
            "date": "2013-07-21",
            "count": 1
          },
          {
            "date": "2013-08-01",
            "count": 1
          },
          {
            "date": "2013-08-04",
            "count": 1
          },
          {
            "date": "2013-08-13",
            "count": 1
          },
          {
            "date": "2013-08-15",
            "count": 1
          },
          {
            "date": "2013-08-16",
            "count": 1
          },
          {
            "date": "2013-08-23",
            "count": 1
          },
          {
            "date": "2013-08-28",
            "count": 1
          },
          {
            "date": "2013-09-05",
            "count": 1
          },
          {
            "date": "2013-09-08",
            "count": 1
          },
          {
            "date": "2013-09-17",
            "count": 2
          },
          {
            "date": "2013-10-03",
            "count": 1
          },
          {
            "date": "2013-10-18",
            "count": 1
          },
          {
            "date": "2013-10-25",
            "count": 1
          },
          {
            "date": "2013-10-26",
            "count": 1
          },
          {
            "date": "2013-11-04",
            "count": 1
          },
          {
            "date": "2013-11-15",
            "count": 1
          },
          {
            "date": "2013-11-24",
            "count": 1
          },
          {
            "date": "2013-11-26",
            "count": 1
          },
          {
            "date": "2013-12-05",
            "count": 1
          },
          {
            "date": "2013-12-16",
            "count": 1
          },
          {
            "date": "2013-12-18",
            "count": 1
          },
          {
            "date": "2013-12-27",
            "count": 1
          },
          {
            "date": "2014-01-04",
            "count": 1
          },
          {
            "date": "2014-01-27",
            "count": 1
          },
          {
            "date": "2014-02-01",
            "count": 1
          },
          {
            "date": "2014-02-05",
            "count": 1
          },
          {
            "date": "2014-02-10",
            "count": 1
          },
          {
            "date": "2014-02-12",
            "count": 1
          },
          {
            "date": "2014-02-26",
            "count": 1
          },
          {
            "date": "2014-03-04",
            "count": 1
          },
          {
            "date": "2014-03-17",
            "count": 1
          },
          {
            "date": "2014-03-19",
            "count": 1
          },
          {
            "date": "2014-03-20",
            "count": 1
          },
          {
            "date": "2014-04-01",
            "count": 1
          },
          {
            "date": "2014-04-16",
            "count": 1
          },
          {
            "date": "2014-04-26",
            "count": 1
          },
          {
            "date": "2014-04-30",
            "count": 1
          },
          {
            "date": "2014-05-05",
            "count": 1
          },
          {
            "date": "2014-05-12",
            "count": 1
          },
          {
            "date": "2014-05-16",
            "count": 1
          },
          {
            "date": "2014-05-19",
            "count": 1
          },
          {
            "date": "2014-05-22",
            "count": 1
          },
          {
            "date": "2014-05-27",
            "count": 1
          },
          {
            "date": "2014-06-06",
            "count": 1
          },
          {
            "date": "2014-06-09",
            "count": 1
          },
          {
            "date": "2014-06-30",
            "count": 1
          },
          {
            "date": "2014-07-01",
            "count": 1
          },
          {
            "date": "2014-07-07",
            "count": 1
          },
          {
            "date": "2014-07-13",
            "count": 1
          },
          {
            "date": "2014-07-17",
            "count": 1
          },
          {
            "date": "2014-07-19",
            "count": 2
          },
          {
            "date": "2014-07-29",
            "count": 1
          },
          {
            "date": "2014-08-16",
            "count": 1
          },
          {
            "date": "2014-08-17",
            "count": 1
          },
          {
            "date": "2014-08-18",
            "count": 2
          },
          {
            "date": "2014-09-26",
            "count": 1
          },
          {
            "date": "2014-10-08",
            "count": 1
          },
          {
            "date": "2014-10-13",
            "count": 1
          },
          {
            "date": "2014-10-14",
            "count": 1
          },
          {
            "date": "2014-10-17",
            "count": 1
          },
          {
            "date": "2014-10-23",
            "count": 1
          },
          {
            "date": "2014-11-05",
            "count": 1
          },
          {
            "date": "2014-11-13",
            "count": 1
          },
          {
            "date": "2014-11-29",
            "count": 1
          },
          {
            "date": "2014-12-10",
            "count": 1
          },
          {
            "date": "2014-12-24",
            "count": 1
          },
          {
            "date": "2014-12-31",
            "count": 1
          },
          {
            "date": "2015-01-07",
            "count": 1
          },
          {
            "date": "2015-01-12",
            "count": 1
          },
          {
            "date": "2015-01-28",
            "count": 1
          },
          {
            "date": "2015-02-14",
            "count": 1
          },
          {
            "date": "2015-03-05",
            "count": 1
          },
          {
            "date": "2015-03-10",
            "count": 1
          },
          {
            "date": "2015-03-12",
            "count": 1
          },
          {
            "date": "2015-03-22",
            "count": 1
          },
          {
            "date": "2015-04-06",
            "count": 1
          },
          {
            "date": "2015-04-20",
            "count": 1
          },
          {
            "date": "2015-05-02",
            "count": 1
          },
          {
            "date": "2015-05-12",
            "count": 1
          },
          {
            "date": "2015-05-13",
            "count": 1
          },
          {
            "date": "2015-05-24",
            "count": 1
          },
          {
            "date": "2015-05-29",
            "count": 1
          },
          {
            "date": "2015-07-01",
            "count": 1
          },
          {
            "date": "2015-07-15",
            "count": 1
          },
          {
            "date": "2015-08-11",
            "count": 1
          },
          {
            "date": "2015-09-02",
            "count": 1
          },
          {
            "date": "2015-09-07",
            "count": 1
          },
          {
            "date": "2015-09-09",
            "count": 1
          },
          {
            "date": "2015-09-14",
            "count": 1
          },
          {
            "date": "2015-09-20",
            "count": 1
          },
          {
            "date": "2015-09-22",
            "count": 1
          },
          {
            "date": "2015-10-14",
            "count": 1
          },
          {
            "date": "2015-10-20",
            "count": 1
          },
          {
            "date": "2015-10-29",
            "count": 1
          },
          {
            "date": "2015-11-11",
            "count": 1
          },
          {
            "date": "2015-11-16",
            "count": 1
          },
          {
            "date": "2015-11-24",
            "count": 1
          },
          {
            "date": "2015-11-27",
            "count": 1
          },
          {
            "date": "2015-11-29",
            "count": 1
          },
          {
            "date": "2015-12-03",
            "count": 2
          },
          {
            "date": "2015-12-29",
            "count": 1
          },
          {
            "date": "2016-01-06",
            "count": 1
          },
          {
            "date": "2016-01-07",
            "count": 1
          },
          {
            "date": "2016-01-13",
            "count": 1
          },
          {
            "date": "2016-02-11",
            "count": 1
          },
          {
            "date": "2016-02-15",
            "count": 1
          },
          {
            "date": "2016-02-22",
            "count": 1
          },
          {
            "date": "2016-02-24",
            "count": 1
          },
          {
            "date": "2016-02-27",
            "count": 1
          },
          {
            "date": "2016-03-07",
            "count": 1
          },
          {
            "date": "2016-03-17",
            "count": 1
          },
          {
            "date": "2016-03-30",
            "count": 1
          },
          {
            "date": "2016-04-29",
            "count": 1
          },
          {
            "date": "2016-05-05",
            "count": 1
          },
          {
            "date": "2016-05-13",
            "count": 1
          },
          {
            "date": "2016-05-30",
            "count": 1
          },
          {
            "date": "2016-06-22",
            "count": 1
          },
          {
            "date": "2016-06-28",
            "count": 1
          },
          {
            "date": "2016-07-06",
            "count": 1
          },
          {
            "date": "2016-07-31",
            "count": 1
          },
          {
            "date": "2016-08-11",
            "count": 1
          },
          {
            "date": "2016-09-17",
            "count": 1
          },
          {
            "date": "2016-09-19",
            "count": 1
          },
          {
            "date": "2016-09-20",
            "count": 1
          },
          {
            "date": "2016-09-27",
            "count": 1
          },
          {
            "date": "2016-10-18",
            "count": 1
          },
          {
            "date": "2016-10-22",
            "count": 1
          },
          {
            "date": "2016-10-25",
            "count": 1
          },
          {
            "date": "2016-10-28",
            "count": 1
          },
          {
            "date": "2016-11-04",
            "count": 1
          },
          {
            "date": "2016-12-16",
            "count": 1
          },
          {
            "date": "2017-01-11",
            "count": 1
          },
          {
            "date": "2017-03-09",
            "count": 1
          },
          {
            "date": "2017-04-07",
            "count": 1
          },
          {
            "date": "2017-04-27",
            "count": 1
          },
          {
            "date": "2017-04-30",
            "count": 1
          },
          {
            "date": "2017-05-04",
            "count": 1
          },
          {
            "date": "2017-05-10",
            "count": 1
          },
          {
            "date": "2017-05-20",
            "count": 2
          },
          {
            "date": "2017-06-01",
            "count": 1
          },
          {
            "date": "2017-06-06",
            "count": 1
          },
          {
            "date": "2017-06-14",
            "count": 1
          },
          {
            "date": "2017-06-20",
            "count": 1
          },
          {
            "date": "2017-07-03",
            "count": 1
          },
          {
            "date": "2017-08-07",
            "count": 1
          },
          {
            "date": "2017-08-11",
            "count": 1
          },
          {
            "date": "2017-08-15",
            "count": 1
          },
          {
            "date": "2017-08-28",
            "count": 1
          },
          {
            "date": "2017-08-29",
            "count": 1
          },
          {
            "date": "2017-08-30",
            "count": 1
          },
          {
            "date": "2017-09-04",
            "count": 1
          },
          {
            "date": "2017-09-07",
            "count": 1
          },
          {
            "date": "2017-09-22",
            "count": 1
          },
          {
            "date": "2017-09-23",
            "count": 1
          },
          {
            "date": "2017-10-04",
            "count": 1
          },
          {
            "date": "2017-10-10",
            "count": 2
          },
          {
            "date": "2017-10-13",
            "count": 1
          },
          {
            "date": "2017-10-16",
            "count": 1
          },
          {
            "date": "2017-11-14",
            "count": 1
          },
          {
            "date": "2017-12-05",
            "count": 2
          },
          {
            "date": "2017-12-10",
            "count": 1
          },
          {
            "date": "2017-12-11",
            "count": 1
          },
          {
            "date": "2017-12-26",
            "count": 2
          },
          {
            "date": "2017-12-27",
            "count": 1
          },
          {
            "date": "2018-01-02",
            "count": 1
          },
          {
            "date": "2018-01-05",
            "count": 1
          },
          {
            "date": "2018-01-07",
            "count": 1
          },
          {
            "date": "2018-01-10",
            "count": 1
          },
          {
            "date": "2018-01-25",
            "count": 1
          },
          {
            "date": "2018-02-06",
            "count": 1
          },
          {
            "date": "2018-02-15",
            "count": 1
          },
          {
            "date": "2018-03-07",
            "count": 1
          },
          {
            "date": "2018-03-15",
            "count": 2
          },
          {
            "date": "2018-03-28",
            "count": 1
          },
          {
            "date": "2018-04-02",
            "count": 1
          },
          {
            "date": "2018-04-04",
            "count": 1
          },
          {
            "date": "2018-04-10",
            "count": 1
          },
          {
            "date": "2018-04-13",
            "count": 1
          },
          {
            "date": "2018-04-16",
            "count": 1
          },
          {
            "date": "2018-04-17",
            "count": 1
          },
          {
            "date": "2018-04-24",
            "count": 1
          },
          {
            "date": "2018-05-02",
            "count": 1
          },
          {
            "date": "2018-05-07",
            "count": 1
          },
          {
            "date": "2018-05-09",
            "count": 1
          },
          {
            "date": "2018-05-17",
            "count": 1
          },
          {
            "date": "2018-05-22",
            "count": 1
          },
          {
            "date": "2018-05-28",
            "count": 1
          },
          {
            "date": "2018-06-14",
            "count": 1
          },
          {
            "date": "2018-06-26",
            "count": 1
          },
          {
            "date": "2018-07-17",
            "count": 1
          },
          {
            "date": "2018-07-19",
            "count": 1
          },
          {
            "date": "2018-08-02",
            "count": 1
          },
          {
            "date": "2018-08-12",
            "count": 1
          },
          {
            "date": "2018-08-16",
            "count": 1
          },
          {
            "date": "2018-08-27",
            "count": 1
          },
          {
            "date": "2018-08-30",
            "count": 1
          },
          {
            "date": "2018-10-08",
            "count": 1
          },
          {
            "date": "2018-10-25",
            "count": 1
          },
          {
            "date": "2018-11-17",
            "count": 1
          },
          {
            "date": "2018-12-16",
            "count": 1
          },
          {
            "date": "2018-12-20",
            "count": 1
          },
          {
            "date": "2019-02-12",
            "count": 1
          },
          {
            "date": "2019-02-19",
            "count": 1
          },
          {
            "date": "2019-03-16",
            "count": 1
          },
          {
            "date": "2019-04-21",
            "count": 2
          },
          {
            "date": "2019-04-23",
            "count": 1
          },
          {
            "date": "2019-06-17",
            "count": 1
          },
          {
            "date": "2019-06-25",
            "count": 1
          },
          {
            "date": "2019-07-10",
            "count": 1
          },
          {
            "date": "2019-07-27",
            "count": 1
          },
          {
            "date": "2019-08-12",
            "count": 1
          },
          {
            "date": "2019-08-15",
            "count": 1
          },
          {
            "date": "2019-10-13",
            "count": 1
          },
          {
            "date": "2019-10-16",
            "count": 1
          },
          {
            "date": "2019-10-18",
            "count": 1
          },
          {
            "date": "2019-11-14",
            "count": 1
          },
          {
            "date": "2019-11-19",
            "count": 1
          },
          {
            "date": "2019-11-27",
            "count": 1
          },
          {
            "date": "2019-12-18",
            "count": 1
          },
          {
            "date": "2019-12-27",
            "count": 1
          },
          {
            "date": "2020-01-30",
            "count": 1
          },
          {
            "date": "2020-02-24",
            "count": 1
          },
          {
            "date": "2020-04-06",
            "count": 1
          },
          {
            "date": "2020-04-20",
            "count": 1
          },
          {
            "date": "2020-04-24",
            "count": 1
          },
          {
            "date": "2020-07-08",
            "count": 1
          },
          {
            "date": "2020-07-09",
            "count": 1
          },
          {
            "date": "2020-07-22",
            "count": 1
          },
          {
            "date": "2020-07-30",
            "count": 1
          },
          {
            "date": "2020-08-04",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-09-17",
            "count": 2
          },
          {
            "date": "2020-09-23",
            "count": 2
          },
          {
            "date": "2020-10-20",
            "count": 1
          },
          {
            "date": "2020-10-26",
            "count": 1
          },
          {
            "date": "2021-01-04",
            "count": 1
          },
          {
            "date": "2021-01-21",
            "count": 1
          },
          {
            "date": "2021-01-29",
            "count": 1
          },
          {
            "date": "2021-01-30",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 1
          },
          {
            "date": "2021-04-16",
            "count": 2
          },
          {
            "date": "2021-04-28",
            "count": 1
          },
          {
            "date": "2021-04-29",
            "count": 1
          },
          {
            "date": "2021-05-10",
            "count": 2
          },
          {
            "date": "2021-05-26",
            "count": 1
          },
          {
            "date": "2021-05-31",
            "count": 1
          },
          {
            "date": "2021-07-13",
            "count": 1
          },
          {
            "date": "2021-08-05",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-11-10",
            "count": 1
          },
          {
            "date": "2021-11-19",
            "count": 1
          },
          {
            "date": "2021-11-21",
            "count": 1
          },
          {
            "date": "2021-11-25",
            "count": 1
          },
          {
            "date": "2021-12-25",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 2
          },
          {
            "date": "2021-12-30",
            "count": 1
          },
          {
            "date": "2022-02-09",
            "count": 1
          },
          {
            "date": "2022-03-04",
            "count": 1
          },
          {
            "date": "2022-03-25",
            "count": 1
          },
          {
            "date": "2022-04-26",
            "count": 1
          },
          {
            "date": "2022-05-19",
            "count": 1
          },
          {
            "date": "2022-06-10",
            "count": 1
          },
          {
            "date": "2022-07-10",
            "count": 1
          },
          {
            "date": "2022-09-01",
            "count": 1
          },
          {
            "date": "2022-09-05",
            "count": 1
          },
          {
            "date": "2022-09-29",
            "count": 1
          },
          {
            "date": "2022-10-31",
            "count": 1
          },
          {
            "date": "2022-11-05",
            "count": 1
          },
          {
            "date": "2022-12-07",
            "count": 1
          },
          {
            "date": "2023-01-01",
            "count": 1
          },
          {
            "date": "2023-01-25",
            "count": 1
          },
          {
            "date": "2023-02-02",
            "count": 1
          },
          {
            "date": "2023-02-20",
            "count": 1
          },
          {
            "date": "2023-03-09",
            "count": 1
          },
          {
            "date": "2023-03-28",
            "count": 1
          },
          {
            "date": "2023-05-07",
            "count": 1
          },
          {
            "date": "2023-05-10",
            "count": 1
          },
          {
            "date": "2023-05-29",
            "count": 1
          },
          {
            "date": "2023-07-12",
            "count": 1
          },
          {
            "date": "2023-07-27",
            "count": 1
          },
          {
            "date": "2023-08-27",
            "count": 1
          },
          {
            "date": "2023-09-08",
            "count": 1
          },
          {
            "date": "2024-01-17",
            "count": 1
          },
          {
            "date": "2024-02-28",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 1
          },
          {
            "date": "2024-05-05",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 2
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2024-10-29",
            "count": 1
          },
          {
            "date": "2024-12-12",
            "count": 1
          },
          {
            "date": "2025-02-07",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-25",
            "count": 1
          },
          {
            "date": "2025-06-25",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 1
          },
          {
            "date": "2025-07-15",
            "count": 1
          },
          {
            "date": "2025-10-17",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-12-11",
            "count": 1
          },
          {
            "date": "2026-01-02",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-30",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 450,
        "total_forks": 472
      },
      "star_history": {
        "days": [
          {
            "date": "2020-03-25",
            "count": 1
          },
          {
            "date": "2020-03-31",
            "count": 1
          },
          {
            "date": "2020-04-01",
            "count": 2
          },
          {
            "date": "2020-04-04",
            "count": 1
          },
          {
            "date": "2020-04-06",
            "count": 1
          },
          {
            "date": "2020-04-08",
            "count": 2
          },
          {
            "date": "2020-04-09",
            "count": 1
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-13",
            "count": 1
          },
          {
            "date": "2020-04-17",
            "count": 2
          },
          {
            "date": "2020-04-23",
            "count": 1
          },
          {
            "date": "2020-04-27",
            "count": 1
          },
          {
            "date": "2020-04-28",
            "count": 2
          },
          {
            "date": "2020-04-29",
            "count": 1
          },
          {
            "date": "2020-05-08",
            "count": 1
          },
          {
            "date": "2020-05-12",
            "count": 2
          },
          {
            "date": "2020-05-17",
            "count": 1
          },
          {
            "date": "2020-05-18",
            "count": 2
          },
          {
            "date": "2020-05-19",
            "count": 1
          },
          {
            "date": "2020-05-20",
            "count": 1
          },
          {
            "date": "2020-05-26",
            "count": 1
          },
          {
            "date": "2020-05-28",
            "count": 1
          },
          {
            "date": "2020-05-29",
            "count": 2
          },
          {
            "date": "2020-05-30",
            "count": 2
          },
          {
            "date": "2020-05-31",
            "count": 1
          },
          {
            "date": "2020-06-01",
            "count": 1
          },
          {
            "date": "2020-06-04",
            "count": 1
          },
          {
            "date": "2020-06-07",
            "count": 1
          },
          {
            "date": "2020-06-09",
            "count": 4
          },
          {
            "date": "2020-06-10",
            "count": 2
          },
          {
            "date": "2020-06-13",
            "count": 1
          },
          {
            "date": "2020-06-17",
            "count": 1
          },
          {
            "date": "2020-06-20",
            "count": 2
          },
          {
            "date": "2020-06-21",
            "count": 2
          },
          {
            "date": "2020-06-23",
            "count": 1
          },
          {
            "date": "2020-06-24",
            "count": 3
          },
          {
            "date": "2020-06-25",
            "count": 1
          },
          {
            "date": "2020-06-27",
            "count": 1
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-07-02",
            "count": 1
          },
          {
            "date": "2020-07-06",
            "count": 1
          },
          {
            "date": "2020-07-07",
            "count": 1
          },
          {
            "date": "2020-07-08",
            "count": 2
          },
          {
            "date": "2020-07-10",
            "count": 1
          },
          {
            "date": "2020-07-11",
            "count": 1
          },
          {
            "date": "2020-07-13",
            "count": 1
          },
          {
            "date": "2020-07-14",
            "count": 1
          },
          {
            "date": "2020-07-15",
            "count": 4
          },
          {
            "date": "2020-07-21",
            "count": 4
          },
          {
            "date": "2020-07-27",
            "count": 1
          },
          {
            "date": "2020-08-04",
            "count": 1
          },
          {
            "date": "2020-08-06",
            "count": 14
          },
          {
            "date": "2020-08-07",
            "count": 15
          },
          {
            "date": "2020-08-08",
            "count": 5
          },
          {
            "date": "2020-08-09",
            "count": 5
          },
          {
            "date": "2020-08-10",
            "count": 3
          },
          {
            "date": "2020-08-11",
            "count": 6
          },
          {
            "date": "2020-08-12",
            "count": 3
          },
          {
            "date": "2020-08-13",
            "count": 2
          },
          {
            "date": "2020-08-15",
            "count": 1
          },
          {
            "date": "2020-08-19",
            "count": 2
          },
          {
            "date": "2020-08-20",
            "count": 4
          },
          {
            "date": "2020-08-21",
            "count": 1
          },
          {
            "date": "2020-08-23",
            "count": 2
          },
          {
            "date": "2020-08-24",
            "count": 1
          },
          {
            "date": "2020-08-27",
            "count": 2
          },
          {
            "date": "2020-08-28",
            "count": 1
          },
          {
            "date": "2020-08-29",
            "count": 1
          },
          {
            "date": "2020-09-02",
            "count": 1
          },
          {
            "date": "2020-09-03",
            "count": 3
          },
          {
            "date": "2020-09-04",
            "count": 1
          },
          {
            "date": "2020-09-06",
            "count": 1
          },
          {
            "date": "2020-09-07",
            "count": 1
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-09-09",
            "count": 1
          },
          {
            "date": "2020-09-10",
            "count": 2
          },
          {
            "date": "2020-09-16",
            "count": 1
          },
          {
            "date": "2020-09-17",
            "count": 1
          },
          {
            "date": "2020-09-19",
            "count": 1
          },
          {
            "date": "2020-09-22",
            "count": 1
          },
          {
            "date": "2020-09-26",
            "count": 1
          },
          {
            "date": "2020-09-27",
            "count": 1
          },
          {
            "date": "2020-09-29",
            "count": 1
          },
          {
            "date": "2020-09-30",
            "count": 2
          },
          {
            "date": "2020-10-05",
            "count": 2
          },
          {
            "date": "2020-10-06",
            "count": 1
          },
          {
            "date": "2020-10-07",
            "count": 1
          },
          {
            "date": "2020-10-12",
            "count": 1
          },
          {
            "date": "2020-10-13",
            "count": 1
          },
          {
            "date": "2020-10-15",
            "count": 4
          },
          {
            "date": "2020-10-18",
            "count": 1
          },
          {
            "date": "2020-10-19",
            "count": 8
          },
          {
            "date": "2020-10-20",
            "count": 1
          },
          {
            "date": "2020-10-21",
            "count": 5
          },
          {
            "date": "2020-10-24",
            "count": 1
          },
          {
            "date": "2020-10-29",
            "count": 3
          },
          {
            "date": "2020-11-01",
            "count": 1
          },
          {
            "date": "2020-11-03",
            "count": 1
          },
          {
            "date": "2020-11-05",
            "count": 2
          },
          {
            "date": "2020-11-06",
            "count": 2
          },
          {
            "date": "2020-11-08",
            "count": 1
          },
          {
            "date": "2020-11-09",
            "count": 2
          },
          {
            "date": "2020-11-10",
            "count": 1
          },
          {
            "date": "2020-11-11",
            "count": 1
          },
          {
            "date": "2020-11-12",
            "count": 2
          },
          {
            "date": "2020-11-14",
            "count": 1
          },
          {
            "date": "2020-11-18",
            "count": 1
          },
          {
            "date": "2020-11-20",
            "count": 1
          },
          {
            "date": "2020-12-02",
            "count": 2
          },
          {
            "date": "2020-12-08",
            "count": 4
          },
          {
            "date": "2020-12-09",
            "count": 3
          },
          {
            "date": "2020-12-12",
            "count": 1
          },
          {
            "date": "2020-12-13",
            "count": 2
          },
          {
            "date": "2020-12-14",
            "count": 1
          },
          {
            "date": "2020-12-15",
            "count": 1
          },
          {
            "date": "2020-12-17",
            "count": 1
          },
          {
            "date": "2020-12-24",
            "count": 2
          },
          {
            "date": "2020-12-26",
            "count": 1
          },
          {
            "date": "2021-01-03",
            "count": 1
          },
          {
            "date": "2021-01-07",
            "count": 1
          },
          {
            "date": "2021-01-10",
            "count": 1
          },
          {
            "date": "2021-01-15",
            "count": 1
          },
          {
            "date": "2021-01-19",
            "count": 1
          },
          {
            "date": "2021-01-20",
            "count": 1
          },
          {
            "date": "2021-01-21",
            "count": 1
          },
          {
            "date": "2021-01-22",
            "count": 2
          },
          {
            "date": "2021-01-24",
            "count": 1
          },
          {
            "date": "2021-01-27",
            "count": 3
          },
          {
            "date": "2021-01-29",
            "count": 1
          },
          {
            "date": "2021-01-30",
            "count": 1
          },
          {
            "date": "2021-02-01",
            "count": 2
          },
          {
            "date": "2021-02-03",
            "count": 2
          },
          {
            "date": "2021-02-05",
            "count": 1
          },
          {
            "date": "2021-02-07",
            "count": 2
          },
          {
            "date": "2021-02-09",
            "count": 1
          },
          {
            "date": "2021-02-11",
            "count": 1
          },
          {
            "date": "2021-02-12",
            "count": 1
          },
          {
            "date": "2021-02-13",
            "count": 1
          },
          {
            "date": "2021-02-15",
            "count": 1
          },
          {
            "date": "2021-02-18",
            "count": 1
          },
          {
            "date": "2021-02-19",
            "count": 1
          },
          {
            "date": "2021-02-22",
            "count": 1
          },
          {
            "date": "2021-02-24",
            "count": 1
          },
          {
            "date": "2021-02-25",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-01",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 1
          },
          {
            "date": "2021-03-07",
            "count": 1
          },
          {
            "date": "2021-03-09",
            "count": 1
          },
          {
            "date": "2021-03-11",
            "count": 2
          },
          {
            "date": "2021-03-12",
            "count": 2
          },
          {
            "date": "2021-03-14",
            "count": 1
          },
          {
            "date": "2021-03-19",
            "count": 2
          },
          {
            "date": "2021-03-22",
            "count": 2
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-04-01",
            "count": 1
          },
          {
            "date": "2021-04-09",
            "count": 2
          },
          {
            "date": "2021-04-13",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 13
          },
          {
            "date": "2021-04-16",
            "count": 9
          },
          {
            "date": "2021-04-17",
            "count": 3
          },
          {
            "date": "2021-04-18",
            "count": 3
          },
          {
            "date": "2021-04-19",
            "count": 2
          },
          {
            "date": "2021-04-20",
            "count": 2
          },
          {
            "date": "2021-04-22",
            "count": 1
          },
          {
            "date": "2021-04-23",
            "count": 1
          },
          {
            "date": "2021-04-26",
            "count": 1
          },
          {
            "date": "2021-04-29",
            "count": 1
          },
          {
            "date": "2021-05-03",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-10",
            "count": 1
          },
          {
            "date": "2021-05-11",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 3
          },
          {
            "date": "2021-05-20",
            "count": 1
          },
          {
            "date": "2021-05-24",
            "count": 2
          },
          {
            "date": "2021-05-30",
            "count": 1
          },
          {
            "date": "2021-06-09",
            "count": 1
          },
          {
            "date": "2021-06-13",
            "count": 1
          },
          {
            "date": "2021-06-14",
            "count": 1
          },
          {
            "date": "2021-06-18",
            "count": 1
          },
          {
            "date": "2021-06-23",
            "count": 1
          },
          {
            "date": "2021-06-24",
            "count": 1
          },
          {
            "date": "2021-06-29",
            "count": 2
          },
          {
            "date": "2021-06-30",
            "count": 2
          },
          {
            "date": "2021-07-02",
            "count": 1
          },
          {
            "date": "2021-07-04",
            "count": 1
          },
          {
            "date": "2021-07-06",
            "count": 2
          },
          {
            "date": "2021-07-08",
            "count": 2
          },
          {
            "date": "2021-07-10",
            "count": 1
          },
          {
            "date": "2021-07-12",
            "count": 1
          },
          {
            "date": "2021-07-14",
            "count": 1
          },
          {
            "date": "2021-07-15",
            "count": 1
          },
          {
            "date": "2021-07-16",
            "count": 1
          },
          {
            "date": "2021-07-21",
            "count": 2
          },
          {
            "date": "2021-07-31",
            "count": 1
          },
          {
            "date": "2021-08-01",
            "count": 1
          },
          {
            "date": "2021-08-03",
            "count": 1
          },
          {
            "date": "2021-08-05",
            "count": 1
          },
          {
            "date": "2021-08-09",
            "count": 2
          },
          {
            "date": "2021-08-10",
            "count": 1
          },
          {
            "date": "2021-08-12",
            "count": 1
          },
          {
            "date": "2021-08-15",
            "count": 3
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-18",
            "count": 1
          },
          {
            "date": "2021-08-19",
            "count": 5
          },
          {
            "date": "2021-08-22",
            "count": 1
          },
          {
            "date": "2021-08-23",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-08-26",
            "count": 2
          },
          {
            "date": "2021-08-27",
            "count": 1
          },
          {
            "date": "2021-08-28",
            "count": 1
          },
          {
            "date": "2021-08-31",
            "count": 1
          },
          {
            "date": "2021-09-02",
            "count": 1
          },
          {
            "date": "2021-09-08",
            "count": 2
          },
          {
            "date": "2021-09-11",
            "count": 1
          },
          {
            "date": "2021-09-16",
            "count": 1
          },
          {
            "date": "2021-09-23",
            "count": 1
          },
          {
            "date": "2021-09-28",
            "count": 1
          },
          {
            "date": "2021-10-06",
            "count": 1
          },
          {
            "date": "2021-10-15",
            "count": 1
          },
          {
            "date": "2021-10-19",
            "count": 1
          },
          {
            "date": "2021-10-24",
            "count": 1
          },
          {
            "date": "2021-10-28",
            "count": 1
          },
          {
            "date": "2021-11-01",
            "count": 1
          },
          {
            "date": "2021-11-03",
            "count": 1
          },
          {
            "date": "2021-11-08",
            "count": 1
          },
          {
            "date": "2021-11-09",
            "count": 2
          },
          {
            "date": "2021-11-12",
            "count": 1
          },
          {
            "date": "2021-11-15",
            "count": 2
          },
          {
            "date": "2021-11-18",
            "count": 2
          },
          {
            "date": "2021-11-23",
            "count": 1
          },
          {
            "date": "2021-11-24",
            "count": 1
          },
          {
            "date": "2021-11-25",
            "count": 1
          },
          {
            "date": "2021-11-28",
            "count": 1
          },
          {
            "date": "2021-11-30",
            "count": 4
          },
          {
            "date": "2021-12-04",
            "count": 1
          },
          {
            "date": "2021-12-06",
            "count": 1
          },
          {
            "date": "2021-12-08",
            "count": 1
          },
          {
            "date": "2021-12-10",
            "count": 1
          },
          {
            "date": "2021-12-13",
            "count": 1
          },
          {
            "date": "2021-12-14",
            "count": 1
          },
          {
            "date": "2021-12-24",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 1
          },
          {
            "date": "2022-01-01",
            "count": 1
          },
          {
            "date": "2022-01-05",
            "count": 1
          },
          {
            "date": "2022-01-06",
            "count": 1
          },
          {
            "date": "2022-01-09",
            "count": 1
          },
          {
            "date": "2022-01-10",
            "count": 1
          },
          {
            "date": "2022-01-13",
            "count": 1
          },
          {
            "date": "2022-01-19",
            "count": 1
          },
          {
            "date": "2022-01-24",
            "count": 1
          },
          {
            "date": "2022-02-03",
            "count": 1
          },
          {
            "date": "2022-02-12",
            "count": 1
          },
          {
            "date": "2022-02-15",
            "count": 1
          },
          {
            "date": "2022-02-16",
            "count": 1
          },
          {
            "date": "2022-02-17",
            "count": 1
          },
          {
            "date": "2022-02-18",
            "count": 1
          },
          {
            "date": "2022-02-21",
            "count": 1
          },
          {
            "date": "2022-02-22",
            "count": 3
          },
          {
            "date": "2022-02-27",
            "count": 1
          },
          {
            "date": "2022-03-06",
            "count": 1
          },
          {
            "date": "2022-03-10",
            "count": 1
          },
          {
            "date": "2022-03-11",
            "count": 1
          },
          {
            "date": "2022-03-16",
            "count": 1
          },
          {
            "date": "2022-03-18",
            "count": 1
          },
          {
            "date": "2022-03-22",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-04-04",
            "count": 1
          },
          {
            "date": "2022-04-05",
            "count": 1
          },
          {
            "date": "2022-04-07",
            "count": 1
          },
          {
            "date": "2022-04-08",
            "count": 1
          },
          {
            "date": "2022-04-09",
            "count": 1
          },
          {
            "date": "2022-04-17",
            "count": 1
          },
          {
            "date": "2022-04-21",
            "count": 1
          },
          {
            "date": "2022-04-22",
            "count": 1
          },
          {
            "date": "2022-04-25",
            "count": 1
          },
          {
            "date": "2022-04-26",
            "count": 1
          },
          {
            "date": "2022-04-28",
            "count": 1
          },
          {
            "date": "2022-04-29",
            "count": 2
          },
          {
            "date": "2022-05-03",
            "count": 1
          },
          {
            "date": "2022-05-05",
            "count": 1
          },
          {
            "date": "2022-05-08",
            "count": 1
          },
          {
            "date": "2022-05-09",
            "count": 1
          },
          {
            "date": "2022-05-10",
            "count": 1
          },
          {
            "date": "2022-05-12",
            "count": 1
          },
          {
            "date": "2022-05-13",
            "count": 1
          },
          {
            "date": "2022-05-18",
            "count": 1
          },
          {
            "date": "2022-05-20",
            "count": 1
          },
          {
            "date": "2022-05-21",
            "count": 1
          },
          {
            "date": "2022-05-25",
            "count": 1
          },
          {
            "date": "2022-06-02",
            "count": 1
          },
          {
            "date": "2022-06-03",
            "count": 1
          },
          {
            "date": "2022-06-04",
            "count": 1
          },
          {
            "date": "2022-06-09",
            "count": 1
          },
          {
            "date": "2022-06-10",
            "count": 1
          },
          {
            "date": "2022-06-13",
            "count": 1
          },
          {
            "date": "2022-06-15",
            "count": 1
          },
          {
            "date": "2022-06-16",
            "count": 3
          },
          {
            "date": "2022-06-17",
            "count": 5
          },
          {
            "date": "2022-06-18",
            "count": 1
          },
          {
            "date": "2022-06-19",
            "count": 1
          },
          {
            "date": "2022-06-20",
            "count": 4
          },
          {
            "date": "2022-06-22",
            "count": 2
          },
          {
            "date": "2022-06-24",
            "count": 1
          },
          {
            "date": "2022-06-27",
            "count": 1
          },
          {
            "date": "2022-06-29",
            "count": 2
          },
          {
            "date": "2022-06-30",
            "count": 1
          },
          {
            "date": "2022-07-03",
            "count": 1
          },
          {
            "date": "2022-07-08",
            "count": 1
          },
          {
            "date": "2022-07-09",
            "count": 1
          },
          {
            "date": "2022-07-12",
            "count": 3
          },
          {
            "date": "2022-07-13",
            "count": 4
          },
          {
            "date": "2022-07-22",
            "count": 1
          },
          {
            "date": "2022-07-23",
            "count": 1
          },
          {
            "date": "2022-07-29",
            "count": 1
          },
          {
            "date": "2022-07-31",
            "count": 1
          },
          {
            "date": "2022-08-01",
            "count": 2
          },
          {
            "date": "2022-08-06",
            "count": 1
          },
          {
            "date": "2022-08-07",
            "count": 1
          },
          {
            "date": "2022-08-09",
            "count": 1
          },
          {
            "date": "2022-08-10",
            "count": 1
          },
          {
            "date": "2022-08-12",
            "count": 1
          },
          {
            "date": "2022-08-16",
            "count": 1
          },
          {
            "date": "2022-08-20",
            "count": 1
          },
          {
            "date": "2022-08-23",
            "count": 1
          },
          {
            "date": "2022-08-25",
            "count": 1
          },
          {
            "date": "2022-08-27",
            "count": 1
          },
          {
            "date": "2022-09-02",
            "count": 2
          },
          {
            "date": "2022-09-06",
            "count": 1
          },
          {
            "date": "2022-09-08",
            "count": 2
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-09-16",
            "count": 1
          },
          {
            "date": "2022-09-27",
            "count": 1
          },
          {
            "date": "2022-10-01",
            "count": 1
          },
          {
            "date": "2022-10-05",
            "count": 1
          },
          {
            "date": "2022-10-12",
            "count": 1
          },
          {
            "date": "2022-10-14",
            "count": 1
          },
          {
            "date": "2022-10-17",
            "count": 1
          },
          {
            "date": "2022-10-19",
            "count": 1
          },
          {
            "date": "2022-10-20",
            "count": 1
          },
          {
            "date": "2022-10-22",
            "count": 1
          },
          {
            "date": "2022-11-06",
            "count": 1
          },
          {
            "date": "2022-11-08",
            "count": 1
          },
          {
            "date": "2022-11-09",
            "count": 1
          },
          {
            "date": "2022-11-11",
            "count": 1
          },
          {
            "date": "2022-11-12",
            "count": 1
          },
          {
            "date": "2022-11-15",
            "count": 1
          },
          {
            "date": "2022-11-16",
            "count": 1
          },
          {
            "date": "2022-11-17",
            "count": 2
          },
          {
            "date": "2022-11-18",
            "count": 1
          },
          {
            "date": "2022-11-24",
            "count": 1
          },
          {
            "date": "2022-12-02",
            "count": 2
          },
          {
            "date": "2022-12-10",
            "count": 2
          },
          {
            "date": "2022-12-16",
            "count": 2
          },
          {
            "date": "2022-12-19",
            "count": 2
          },
          {
            "date": "2022-12-25",
            "count": 1
          },
          {
            "date": "2022-12-29",
            "count": 1
          },
          {
            "date": "2022-12-30",
            "count": 1
          },
          {
            "date": "2023-01-01",
            "count": 2
          },
          {
            "date": "2023-01-04",
            "count": 1
          },
          {
            "date": "2023-01-05",
            "count": 2
          },
          {
            "date": "2023-01-08",
            "count": 1
          },
          {
            "date": "2023-01-13",
            "count": 1
          },
          {
            "date": "2023-01-15",
            "count": 1
          },
          {
            "date": "2023-01-17",
            "count": 2
          },
          {
            "date": "2023-01-18",
            "count": 1
          },
          {
            "date": "2023-01-19",
            "count": 2
          },
          {
            "date": "2023-01-24",
            "count": 1
          },
          {
            "date": "2023-01-25",
            "count": 1
          },
          {
            "date": "2023-01-27",
            "count": 1
          },
          {
            "date": "2023-01-29",
            "count": 1
          },
          {
            "date": "2023-01-30",
            "count": 1
          },
          {
            "date": "2023-02-01",
            "count": 1
          },
          {
            "date": "2023-02-02",
            "count": 1
          },
          {
            "date": "2023-02-05",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 3
          },
          {
            "date": "2023-02-07",
            "count": 2
          },
          {
            "date": "2023-02-09",
            "count": 2
          },
          {
            "date": "2023-02-12",
            "count": 1
          },
          {
            "date": "2023-02-14",
            "count": 1
          },
          {
            "date": "2023-02-18",
            "count": 1
          },
          {
            "date": "2023-02-21",
            "count": 1
          },
          {
            "date": "2023-02-22",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 2
          },
          {
            "date": "2023-03-08",
            "count": 1
          },
          {
            "date": "2023-03-14",
            "count": 2
          },
          {
            "date": "2023-03-15",
            "count": 1
          },
          {
            "date": "2023-03-17",
            "count": 2
          },
          {
            "date": "2023-03-18",
            "count": 2
          },
          {
            "date": "2023-03-20",
            "count": 1
          },
          {
            "date": "2023-03-22",
            "count": 1
          },
          {
            "date": "2023-03-23",
            "count": 3
          },
          {
            "date": "2023-03-27",
            "count": 1
          },
          {
            "date": "2023-04-02",
            "count": 1
          },
          {
            "date": "2023-04-06",
            "count": 2
          },
          {
            "date": "2023-04-07",
            "count": 1
          },
          {
            "date": "2023-04-11",
            "count": 1
          },
          {
            "date": "2023-04-12",
            "count": 1
          },
          {
            "date": "2023-04-18",
            "count": 2
          },
          {
            "date": "2023-04-23",
            "count": 1
          },
          {
            "date": "2023-05-03",
            "count": 1
          },
          {
            "date": "2023-05-05",
            "count": 1
          },
          {
            "date": "2023-05-06",
            "count": 1
          },
          {
            "date": "2023-05-09",
            "count": 1
          },
          {
            "date": "2023-05-10",
            "count": 2
          },
          {
            "date": "2023-05-15",
            "count": 1
          },
          {
            "date": "2023-05-19",
            "count": 1
          },
          {
            "date": "2023-05-21",
            "count": 1
          },
          {
            "date": "2023-05-23",
            "count": 1
          },
          {
            "date": "2023-05-25",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-05-28",
            "count": 1
          },
          {
            "date": "2023-05-29",
            "count": 3
          },
          {
            "date": "2023-05-30",
            "count": 1
          },
          {
            "date": "2023-06-01",
            "count": 1
          },
          {
            "date": "2023-06-05",
            "count": 2
          },
          {
            "date": "2023-06-23",
            "count": 1
          },
          {
            "date": "2023-06-25",
            "count": 2
          },
          {
            "date": "2023-06-26",
            "count": 1
          },
          {
            "date": "2023-07-01",
            "count": 1
          },
          {
            "date": "2023-07-04",
            "count": 1
          },
          {
            "date": "2023-07-09",
            "count": 2
          },
          {
            "date": "2023-07-12",
            "count": 1
          },
          {
            "date": "2023-07-15",
            "count": 1
          },
          {
            "date": "2023-07-26",
            "count": 1
          },
          {
            "date": "2023-07-27",
            "count": 1
          },
          {
            "date": "2023-07-29",
            "count": 1
          },
          {
            "date": "2023-07-30",
            "count": 1
          },
          {
            "date": "2023-08-04",
            "count": 1
          },
          {
            "date": "2023-08-07",
            "count": 1
          },
          {
            "date": "2023-08-11",
            "count": 1
          },
          {
            "date": "2023-08-15",
            "count": 1
          },
          {
            "date": "2023-08-16",
            "count": 1
          },
          {
            "date": "2023-08-19",
            "count": 1
          },
          {
            "date": "2023-08-23",
            "count": 1
          },
          {
            "date": "2023-08-24",
            "count": 1
          },
          {
            "date": "2023-08-25",
            "count": 1
          },
          {
            "date": "2023-08-26",
            "count": 1
          },
          {
            "date": "2023-08-29",
            "count": 1
          },
          {
            "date": "2023-09-03",
            "count": 1
          },
          {
            "date": "2023-09-04",
            "count": 1
          },
          {
            "date": "2023-09-06",
            "count": 1
          },
          {
            "date": "2023-09-07",
            "count": 1
          },
          {
            "date": "2023-09-08",
            "count": 1
          },
          {
            "date": "2023-09-09",
            "count": 1
          },
          {
            "date": "2023-09-13",
            "count": 2
          },
          {
            "date": "2023-09-17",
            "count": 1
          },
          {
            "date": "2023-09-19",
            "count": 3
          },
          {
            "date": "2023-09-20",
            "count": 3
          },
          {
            "date": "2023-09-21",
            "count": 1
          },
          {
            "date": "2023-09-27",
            "count": 1
          },
          {
            "date": "2023-10-01",
            "count": 1
          },
          {
            "date": "2023-10-02",
            "count": 2
          },
          {
            "date": "2023-10-03",
            "count": 1
          },
          {
            "date": "2023-10-07",
            "count": 1
          },
          {
            "date": "2023-10-11",
            "count": 1
          },
          {
            "date": "2023-10-15",
            "count": 1
          },
          {
            "date": "2023-10-19",
            "count": 2
          },
          {
            "date": "2023-10-23",
            "count": 1
          },
          {
            "date": "2023-10-24",
            "count": 1
          },
          {
            "date": "2023-10-29",
            "count": 1
          },
          {
            "date": "2023-11-07",
            "count": 2
          },
          {
            "date": "2023-11-09",
            "count": 1
          },
          {
            "date": "2023-11-10",
            "count": 1
          },
          {
            "date": "2023-11-15",
            "count": 1
          },
          {
            "date": "2023-11-17",
            "count": 1
          },
          {
            "date": "2023-11-18",
            "count": 1
          },
          {
            "date": "2023-11-20",
            "count": 2
          },
          {
            "date": "2023-11-25",
            "count": 1
          },
          {
            "date": "2023-11-28",
            "count": 1
          },
          {
            "date": "2023-11-29",
            "count": 1
          },
          {
            "date": "2023-12-05",
            "count": 1
          },
          {
            "date": "2023-12-08",
            "count": 1
          },
          {
            "date": "2023-12-18",
            "count": 1
          },
          {
            "date": "2023-12-19",
            "count": 1
          },
          {
            "date": "2023-12-21",
            "count": 1
          },
          {
            "date": "2023-12-28",
            "count": 1
          },
          {
            "date": "2024-01-04",
            "count": 1
          },
          {
            "date": "2024-01-05",
            "count": 2
          },
          {
            "date": "2024-01-22",
            "count": 1
          },
          {
            "date": "2024-02-05",
            "count": 1
          },
          {
            "date": "2024-02-13",
            "count": 2
          },
          {
            "date": "2024-02-16",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-02-23",
            "count": 1
          },
          {
            "date": "2024-02-26",
            "count": 1
          },
          {
            "date": "2024-03-01",
            "count": 1
          },
          {
            "date": "2024-03-09",
            "count": 3
          },
          {
            "date": "2024-03-10",
            "count": 1
          },
          {
            "date": "2024-03-11",
            "count": 1
          },
          {
            "date": "2024-03-12",
            "count": 1
          },
          {
            "date": "2024-03-15",
            "count": 1
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-03-18",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-03-28",
            "count": 3
          },
          {
            "date": "2024-03-29",
            "count": 1
          },
          {
            "date": "2024-04-03",
            "count": 2
          },
          {
            "date": "2024-04-07",
            "count": 1
          },
          {
            "date": "2024-04-11",
            "count": 1
          },
          {
            "date": "2024-04-17",
            "count": 1
          },
          {
            "date": "2024-04-19",
            "count": 1
          },
          {
            "date": "2024-04-21",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 2
          },
          {
            "date": "2024-04-24",
            "count": 4
          },
          {
            "date": "2024-04-26",
            "count": 3
          },
          {
            "date": "2024-04-27",
            "count": 1
          },
          {
            "date": "2024-04-28",
            "count": 1
          },
          {
            "date": "2024-04-29",
            "count": 1
          },
          {
            "date": "2024-04-30",
            "count": 1
          },
          {
            "date": "2024-05-03",
            "count": 1
          },
          {
            "date": "2024-05-05",
            "count": 1
          },
          {
            "date": "2024-05-07",
            "count": 2
          },
          {
            "date": "2024-05-09",
            "count": 1
          },
          {
            "date": "2024-05-12",
            "count": 1
          },
          {
            "date": "2024-05-15",
            "count": 1
          },
          {
            "date": "2024-05-26",
            "count": 1
          },
          {
            "date": "2024-05-28",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-09",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 2
          },
          {
            "date": "2024-06-19",
            "count": 1
          },
          {
            "date": "2024-06-20",
            "count": 1
          },
          {
            "date": "2024-06-21",
            "count": 1
          },
          {
            "date": "2024-06-23",
            "count": 1
          },
          {
            "date": "2024-06-26",
            "count": 1
          },
          {
            "date": "2024-06-30",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 1
          },
          {
            "date": "2024-07-02",
            "count": 2
          },
          {
            "date": "2024-07-03",
            "count": 1
          },
          {
            "date": "2024-07-08",
            "count": 1
          },
          {
            "date": "2024-07-13",
            "count": 1
          },
          {
            "date": "2024-07-18",
            "count": 2
          },
          {
            "date": "2024-07-21",
            "count": 1
          },
          {
            "date": "2024-07-22",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 1
          },
          {
            "date": "2024-08-04",
            "count": 1
          },
          {
            "date": "2024-08-05",
            "count": 1
          },
          {
            "date": "2024-08-08",
            "count": 1
          },
          {
            "date": "2024-08-22",
            "count": 2
          },
          {
            "date": "2024-08-27",
            "count": 1
          },
          {
            "date": "2024-09-09",
            "count": 1
          },
          {
            "date": "2024-09-11",
            "count": 3
          },
          {
            "date": "2024-09-15",
            "count": 1
          },
          {
            "date": "2024-09-18",
            "count": 1
          },
          {
            "date": "2024-09-24",
            "count": 1
          },
          {
            "date": "2024-09-25",
            "count": 2
          },
          {
            "date": "2024-09-28",
            "count": 1
          },
          {
            "date": "2024-10-01",
            "count": 1
          },
          {
            "date": "2024-10-02",
            "count": 1
          },
          {
            "date": "2024-10-05",
            "count": 1
          },
          {
            "date": "2024-10-10",
            "count": 1
          },
          {
            "date": "2024-10-11",
            "count": 1
          },
          {
            "date": "2024-10-12",
            "count": 1
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2024-10-21",
            "count": 1
          },
          {
            "date": "2024-10-23",
            "count": 2
          },
          {
            "date": "2024-10-24",
            "count": 1
          },
          {
            "date": "2024-10-28",
            "count": 1
          },
          {
            "date": "2024-10-30",
            "count": 2
          },
          {
            "date": "2024-11-02",
            "count": 1
          },
          {
            "date": "2024-11-04",
            "count": 1
          },
          {
            "date": "2024-11-05",
            "count": 1
          },
          {
            "date": "2024-11-07",
            "count": 2
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2024-11-12",
            "count": 1
          },
          {
            "date": "2024-11-13",
            "count": 1
          },
          {
            "date": "2024-11-18",
            "count": 3
          },
          {
            "date": "2024-11-22",
            "count": 2
          },
          {
            "date": "2024-12-02",
            "count": 1
          },
          {
            "date": "2024-12-09",
            "count": 1
          },
          {
            "date": "2024-12-12",
            "count": 2
          },
          {
            "date": "2024-12-20",
            "count": 1
          },
          {
            "date": "2024-12-23",
            "count": 1
          },
          {
            "date": "2024-12-25",
            "count": 1
          },
          {
            "date": "2025-01-02",
            "count": 1
          },
          {
            "date": "2025-01-07",
            "count": 1
          },
          {
            "date": "2025-01-08",
            "count": 4
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-14",
            "count": 2
          },
          {
            "date": "2025-01-22",
            "count": 2
          },
          {
            "date": "2025-01-26",
            "count": 1
          },
          {
            "date": "2025-02-02",
            "count": 1
          },
          {
            "date": "2025-02-14",
            "count": 1
          },
          {
            "date": "2025-02-15",
            "count": 5
          },
          {
            "date": "2025-02-17",
            "count": 1
          },
          {
            "date": "2025-02-19",
            "count": 1
          },
          {
            "date": "2025-02-21",
            "count": 1
          },
          {
            "date": "2025-02-22",
            "count": 1
          },
          {
            "date": "2025-02-23",
            "count": 1
          },
          {
            "date": "2025-02-25",
            "count": 1
          },
          {
            "date": "2025-02-26",
            "count": 3
          },
          {
            "date": "2025-03-07",
            "count": 2
          },
          {
            "date": "2025-03-10",
            "count": 1
          },
          {
            "date": "2025-03-11",
            "count": 1
          },
          {
            "date": "2025-03-14",
            "count": 1
          },
          {
            "date": "2025-03-15",
            "count": 1
          },
          {
            "date": "2025-03-20",
            "count": 1
          },
          {
            "date": "2025-04-02",
            "count": 2
          },
          {
            "date": "2025-04-07",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-16",
            "count": 1
          },
          {
            "date": "2025-04-18",
            "count": 1
          },
          {
            "date": "2025-04-19",
            "count": 1
          },
          {
            "date": "2025-04-23",
            "count": 1
          },
          {
            "date": "2025-04-28",
            "count": 2
          },
          {
            "date": "2025-04-29",
            "count": 2
          },
          {
            "date": "2025-04-30",
            "count": 1
          },
          {
            "date": "2025-05-02",
            "count": 1
          },
          {
            "date": "2025-05-08",
            "count": 2
          },
          {
            "date": "2025-05-13",
            "count": 2
          },
          {
            "date": "2025-05-20",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 1
          },
          {
            "date": "2025-05-24",
            "count": 2
          },
          {
            "date": "2025-05-30",
            "count": 1
          },
          {
            "date": "2025-06-05",
            "count": 1
          },
          {
            "date": "2025-06-06",
            "count": 1
          },
          {
            "date": "2025-06-10",
            "count": 1
          },
          {
            "date": "2025-06-16",
            "count": 2
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 1
          },
          {
            "date": "2025-07-18",
            "count": 1
          },
          {
            "date": "2025-07-28",
            "count": 1
          },
          {
            "date": "2025-07-30",
            "count": 1
          },
          {
            "date": "2025-07-31",
            "count": 1
          },
          {
            "date": "2025-08-13",
            "count": 1
          },
          {
            "date": "2025-08-15",
            "count": 3
          },
          {
            "date": "2025-08-19",
            "count": 1
          },
          {
            "date": "2025-08-20",
            "count": 2
          },
          {
            "date": "2025-08-26",
            "count": 1
          },
          {
            "date": "2025-08-27",
            "count": 1
          },
          {
            "date": "2025-08-28",
            "count": 1
          },
          {
            "date": "2025-09-01",
            "count": 1
          },
          {
            "date": "2025-09-03",
            "count": 1
          },
          {
            "date": "2025-09-06",
            "count": 1
          },
          {
            "date": "2025-09-09",
            "count": 1
          },
          {
            "date": "2025-09-22",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 2
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-10-27",
            "count": 1
          },
          {
            "date": "2025-10-30",
            "count": 1
          },
          {
            "date": "2025-11-03",
            "count": 1
          },
          {
            "date": "2025-11-19",
            "count": 1
          },
          {
            "date": "2025-12-01",
            "count": 1
          },
          {
            "date": "2025-12-02",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2025-12-06",
            "count": 1
          },
          {
            "date": "2025-12-17",
            "count": 1
          },
          {
            "date": "2025-12-20",
            "count": 1
          },
          {
            "date": "2025-12-27",
            "count": 1
          },
          {
            "date": "2026-01-03",
            "count": 1
          },
          {
            "date": "2026-01-04",
            "count": 1
          },
          {
            "date": "2026-01-06",
            "count": 1
          },
          {
            "date": "2026-01-11",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-01-21",
            "count": 1
          },
          {
            "date": "2026-01-26",
            "count": 1
          },
          {
            "date": "2026-01-28",
            "count": 1
          },
          {
            "date": "2026-01-29",
            "count": 1
          },
          {
            "date": "2026-02-04",
            "count": 1
          },
          {
            "date": "2026-02-06",
            "count": 1
          },
          {
            "date": "2026-02-12",
            "count": 9
          },
          {
            "date": "2026-02-13",
            "count": 2
          },
          {
            "date": "2026-02-14",
            "count": 2
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 1
          },
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-03-28",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 2
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 7
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-05-31",
            "count": 2
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 1
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_stars": 3878
      },
      "open_issues_and_prs": 29
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 20293,
      "source_files_sampled": 49,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile"
      ],
      "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": 11,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "activerecord",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 7.2"
        },
        {
          "name": "mysql2",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "trilogy",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "pg",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "sqlite3",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 1.6.9"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "activerecord",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pg",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "sqlite3",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "trilogy",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "appraisal",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "logger",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov-json",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "yard",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 11,
        "direct_count": 4,
        "indirect_count": 7
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 7,
        "merged_prs": 323,
        "open_issues": 22,
        "closed_ratio": 0.936,
        "closed_issues": 323,
        "closed_unmerged_prs": 85
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "kbrock",
          "commits": 613,
          "avatar_url": "https://avatars.githubusercontent.com/u/1930?v=4"
        },
        {
          "type": "User",
          "login": "stefankroes",
          "commits": 55,
          "avatar_url": "https://avatars.githubusercontent.com/u/37841?v=4"
        },
        {
          "type": "User",
          "login": "d-m-u",
          "commits": 20,
          "avatar_url": "https://avatars.githubusercontent.com/u/16326669?v=4"
        },
        {
          "type": "User",
          "login": "vanderhoorn",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/32971?v=4"
        },
        {
          "type": "User",
          "login": "hw676018683",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/8272538?v=4"
        },
        {
          "type": "User",
          "login": "ledermann",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/3557?v=4"
        },
        {
          "type": "User",
          "login": "kshnurov",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/498185?v=4"
        },
        {
          "type": "User",
          "login": "brocktimus",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/2103728?v=4"
        },
        {
          "type": "User",
          "login": "gstokkink",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/14915325?v=4"
        },
        {
          "type": "User",
          "login": "Fryguy",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/52120?v=4"
        }
      ],
      "contributors_sampled": 99,
      "top_contributor_share": 0.708
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "run_test_suite.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 1/12 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 13 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 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": 9,
            "reason": "8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e8c09d27929a292452901c8b5f34b1b0a1b882b4",
        "ran_at": "2026-07-22T00:35:20Z",
        "aggregate_score": 5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T13:32:26Z",
      "oldest_open_prs": [
        {
          "number": 55,
          "created_at": "2011-06-03T04:59:38Z",
          "last_comment_at": "2011-11-16T19:13:43Z",
          "last_comment_author": "ckdake"
        },
        {
          "number": 481,
          "created_at": "2020-06-20T18:09:15Z",
          "last_comment_at": "2023-07-13T19:38:29Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 697,
          "created_at": "2025-04-15T16:01:30Z",
          "last_comment_at": "2026-03-19T20:18:40Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 698,
          "created_at": "2025-05-11T09:34:24Z",
          "last_comment_at": "2026-04-06T13:36:55Z",
          "last_comment_author": "a5-stable"
        },
        {
          "number": 747,
          "created_at": "2026-03-28T05:16:11Z",
          "last_comment_at": "2026-04-16T05:29:22Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 749,
          "created_at": "2026-03-30T20:20:19Z",
          "last_comment_at": "2026-04-01T01:57:41Z",
          "last_comment_author": "djberg96"
        },
        {
          "number": 761,
          "created_at": "2026-04-28T00:12:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-06-25T00:51:41Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 59,
          "created_at": "2011-06-24T21:15:26Z",
          "last_comment_at": "2022-12-06T15:53:59Z",
          "last_comment_author": "spacerobotTR"
        },
        {
          "number": 75,
          "created_at": "2011-09-14T03:51:51Z",
          "last_comment_at": "2019-05-21T20:33:05Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 80,
          "created_at": "2011-10-01T20:11:50Z",
          "last_comment_at": "2026-03-11T04:26:08Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 93,
          "created_at": "2012-06-04T15:21:36Z",
          "last_comment_at": "2022-08-19T05:16:00Z",
          "last_comment_author": "dastanabeuov"
        },
        {
          "number": 98,
          "created_at": "2012-08-14T12:17:17Z",
          "last_comment_at": "2022-02-02T14:01:51Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 127,
          "created_at": "2013-04-11T18:36:36Z",
          "last_comment_at": "2024-03-06T20:42:18Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 148,
          "created_at": "2013-08-21T12:46:16Z",
          "last_comment_at": "2024-03-06T20:47:38Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 171,
          "created_at": "2013-12-30T12:24:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 197,
          "created_at": "2014-07-30T19:58:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 209,
          "created_at": "2014-10-22T20:02:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 212,
          "created_at": "2014-11-06T04:38:38Z",
          "last_comment_at": "2016-01-26T10:17:09Z",
          "last_comment_author": "dpsk"
        },
        {
          "number": 213,
          "created_at": "2014-11-07T01:36:09Z",
          "last_comment_at": "2015-05-12T06:22:31Z",
          "last_comment_author": "stefankroes"
        },
        {
          "number": 318,
          "created_at": "2016-12-23T14:27:24Z",
          "last_comment_at": "2016-12-27T07:52:41Z",
          "last_comment_author": "solars"
        },
        {
          "number": 423,
          "created_at": "2018-11-27T14:13:25Z",
          "last_comment_at": "2019-01-03T12:29:51Z",
          "last_comment_author": "astyagun"
        },
        {
          "number": 433,
          "created_at": "2019-03-19T13:55:12Z",
          "last_comment_at": "2022-09-28T13:48:46Z",
          "last_comment_author": "donnguyen"
        },
        {
          "number": 440,
          "created_at": "2019-04-23T17:04:13Z",
          "last_comment_at": "2023-11-06T18:14:53Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 521,
          "created_at": "2020-12-09T16:03:42Z",
          "last_comment_at": "2020-12-10T10:28:32Z",
          "last_comment_author": "stevieing"
        },
        {
          "number": 584,
          "created_at": "2022-06-27T21:46:03Z",
          "last_comment_at": "2026-04-28T09:06:12Z",
          "last_comment_author": "Ancez"
        },
        {
          "number": 586,
          "created_at": "2022-07-12T02:53:43Z",
          "last_comment_at": "2026-04-02T21:51:31Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 695,
          "created_at": "2025-02-16T04:22:48Z",
          "last_comment_at": "2025-05-21T15:09:52Z",
          "last_comment_author": "a5-stable"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/stefankroes/ancestry",
    "host": "github.com",
    "name": "ancestry",
    "owner": "stefankroes"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 67,
      "inputs": {
        "security": 50,
        "vitality": 67,
        "community": 86,
        "governance": 62,
        "engineering": 69
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 67,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 145,
              "human_commit_share": 0.99,
              "days_since_last_push": 26,
              "active_weeks_last_year": 20
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 26 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "145 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 145
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9",
                "points": 9,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "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": 62,
            "inputs": {
              "releases_count": 28,
              "latest_release_tag": "v5.1.0",
              "releases_from_tags": true,
              "days_since_latest_release": 135,
              "mean_days_between_releases": 221.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "28 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 28
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 135 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 135
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~221.3 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 221.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 26,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 26 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 86,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "excellent",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "forks": 472,
              "stars": 3878,
              "watchers": 45,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3,878 stars",
                "points": 58.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3878
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "472 forks",
                "points": 22.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 472
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "45 watchers",
                "points": 9.1,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 45
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 98,
            "inputs": {
              "packages": [
                "ancestry"
              ],
              "dependents": null,
              "ecosystems": "rubygems",
              "total_downloads": 38034866,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "38,034,866 downloads all-time across rubygems",
                "points": 78.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 38034866,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "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": 62,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 99,
              "top_contributor_share": 0.708
            },
            "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 71% of commits",
                "points": 6.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 71
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "99 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 13 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": 323,
              "open_issues": 22,
              "closed_issues": 323,
              "issue_closed_ratio": 0.936,
              "closed_unmerged_prs": 85
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "94% of issues closed",
                "points": 43.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "323/408 decided PRs merged",
                "points": 30.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 323,
                      "decided": 408
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "followers": 40,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "stefankroes",
              "public_repos": 3,
              "account_age_days": 6440
            },
            "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": "40 followers of stefankroes",
                "points": 11.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 40,
                      "login": "stefankroes"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~17 yr old",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 17
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ancestry"
              ],
              "ecosystems": "rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 135
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 135 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 135
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "38 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "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": 69,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": ".rubocop.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "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 1/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is 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": "8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9",
                "points": 6.8,
                "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": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 14
            },
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 48,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.828,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "82 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 82,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.34,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".rubocop.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "34 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 34,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Ruby",
              "largest_source_bytes": 20293,
              "source_files_sampled": 49,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Ruby without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Ruby"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/49 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 49,
                      "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": [
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T00:35:47.856195Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/stefankroes/ancestry.svg",
  "full_name": "stefankroes/ancestry",
  "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.26.0 — metodología completa · wiki de métricas.

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