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

nltk / nltk

NLTK Source

PythonApache-2.0★ 14.679 estrellas⑂ 3028 forksdesde sept 2009Ver en GitHub ↗

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

38
global / 100
En riesgo

Índice de salud del software

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

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

La Política de Jurisdicciones de Alto Riesgo aplica un multiplicador del 50% a la salud global ponderada y le da un límite «En riesgo» de 49.

Titularidad

512 seguidores10 repositorios públicosdesde sept 2009

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPInltk3.10.065.956.48257hace 13 díasnlpclnatural-language-processingcomputational-linguisticsparsingtaggingtokenizingsyntaxlinguisticslanguagenatural-languagetext-analytics

Métricas por categoría

Vitalidad

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

83Bueno · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 13 días
27/36Cadencia de commits — 39/52 semanas con commits
18/18Volumen de commits — 529 commits en el último año
0/10OpenSSF Scorecard: Maintained — sin datos
Datos de entrada utilizados
commits_last_year529
human_commit_share0,99
days_since_last_push13
active_weeks_last_year39
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 40 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv3.10.0-rc1
releases_from_tagsno
days_since_latest_release40
mean_days_between_releases

Comunidad y Adopción

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

90Excelente · 18% del índice global
Cómo se puntúa
60/60Estrellas — 14.679 estrellas
25/25Forks — 3028 forks
14.7/15Observadores — 437 observadores
Datos de entrada utilizados
forks3028
stars14.679
watchers437
growth_stateorganic
growth_factor_pct100
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
80/80Descargas mensuales — 65.956.482 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesnltk
dependents
ecosystemspypi
total_downloads
monthly_downloads65.956.482
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?

69Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
10.6/22.5Distribución de commits — el principal contribuyente firma el 53% de los commits
13.5/13.5Amplitud de contribuyentes — 99 contribuyentes
0/10OpenSSF Scorecard: Contributors — sin datos
Datos de entrada utilizados
bus_factor1
contributors_sampled99
top_contributor_share0,527
Cómo se puntúa
40.8/46.8Resolución de issues — 87% de issues cerradas
31/38.3Aceptación de PR — 1404/1735 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — sin datos
Datos de entrada utilizados
merged_prs1404
open_issues243
closed_issues1671
issue_closed_ratio0,873
closed_unmerged_prs331
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
19.5/25Alcance del propietario — 512 seguidores de nltk
19.6/25Trayectoria — 10 repos públicos, cuenta de ~16 años
Datos de entrada utilizados
followers512
owner_typeOrganization
is_verified
owner_loginnltk
public_repos10
account_age_days6161
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 13 días
20/20Historial de versiones — 57 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesnltk
ecosystemspypi
any_deprecatedno
min_days_since_publish13

Calidad de Ingeniería

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

85Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — ruff.toml, tox.ini
9.6/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_config
Cómo se puntúa
30/30README
0/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://www.nltk.org
10/10Descripción del repositorio
10/10Topics — 5 topics
10/10Wiki
Datos de entrada utilizados
topicsnltk, python, nlp, natural-language-processing, machine-learning
has_wiki
homepagehttps://www.nltk.org
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?

49En riesgo · 16% del índice global
Cómo se puntúa
30/30Política de seguridad (SECURITY.md)
25/25Configuración de Dependabot
0/25Lockfiles de dependencias — biblioteca publicada — los lockfiles son cosa de las aplicaciones, no se esperan aquí
0/20Flujo de trabajo de CodeQL
Datos de entrada utilizados
sourcefile_signals
lockfiles
manifestsrequirements-ci.txt, requirements-test.txt, setup.cfg, setup.py
has_codeql_workflowno
has_security_policy
has_dependabot_config
high_risk_jurisdiction_cap49
high_risk_jurisdiction_multiplier50
security_posture_after_multiplier36
security_posture_before_jurisdiction73
Excluidos de la puntuación (sin datos o no aplicable): Lockfiles de dependencias. Los pesos restantes se han renormalizado. La Política de Jurisdicciones de Alto Riesgo aplica un multiplicador del 50% y da a la postura de seguridad un límite «En riesgo» de 49.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages5
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de pypi:nltk@3.10.0 —lo que arrastra la instalación del paquete publicado—: 5 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

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

57Moderado · 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 — 93 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,939
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — Makefile, nltk/test/Makefile, web/Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — ruff.toml, tox.ini
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 6 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 — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_filesMakefile, nltk/test/Makefile, web/Makefile
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,06
toolchain_manifests
dependency_bot_commit_share0,01
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
53.4/55Tamaños de archivo manejables — 13/434 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes177.919
source_files_sampled434
oversized_source_files13
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — notebooks
Datos de entrada utilizados
example_dirsnotebooks
has_mcp_signalno
api_schema_files

Datos clave

14.679estrellas de GitHub
99contribuidores
529commits en los últimos 12 meses
13días desde el último push
1versiones publicadas
1factor bus
243issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • OpenSSF Scorecard timed out after 240s; skipping Scorecard checks

Más detalle

Historial de estrellas y forks 14.679 ★ / 3028 ⇿
14.679Estrellas
3028Forks
1Versiones

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.

025005000750010.00012.50015.00014.6793028252020-032023-052026-07
Mayor 0Menor 0Parche 0

Cada punto abarca 6 días.

Todas las dependencias 24

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

RegistroPaqueteVersiónRelación
PyPIclickindirecta
PyPIdefusedxmlindirecta
PyPIgensimindirecta
PyPIjoblibindirecta
PyPImarkdown-it-pyindirecta
PyPImatplotlibindirecta
PyPImdit-plainindirecta
PyPImdit-py-pluginsindirecta
PyPInumpyindirecta
PyPIpylintindirecta
PyPIpyparsingindirecta
PyPIpytestindirecta
PyPIpytest-covindirecta
PyPIpytest-mockindirecta
PyPIpytest-xdistindirecta
PyPIpython-crfsuiteindirecta
PyPIpyyamlindirecta
PyPIregexindirecta
PyPIrequestsindirecta
PyPIscikit-learnindirecta
PyPIscipyindirecta
PyPItoxindirecta
PyPItqdmindirecta
PyPItwythonindirecta
Avisos de dependencias 0

Instalar pypi:nltk@3.10.0 arrastra 5 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "nltk",
        "python",
        "nlp",
        "natural-language-processing",
        "machine-learning"
      ],
      "is_fork": false,
      "size_kb": 355535,
      "has_wiki": true,
      "homepage": "https://www.nltk.org",
      "languages": {
        "CSS": 705,
        "HTML": 24786,
        "Shell": 5841,
        "Python": 5487179,
        "Makefile": 7734,
        "Jupyter Notebook": 56591
      },
      "pushed_at": "2026-07-08T02:35:12Z",
      "created_at": "2009-09-07T10:53:58Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T07:56:06Z",
      "description": "NLTK Source",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "develop",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "http://nltk.org",
      "name": "Natural Language Toolkit",
      "type": "Organization",
      "login": "nltk",
      "company": null,
      "location": null,
      "followers": 512,
      "avatar_url": "https://avatars.githubusercontent.com/u/124114?v=4",
      "created_at": "2009-09-07T10:52:22Z",
      "is_verified": null,
      "public_repos": 10,
      "account_age_days": 6161
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.10.0-rc1",
          "kind": "prerelease",
          "published_at": "2026-06-11T21:07:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "bd49f9011d7dc8c6a36b3c4ae71f04060c9b3fb9",
          "body": "* allow escaped brackets in Tree.fromstring\n\nthe tokenizer split on any bracket, so a leaf or label containing \\( or\n\\) broke parsing. treat a backslash-escaped bracket as a normal token\nchar; it's kept verbatim so it round-trips.\n\ncloses #1706\n\n* black format\n\n* add a realistic roundtrip test for an escaped bracket leaf",
          "is_bot": false,
          "headline": "allow escaped brackets in Tree.fromstring (#3694)",
          "author_name": "CodingSelim",
          "author_login": "CodingSelim",
          "committed_at": "2026-07-05T10:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27b8ad6cd50a484590cb9409e5d2a891ab56e16c",
          "body": "* don't crash chomsky_normal_form on terminals with siblings\n\nwhen a node had >2 children and one was a terminal string, the code\ncalled .label() on it and blew up with AttributeError. use the terminal\nitself for the intermediate node name instead.\n\ncloses #1883\n\n* str() the node names so non-string terminals dont break the join",
          "is_bot": false,
          "headline": "don't crash chomsky_normal_form on terminals with siblings (#3693)",
          "author_name": "CodingSelim",
          "author_login": "CodingSelim",
          "committed_at": "2026-07-05T10:13:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52227d2afe764648864e59c851e991cf1d6cb77e",
          "body": "* Use os.name for Windows path handling\n\n* Stabilize Windows path detection tests\n\n* Fix Windows downloader platform test isolation\n\n---------\n\nCo-authored-by: Muhtasim-Munif-Fahim <fahim.stat.ru@gmail.com>",
          "is_bot": false,
          "headline": "Use os.name for Windows path handling (#3605)",
          "author_name": "Md Muhtasim Munif Fahim",
          "author_login": "Muhtasim-Munif-Fahim",
          "committed_at": "2026-07-05T10:08:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06c0e2cc94f763d43320812ee9d2a7b6bff68f9b",
          "body": "* Avoid RIBES zero division on empty inputs\n\n* Handle empty and mismatched RIBES inputs\n\n---------\n\nCo-authored-by: Muhtasim-Munif-Fahim <fahim.stat.ru@gmail.com>",
          "is_bot": false,
          "headline": "Avoid RIBES zero division on empty inputs (#3604)",
          "author_name": "Md Muhtasim Munif Fahim",
          "author_login": "Muhtasim-Munif-Fahim",
          "committed_at": "2026-07-05T10:06:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a167389c027a02a9d1f019630ed827f4069b3353",
          "body": "Co-authored-by: Muhtasim-Munif-Fahim <fahim.stat.ru@gmail.com>",
          "is_bot": false,
          "headline": "Treat missing unzip output as stale (#3607)",
          "author_name": "Md Muhtasim Munif Fahim",
          "author_login": "Muhtasim-Munif-Fahim",
          "committed_at": "2026-07-04T06:05:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c94c967a332e19af0a022db51467ee2baf6ccfeb",
          "body": null,
          "is_bot": false,
          "headline": "Fix EOF empty document bug in IEER corpus reader (#3648)",
          "author_name": "CHENNA NAGESH",
          "author_login": "CHENNA-NAGESH",
          "committed_at": "2026-07-04T06:03:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94a259c815370df66f98460f22478030e2954913",
          "body": "* Enforce restrictive primitive type checking in pathsec wrappers\n\n* Implement review suggestions",
          "is_bot": false,
          "headline": "Enforce restrictive primitive type checking in pathsec wrappers (#3692)",
          "author_name": "Eric Ka",
          "author_login": "ekaf",
          "committed_at": "2026-07-04T06:01:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac475d2ab95ea95d2890c745a05e5275137fb98",
          "body": "…683)\n\nSeveral Stanford/Java wrappers wrote plaintext user input to delete=False temporary files and removed those files only after Java execution succeeded. If Java raised, the temporary input files remained on disk.\n\nThe wrappers also configured request-specific Java options by mutating the proces\n[…]\ntions directly to each subprocess invocation. Clean wrapper temporary input files from finally blocks so exception paths remove plaintext input.\n\nReported by KKfine via huntr. CVE-2026-12615 assigned.",
          "is_bot": false,
          "headline": "fix(security): isolate Stanford Java options and clean temp files (#3…",
          "author_name": "KKfine",
          "author_login": "haoami",
          "committed_at": "2026-07-04T05:59:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "986f26e71bf22ee392a5e87285ee8398284aef2b",
          "body": "Bumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/setup-python](https://github.com/actions/setup-python) and [actions/cache](https://github.com/actions/cache).\n\n\nUpdates `actions/checkout` from 4 to 7\n- [Release notes](https://github.com\n[…]\nsion-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump the github-actions group with 3 updates (#3691)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-01T09:57:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f26b3753038d937b68145daf15e9636f8451053c",
          "body": "…CWE-502) (#3631)\n\n* fix(security): prevent pickle RCE in TransitionParser model loading (CWE-502)\n\n* test: update warning test to match AllowlistUnpickler behavior\n\nTransitionParser.parse() now uses allowlisted_pickle_load, which is\ngenuinely safe and emits no RuntimeWarning. Update the test that w\n[…]\nto nltk.tokenize.punkt\n\nKeep picklesec.py as generic primitives only. Move punkt_pickle_load\nand _PUNKT_ALLOWED_MODULES into nltk/tokenize/punkt.py where the\nPunkt classes and loading call sites live.",
          "is_bot": false,
          "headline": "fix(security): prevent pickle RCE in TransitionParser model loading (…",
          "author_name": "Litesh Ghute",
          "author_login": "LiteshGhute",
          "committed_at": "2026-07-01T09:46:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8493007b3ec04bfa132ed5ca9cbecf127ecc9eda",
          "body": "MaltParser.parse_tagged_sents() changed the process CWD to the model directory before invoking the external parser and restored it only after _execute() returned. Because os.chdir() is process-wide, concurrent relative-path I/O in the same process could be redirected into the model directory, and ex\n[…]\n directory instead of changing the Python process CWD. Also clean parser temp files from a finally block so they are removed on exception paths.\n\nReported by KKfine via huntr. CVE-2026-12614 assigned.",
          "is_bot": false,
          "headline": "fix(security): avoid MaltParser process-wide CWD changes (#3682)",
          "author_name": "KKfine",
          "author_login": "haoami",
          "committed_at": "2026-07-01T04:53:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e20c3eee79239e7c85a615d47b24123ef8e0151",
          "body": "…3647)\n\n* Fix CWE-88 JVM argument injection in java_options (CVE-2026-12841)\n\nAdd _validate_java_options() which blocks flags that load native agents\nor enable remote debugging (-agentlib, -agentpath, -javaagent, -Xrunjdwp,\n-Xdebug, -Xnoagent) from being passed to the JVM via the java_options\nparame\n[…]\ncy forms.\n\nVerified locally: nltk/test/internals.doctest passes and test_corenlp.py\nsetup now skips cleanly (6 errors -> 6 skips).\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix CWE-88 JVM argument injection in java_options (CVE-2026-12841) (#…",
          "author_name": "samrigby64",
          "author_login": "samrigby64",
          "committed_at": "2026-07-01T04:51:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f975449d2eb61774185869b8bebcdf7b7340281",
          "body": "* Use OMW-2.0 with all WordNet versions\n\n* Refresh nltk_data cache\n\n* Update doctest example",
          "is_bot": false,
          "headline": "Use OMW-2.0 with all WordNet versions (#3690)",
          "author_name": "Eric Ka",
          "author_login": "ekaf",
          "committed_at": "2026-07-01T04:49:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e9130f312bda68aa9dbefdfec37c6d30ce61654",
          "body": "* fix(security): Quadratic-time DoS in GDFA word-alignment symmetrization\n\ngrow_diag_final_and's grow_diag() helper rescanned the entire srclen x trglen\ngrid on every growth round and final_and() did another full grid scan. srclen\nand trglen are independent integers that are never validated against \n[…]\n before os._exit in the spawned worker so its traceback is not lost\n(os._exit skips buffered-I/O flushing), keeping a CI failure diagnosable.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Quadratic-time DoS in NLTK GDFA (#3686)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T04:48:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb76e438244dcb1d404267b7d736fbf78fc70dd5",
          "body": "…kquotes/lists (#3685)\n\n* fix(security): Quadratic-time DoS in Markdown reader blockquotes/lists\n\nblockquote_reader and the identical list_reader located each top-level block by\ncalling tokens.index() twice per block over the full flat token list produced\nfor the whole document -- an O(n) scan per b\n[…]\ne pass.\n- Flush stderr before os._exit in the spawned linearity worker so its traceback\n  is not lost (os._exit skips buffered-I/O flushing).\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Quadratic-time DoS in NLTK Markdown corpus reader bloc…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T04:47:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "660ec0144fc8038208fb909b661d13e32a8dd9a0",
          "body": "…r._normalize (#3684)\n\n* fix(security): Quadratic-backtracking ReDoS in AlpinoCorpusReader._normalize\n\nThe Alpino node-normalization helper converted each <node ...> element to\ns-expression notation with substitutions that chained several lazy `.*?` groups\nhunting for trailing literals (` pos=\"`, ` \n[…]\n\n\nAlso flush stderr before os._exit in the spawned linearity worker so its\ntraceback is not lost, and add a malformed-fields regression test.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Quadratic-backtracking ReDoS in NLTK AlpinoCorpusReade…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T04:47:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ea786920f0e3ffcebb688f5ec16c55ed375cdfb",
          "body": "…-by-zero (#3679)\n\n* fix(security): DoS in NLTK segmentation pk metric via uncaught divide-by-zero\n\nWhen no window size is supplied, pk derives it as\nk = round(len(ref) / (ref.count(boundary) * 2.0)). A boundary-free reference\nmakes ref.count(boundary) == 0, so the division raises an uncaught\nZeroDi\n[…]\ncore\n!= 0). The previous version used identical ref/hyp, which returns 0.0 for any k\nand so would have passed even if the derivation changed.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): DoS in NLTK segmentation pk metric via Uncaught divide…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T04:46:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3127e192278c35202ca623a7752456d61d6561b3",
          "body": "NombankInstance.parse converted the sentence/word-number fields with int() and\nsplit the predicate and each argument on \"-\" without validating them, so a\nmalformed corpus line raised a cryptic, uncaught ValueError (invalid literal for\nint() / not enough values to unpack). parse() is called by\nNomban\n[…]\nlready raises for other malformed lines. Valid lines\nparse unchanged. (Sibling of the PropBank fix #3671.)\n\nAdd nltk/test/unit/test_nombank_security.py.\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): DoS in NLTK NomBank instance parsing (#3678)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:44:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ccdcfad82f84700df3b5db85b6d6a1ce85f11fd",
          "body": "…r (#3676)\n\n* fix(security): Quadratic-memory DoS in NLTK ProjectiveDependencyParser\n\nProjectiveDependencyParser.parse and ProbabilisticProjectiveDependencyParser\n.parse eagerly allocate a dense (n+1)x(n+1) chart (O(n^2) memory) and run an\nunconditional i/j/k triple loop over it (O(n^3) time), where\n[…]\noutput works for a non-subscriptable iterable (iterator/generator) input\ninstead of raising TypeError. Add a generator-input regression test.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Quadratic-memory DoS in NLTK ProjectiveDependencyParse…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:44:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "834f806b37c29d5ed9f05743d676dd0d88ec51cb",
          "body": "…lify (#3675)\n\n* fix(security): Exponential beta-reduction DoS in NLTK Expression.simplify\n\nApplicationExpression.simplify substitutes the argument into a lambda body and\nre-simplifies. replace() copies the argument once per occurrence of the bound\nvariable, so a \"doubler\" (\\Y.(Y & Y)) duplicates it\n[…]\nll short-circuits at the limit so a lower cap also makes the\nrefusal cheaper. Benign reductions are unchanged; the existing tests still pass.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Exponential beta-reduction DoS in NLTK Expression.simp…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:43:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8e47539317b571ab1422981f5b9653d5eae1249",
          "body": "* fix(security): Quadratic ReDoS in NLTK Text.findall token search\n\nTokenSearcher.findall (and Text.findall, which delegates to it) turned a token\nregex into a real regex and applied it multi-position with re.findall over the\njoined corpus string. For a quantified token group followed by a non-match\n[…]\nsion test (monkeypatching regex.findall) for the runtime override,\n  and print the traceback in the spawned linearity worker before it exits.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Quadratic ReDoS in NLTK Text.findall token search (#3674)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:43:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9cd22715a4b128be7c0b1fed8b9a51250eede924",
          "body": "… (#3673)\n\nun_chomsky_normal_form removed each artificial Chomsky-Normal-Form node from its\nparent with parent.index(node)/parent.remove(...). Because Tree subclasses list,\nthose compare children by value via the recursive Tree.__eq__, rescanning a\nchild list that grows wide as nodes are spliced out\n[…]\nit round-trips chomsky_normal_form for both factors and\nmatches the previous output on 14k fuzzed CNF trees.\n\nAdd nltk/test/unit/test_treetransforms.py.\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Quadratic-time DoS in NLTK Tree.un_chomsky_normal_form…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:42:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1106a38d89fa2dd5d435b6b5bab4a73e3f9ce72b",
          "body": "…mentation metrics (#3672)\n\n* fix(security): Denial of service via quadratic complexity in NLTK segmentation metrics\n\nwindowdiff and pk slide a window across the segmentation and recompute\nseg[i:i+k].count(boundary) from scratch at every position. That slice count is\nO(k) and runs once per position,\n[…]\nthe traceback in the spawned linearity-check workers before exiting, so\n  a failure in CI is diagnosable instead of a bare numeric exit code.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): Denial of service via quadratic complexity in NLTK seg…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:41:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21e5219e3d37dcd8dfaf4edfccd85eb29ba68f31",
          "body": "* fix(security): DoS in NLTK PropBank\n\nPropbankInstance.parse converted the sentence/word-number fields with int()\nand split each argument on \"-\" without validating them, so a malformed corpus\nline raised a cryptic, uncaught ValueError (invalid literal for int() / not\nenough values to unpack). parse\n[…]\narator check (the unpacking ValueError is now caught too). Add\nregression tests for the inflection, -rel pointer, and argument pointer cases.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): DoS in NLTK PropBank (#3671)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:41:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "30953b77c3ca8e72b581e1f659ce40ec5219ed26",
          "body": "* fix(security): quadratic DoS in NLTK LEPOR alignment\n\nnltk.translate.lepor.alignment (used by sentence_lepor/corpus_lepor) had two\ndefects reachable from ordinary input:\n\n- Uncaught IndexError (CWE-20): the match-flag list was created empty and then\n  assigned into by index, raising \"list assignme\n[…]\nty-check worker before it exits with\nits error code, so a failure in CI is diagnosable instead of surfacing only as\na bare numeric exit code.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): quadratic DoS in NLTK LEPOR alignment (#3670)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:40:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de9bcb2b4fe0a7446ff6025f738d5dfd6462d48b",
          "body": "…d-line crash (CWE-20) (#3669)\n\n* Validate CoNLL / CMUdict reader lines to stop malformed-line crash\n\nThree readers split or index a corpus line without checking its shape, so a\nsingle malformed line raised an uncaught exception out of a standard public\nreader method and aborted iteration over the w\n[…]\nunter>\n  <transcription>\") so the data is a well-formed CMUdict line, and assert the\n  full pronunciation list (the reader keeps pieces[2:]).\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): validate CoNLL / CMUdict reader lines to stop malforme…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:40:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "354da5a795eb255d8acf8dfc07330aaa0cbdcbbf",
          "body": "…d input (CWE-476) (#3668)\n\n* Guard CHILDESCorpusReader.convert_age against malformed input\n\nconvert_age did `re.match(...).group(1)` without checking that the match\nsucceeded, so any string that does not fit the rigid CHILDES `P<d>Y<d>M?...`\nshape made re.match return None and the group access rais\n[…]\ns the trailing 'M' is\n  required: the 'M' and the '<days>D' suffix are optional (e.g. \"P2Y10\" is\n  accepted), which the message now reflects.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): guard CHILDESCorpusReader.convert_age against malforme…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:39:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "709162f52b3317575b87cf59d96a1e9bbccf4cb7",
          "body": "…arch DoS (CWE-400 / CWE-674) (#3667)\n\n* Bound theorem-prover proof search to stop unbounded-search DoS\n\nResolutionProver._attempt_proof saturated an ever-growing clause list with\nno limit, so a satisfiable goal (e.g. a transitive-closure query) made\nprove() pin a CPU core forever. TableauProver exp\n[…]\ninst an empty clause list (max() over an empty sequence\nraised), which fixes the same latent crash on the existing recursion-exhaustion\npath.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound theorem-prover proof search to stop unbounded-se…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:38:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0624fecd45e48337a1f070856bdbcb10643e48c2",
          "body": "…e DoS (CVE-2026-12929) (#3666)\n\n* fix(security): make METEOR word matching linear to stop quadratic-time DoS (CVE-2026-12929)\n\nnltk.translate.meteor_score's matcher (_match_enums, reached from the public\nsingle_meteor_score/meteor_score) compares every hypothesis token against every\nreference token\n[…]\nad of\nos._exit(0)/os._exit(3), so a worker exception is surfaced to the assertion\n(actionable CI failures) and drop the now-unused os import.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): make METEOR word matching linear to stop quadratic-tim…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:38:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70a8b0560e12a1d638d97dabdf3845e58c153259",
          "body": "…ded-memory DoS (CVE-2026-12928) (#3665)\n\n* fix(security): bound NgramCounter distinct-ngram count to stop unbounded-memory DoS (CVE-2026-12928)\n\nnltk.lm.NgramCounter stores every distinct ngram of every order in a nested dict\ntree with no size bound, so training a language model on an attacker-cont\n[…]\nm(): check the bound before incrementing _distinct, so a refused\n  ngram (which is never stored) does not inflate the distinct-ngram tracker.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound NgramCounter distinct-ngram count to stop unboun…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:37:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12f7d0bd0cf70ecd1d42f6919ac4d7749cacd7b8",
          "body": "…top cubic DoS (CVE-2026-12926) (#3664)\n\n* fix(security): make jaro_similarity flagged-position lookup O(1) to stop cubic DoS (CVE-2026-12926)\n\nnltk.metrics.distance.jaro_similarity matches characters within an O(n**2)\nwindow double loop and, inside it, tests `j not in flagged_2` against a list.\nTha\n[…]\nd the sorted list\n  used for the transposition pass as separate variables (matched_2 / flagged_2)\n  rather than mutating one variable's type.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): make jaro_similarity flagged-position lookup O(1) to s…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-07-01T03:36:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c31143fc0f68452b218f39a686a0b70a29ccb19a",
          "body": "* Fix duplicated -l short option on `nltk tokenize` (#3342)\n\n`nltk tokenize` declared `-l` as the short option for both `--language`\nand `--preserve-line`. With click >= 8.x this triggers\n`UserWarning: The parameter -l is used more than once` on every\ninvocation and produces an inconsistent help mes\n[…]\nd by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Eric Kafe <kafe@megadoc.net>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Fix duplicated -l short option on `nltk tokenize` (#3342) (#3580)",
          "author_name": "Jean-Baptiste Braun",
          "author_login": "jbbqqf",
          "committed_at": "2026-06-26T17:30:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43c2280e377527cc67f87b265f3a3a9df5afbcd9",
          "body": "…#3573)\n\n* Speed up CRFTagger default feature extraction\n\nCache token-local default CRF features and bind hot-loop dispatch points (re.search, unicodedata.category). Guard tag/tag_sents against string, bytes, and single-tokenized-sentence input. Rename the tag_sents parameter sents -> sentences to m\n[…]\n_sents/tag/train; and add a :param sents: line to tag_sents documenting the deprecated alias added in the previous commit.\n\nNo behavior change.\n\n---------\n\nCo-authored-by: Copilot <copilot@github.com>",
          "is_bot": false,
          "headline": "Cache CRFTagger feature extraction; harden boundaries and add tests (…",
          "author_name": "John Winstead",
          "author_login": "jhnwnstd",
          "committed_at": "2026-06-26T17:28:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0cdab5d6aef4a3833ad9cc4d721bcad9a49f2795",
          "body": "…loader (#3628)\n\n* Fix: Prevent Arbitrary File Write via XML Attribute Injection in nltk.downloader\n\n* Remove duplicate assignment of filename\n\n* Resolve merge conflicts with develop\n\n* Update test_downloader_symlink_security.py for new Package init",
          "is_bot": false,
          "headline": "Prevent Arbitrary File Write via XML Attribute Injection in nltk.down…",
          "author_name": "Eric Ka",
          "author_login": "ekaf",
          "committed_at": "2026-06-26T11:45:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "235853c21c0b7f35e79d71877ad587837f17ba6d",
          "body": "…top cubic DoS (CVE-2026-12870) (#3657)\n\n* fix(security): bound phrase_extraction default max_phrase_length to stop cubic DoS (CVE-2026-12870)\n\nnltk.translate.phrase_based.phrase_extraction defaults max_phrase_length to the\nfull sentence length (max_phrase_length or max(srclen, trglen)), so the defa\n[…]\n an empty alignment: the guard still runs on the full default\nlength but no phrases are built (~0.03 MB, ~12 ms). Result is now an empty set.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound phrase_extraction default max_phrase_length to s…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:47:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6d75db532cb4f9383091a329fd8d9270aaac093",
          "body": "…bounded-enumeration DoS (CVE-2026-12864) (#3654)\n\n* fix(security): bound generate() derivation-expansion steps to stop unbounded-enumeration DoS (CWE-400)\n\nnltk.parse.generate.generate uses a large default depth (recursionlimit//3,\n~330) and no default cap on the number of sentences, so a tiny recu\n[…]\n. Rewrite it as indented\n   continuation lines so it renders correctly.\n\ngenerate.doctest, grammar.doctest and the unit tests pass unchanged.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound generate() derivation-expansion steps to stop un…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:46:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8d9eb90902f603bc6c24d94a537f736b7cd77e0e",
          "body": "…ilter (NAT64 bypass, CWE-918) (#3644)\n\n* fix(security): block IPv6 transition-embedded internal IPv4 in SSRF filter (CWE-918)\n\nIncomplete-fix sibling of the DNS-rebinding SSRF fix, which unwrapped only\nIPv4-mapped IPv6 (::ffff:a.b.c.d) in _ip_is_forbidden. The other IPv6->IPv4\ntransition embeddings\n[…]\n:808 and\n  IPv4-mapped-public) must be allowed. The NAT64/IPv4-compatible cases fail\n  against the pre-fix mapped-only unwrap and pass after.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): block IPv6 transition-embedded internal IPv4 in SSRF f…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:43:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a5740af89feeb739193db766e11e85dfe78339c",
          "body": "* fix: enforce package ownership during ZIP extraction (CVE-2026-12261)\n\nCross-package resource and model poisoning was possible because:\n\n1. _unzip_iter extracted into a shared subdir namespace, allowing\n   a package with subdir='taggers' to overwrite files belonging to\n   any other package in that\n[…]\nd-by: Mohammad Favas S (@ibfavas) via huntr\n\n* style: apply pyupgrade and black formatting\n\n* fix: validate legacy MD5 checksums before extraction\n\n* test: add downloader ownership regression coverage",
          "is_bot": false,
          "headline": "fix: enforce package ownership during ZIP extraction (#3625)",
          "author_name": "Mohammad Favas S",
          "author_login": "ibfavas",
          "committed_at": "2026-06-26T09:41:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4085d53c7793d3d6622f2bf02272faf54d4c3975",
          "body": "…dratic ReDoS (CVE-2026-12919) (#3663)\n\n* fix(security): make feature-structure rename regex linear to stop quadratic ReDoS (CVE-2026-12919)\n\nnltk.featstruct._rename_variable strips a trailing run of digits from a variable\nname with re.sub(r\"\\d+$\", \"\", var.name). The greedy \\d+ made a name with a lo\n[…]\n: exit 0 only on a\ncompleted rename and exit non-zero otherwise, so the parent assertion fails. The\nhang case is still caught by the timeout.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): make feature-structure rename regex linear to stop qua…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:38:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7130b49223947fb787047261e128c0ce24ffc434",
          "body": "…c ReDoS (CVE-2026-12890) (#3662)\n\nnltk.sem.evaluate splits each valuation line on _VAL_SPLIT_RE = \\s*=+>\\s*. The\ngreedy =+ run made splitting a line that holds a long run of '=' not terminated\nby '>' re-scan the run from every position (match =+, miss >, backtrack), which\nis quadratic in the run le\n[…]\n linear\ntime, run in a spawned process with a hard timeout so a regression to the\nquadratic pattern cannot hang the suite (it is CPU-only, no OOM risk).\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): make valuation separator regex linear to stop quadrati…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:36:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a42d9cabc98ef1b7e83e69812d2c0ab7e95e0f5",
          "body": "…DoS (CVE-2026-12886) (#3661)\n\n* fix(security): bound chart parse-tree extraction to stop exponential DoS (CVE-2026-12886)\n\nnltk.parse.chart.ChartParser and subclasses build the chart in polynomial time\nbut Chart._trees materialises every parse tree eagerly into a list. With a tiny\nhighly-ambiguous \n[…]\nFalse / partial-tree path) were not counted, making MAX_PARSE_TREES\n   an inaccurate node-construction bound. Spend the budget for those too.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound chart parse-tree extraction to stop exponential …",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:35:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "26ddcd0e3a3c04441fafacc16c7354038b744aa1",
          "body": "…+memory DoS (CVE-2026-12873) (#3660)\n\n* fix(security): bound DRT resolve_anaphora work to stop quadratic time+memory DoS (CVE-2026-12873)\n\nnltk.sem.drt.resolve_anaphora resolves each PRO(x) condition by scanning every\ndiscourse referent on the trail and retaining the compatible ones as a candidate\n\n[…]\nueError rather than an obscure\n   error mid-resolution.\n\ndrt.py doctest and the regression tests pass; behaviour on valid input is\nunchanged.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound DRT resolve_anaphora work to stop quadratic time…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:34:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "583d63ac3ded20a70e073b2bcd1dc60304070903",
          "body": "…(CVE-2026-12871) (#3659)\n\n* fix(security): route data.retrieve write through the pathsec sandbox (CVE-2026-12871)\n\nnltk.data.retrieve copied a resource to a caller-supplied filename using the\nbuiltin open(filename, \"wb\"), bypassing NLTK's centralized file-access sentinel\n(nltk.pathsec). With the sa\n[…]\n platforms.\nVerified retrieve() round-trips an as_uri() URL (including a path containing\nspaces); test-only change, all assertions unchanged.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): route data.retrieve write through the pathsec sandbox …",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:32:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c65ca13e873721c5abf5a4ce8c78510c5956d839",
          "body": "…(CVE-2026-12868) (#3658)\n\n* fix(security): make Cistem stemmer linear to stop quadratic-time DoS (CVE-2026-12868)\n\nCistem._segment_inner stripped 1-2 trailing characters per iteration with\nregex.subn(\"\", word), which rebuilds the whole remaining string on every\nremoval. With ~n iterations (a word o\n[…]\nterns. Reword to \"the compiled re patterns'\nPattern.subn\" so the security note is unambiguous. Comment/docstring only -- no\nbehaviour change.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): make Cistem stemmer linear to stop quadratic-time DoS …",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:31:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8527d08138ae674f33f7fb08b2f8b55c3cf11861",
          "body": "… (CVE-2026-12867) (#3656)\n\n* fix(security): route DependencyGraph.load through the pathsec sandbox (CVE-2026-12867)\n\nnltk.parse.dependencygraph.DependencyGraph.load opened the caller-supplied\nfilename with the builtin open, bypassing NLTK's centralized file-access\nsentinel (nltk.pathsec). Where an \n[…]\n that with ENFORCE off the load emits\n   the expected RuntimeWarning but still reads the file.\n\nBoth tests pass; the fix itself is unchanged.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): route DependencyGraph.load through the pathsec sandbox…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:29:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e9d537ac5ce698a98148398cd4c5e8da59d9965",
          "body": "…ocation DoS (CVE-2026-12861) (#3655)\n\n* fix(security): bound everygrams default max_len to stop unbounded-allocation DoS (CVE-2026-12861)\n\nnltk.util.everygrams defaults max_len to a -1 sentinel that expands to the full\nsequence length, so calling it with default arguments enumerates every n-gram\nof\n[…]\nn OOM. Rename\n   the now-inaccurate _EXIT_MATERIALIZED outcome to _EXIT_ENUMERATED.\n\nutil.py doctest and the regression tests pass unchanged.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound everygrams default max_len to stop unbounded-all…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:28:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7668b593fba1eeb5197987ebbb3251302bc678b",
          "body": "…mbinatorial DoS (CVE-2026-12840) (#3653)\n\n* fix(security): bound Model.satisfy quantifier-nesting cost to stop combinatorial DoS (CVE-2026-12840)\n\nModel.satisfy iterates the entire domain once per nested quantifier/lambda,\nso a formula with k nested binders costs O(|domain| ** k). k comes entirely\n\n[…]\nThis is a\ndocumentation-only change; the guard logic and all behaviour are identical\n(evaluate.py doctest and the unit tests pass unchanged).\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound Model.satisfy quantifier-nesting cost to stop co…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:25:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6155c03362fe003ecbf7e383180b9e06f42ae7e",
          "body": "…VE-2026-12839) (#3652)\n\n* fix(security): sparse ConfusionMatrix to stop quadratic-memory DoS (CVE-2026-12839)\n\nConfusionMatrix built and retained a dense V x V list-of-lists, where V is the\nnumber of distinct values across reference + test. Since the allocation is sized\nby the distinct-value count \n[…]\nchanged. Measured sort cost on an all-distinct input drops from 675 ms to\n0.3 ms at 8000 labels (and the gap widens quadratically with size).\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): sparse ConfusionMatrix to stop quadratic-memory DoS (C…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:24:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f455b85a5183a54c30e667aaf1254331a93c6fa7",
          "body": "…S (CVE-2026-12837) (#3651)\n\n* fix(security): sparse Alignment index to stop unbounded-allocation DoS (CVE-2026-12837)\n\nAlignment parses GIZA word-alignment strings; each pair's left index is an\nunbounded int() and the largest left index is stored as self._len. _build_index\nthen allocated a dense li\n[…]\nt OOM the host.\n\nAdds a test that non-integer keys raise TypeError. The Alignment doctests and\nthe existing sparse/range tests are unchanged.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): sparse Alignment index to stop unbounded-allocation Do…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:24:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3da396507c39040db8f76f3c0a30c397ebed622c",
          "body": "…eanup (CWE-59) (#3643)\n\nSibling of the downloader arbitrary-write finding (CVE-2026-12178, lexical\ncontainment check): same root cause (the check does not resolve symlinks),\ndifferent sink. When a package is STALE, _download_package cleans up the\nprior unzip directory with _safe_rmtree(unzipdir). u\n[…]\ndeletes the victim (only the planted\nsymlink is removed); a real stale unzipdir with nested files is still fully\nremoved; test_downloader_atomic passes.\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): stop symlink-following deletion in downloader stale-cl…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:21:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b05cda5e5f7c84f9cdf083863ab9391c2d3fcc69",
          "body": "…S (CWE-409) (#3613)\n\n* fix(security): cap zip decompression to prevent decompression-bomb DoS (CWE-409)\n\nNLTK read whole zip members into memory (ZipFilePathPointer.open,\nOpenOnDemandZipFile.read) and extracted them to disk (nltk.downloader) with no\nsize limit, so a tiny archive whose member decomp\n[…]\ne with\n  integers and report the ratio as %.1f, so the threshold decision and the error\n  message agree near the boundary;\n- add a regression test that a bomb following a benign member writes nothing.",
          "is_bot": false,
          "headline": "fix(security): cap zip decompression to prevent decompression-bomb Do…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:15:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "68b5ae3592381b8ecfbe2c89fb461319ea884b46",
          "body": "…E-59) (#3636)\n\nAdds test_xml_corpus_reader_blocks_symlink_escape: an in-corpus symlink\n(link.xml) pointing to a valid BNC XML file outside the corpus root must be\nblocked (PermissionError/ValueError), not parsed and returned, when the\npathsec sandbox is confined to the corpus root. Exercises the no\n[…]\n -- the secret is parsed and returned) against\nthe pre-fix readers and passes after parsing through fileid.open().\n(Addresses the PR review suggestion.)\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "test: regression test for XML corpus reader symlink escape (CWE-22/CW…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-26T09:14:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "064456d02c145032755b084f620cb95395819e41",
          "body": "…#3641) (#3677)\n\n#3615 left nltk/corpus/reader/senseval.py with mis-grouped third-party imports\nafter merge (`import regex` and the defusedxml `from` import in separate blocks),\nwhich fails the pre-commit isort hook. Because pre-commit gates the test matrix,\nthis blocked CI on every develop push and\n[…]\n compact form (now splitting sensibly, e.g. a-->b -> a/-->/b instead\nof the old a-/->/b).\n\nAdd a behavior test for the spaced and compact lexicon forms.\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(ci): resolve isort block (#3615) and restore CCG lexicon syntax (…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T15:47:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04fa1a9d467aaa70d10c4b0e3d5f82461aace1a9",
          "body": "…(#3642)\n\n* fix(security): reject CWD-relative binaries in find_binary (search-path RCE, CWE-426)\n\nProver9/Mace (and every other find_binary caller) locate native executables\nby a bare relative name with no explicit path in the default flow.\nfind_binary -> find_file_iter resolves each relative name \n[…]\ntest_find_binary_honors_explicit_relative_path_via_name (fails against the\nover-broad gate); the existing bare-name refusal tests still pass.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): reject CWD-relative binaries in find_binary (CWE-426) …",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:28:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4f4bb5cc80a5d8ba77ab3b5a2e3beb79df9484c",
          "body": "… (#3641)\n\n* fix(security): make CCG lexicon identifier match atomic to stop quadratic ReDoS (CWE-1333)\n\nfromstring() runs LEX_RE on every lexicon line. Its first group [\\S_]+ is\ngreedy over non-whitespace and the arrow alternative [-=]+> also matches\nthe non-whitespace -/= characters, so on a line \n[…]\na hard\n  timeout, so an exponential/quadratic regression fails fast instead of hanging\n  the suite. These time out against the pre-fix regex.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): stop quadratic ReDoS in CCG lexicon parsing (CWE-1333)…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:26:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00335c0f81c8ac20b58ea00dba116fcb1fc079bc",
          "body": "…E-22) (#3640)\n\n* fix(security): route custom_distance through the pathsec sentinel (CWE-22)\n\ncustom_distance(file) opened a caller-supplied filename with the builtin\nopen() instead of nltk.pathsec.open, bypassing the centralized file-access\nsentinel. Under pathsec.ENFORCE=True (the default), reads \n[…]\nbuiltin open(). Fails (DID NOT\nRAISE) against the pre-fix builtin-open implementation and passes after.\n(Addresses the PR review suggestion.)\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): route custom_distance through the pathsec sentinel (CW…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:24:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6f786cc94158a99cfc9c5edb50e634ccb271ae7",
          "body": "…nment (CWE-407) (#3639)\n\n* fix(security): bound super-linear n-gram scan in RIBES word_rank_alignment (CWE-407)\n\nword_rank_alignment (reached by the public sentence_ribes/corpus_ribes)\nfirst eagerly materialised every n-gram for n = 1..len(reference) -- O(L^2)\ntuples summing to O(L^3) memory -- and\n[…]\n-gram lists are no\n  longer built, but individual context-window tuples are still created, so\n  \"no n-grams are materialised\" was misleading.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound super-linear n-gram scan in RIBES word_rank_alig…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:23:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c04f6d88e15cc18b55c296fd5ef1be4af7ab9a6e",
          "body": "…7) (#3638)\n\npolarity_scores called words_and_emoticons.index(item) once per token in\na loop over the same list. list.index is an O(n) scan, so over n distinct\ntokens the loop cost was O(n^2). polarity_scores is routinely applied to\nuntrusted user text in web services, so a single request of a few h\n[…]\nmismatches) and against the real vader_lexicon doctest\nscores; 64k distinct tokens drop from ~14.1s to ~0.58s, with the speedup\ngrowing with input size.\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): remove quadratic scan in VADER polarity_scores (CWE-40…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:22:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7377ae521d6265679fdae18c006fe048ccf1dd0b",
          "body": "…CWE-352) (#3637)\n\n* fix(security): require a session token for WordNet Browser shutdown (CWE-352)\n\nIn its default (browser) mode the WordNet Browser server terminated the\nwhole process via os._exit(0) on a GET to /SHUTDOWN THE SERVER, with no\nOrigin/Referer/Host/CSRF-token check. Since the shutdown\n[…]\n the 403 response\ntext from \"session token\" to \"per-process token\" so the failure mode is clear\nto maintainers and users. No behavior change.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): require a session token for WordNet Browser shutdown (…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:20:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "792d77a8d7d5feeb9626ea83c958afa324d64c72",
          "body": "…-22) (#3635)\n\n* fix(security): validate path in GzipFileSystemPathPointer.open() (CWE-22)\n\nNLTK enforces a file-access sandbox by default (pathsec.ENFORCE=True), and\nFileSystemPathPointer.open() honours it by opening through the centralized\nsentinel (_secure_open -> pathsec.open -> validate_path). \n[…]\n (DID NOT RAISE) against the pre-fix\n  direct-GzipFile open and passes after routing through pathsec.\n\n(Addresses the PR review suggestions.)\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): validate path in GzipFileSystemPathPointer.open() (CWE…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:17:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b308cb0f9d5f5aea2f1633f138c7a0b33eb5ad3",
          "body": "…ip guard (CWE-22) (#3634)\n\n* fix(security): close validate/extract path mismatch in pathsec Zip-Slip guard (CWE-22)\n\nvalidate_zip_archive (the centralized Zip-Slip sentinel used by\npathsec.ZipFile.extract/extractall) validated `(target / name).resolve()`,\nwhich collapses a \"..\" against its precedin\n[…]\nutside the extraction root.\n\nBoth fail (DID NOT RAISE) against the pre-fix validator and pass after it.\n(Addresses the PR review suggestion.)\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): close validate/extract path mismatch in pathsec Zip-Sl…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:12:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a06066141b3defe23c710727404dea3fe7c6fbf3",
          "body": "…4) (#3633)\n\n* fix(security): bound recursion in PorterStemmer._is_consonant (CWE-674)\n\n_is_consonant recursed with no depth bound whenever the current letter\nwas 'y': for a 'y' it returned `not _is_consonant(word, i - 1)`, walking\nbackward one stack frame per character. A single token consisting of\n[…]\nr. This guards the iterative _is_consonant fix and prevents the\nrecursive form from being reintroduced. (Addresses the PR review suggestion.)\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): bound recursion in PorterStemmer._is_consonant (CWE-67…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:11:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c67a1419872facc8aafa48e8b550dbdf7e3b7233",
          "body": "…s_cycle (#3632)\n\n* Fix algorithmic-complexity DoS in DependencyGraph.contains_cycle (CWE-407)\n\ncontains_cycle detected cycles by repeatedly recomputing a transitive\nclosure with a triple-nested loop over a `distances` set that grows\nquadratically in the number of nodes. Its running time was therefo\n[…]\n E) here\" so the wording is\naccurate while keeping the DoS rationale clear. Comment-only; no behavior\nchange. (Addresses the PR review note.)\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security):  algorithmic-complexity DoS in DependencyGraph.contain…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:10:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "20400ae6ac462ef206d4fe3c5145f54c4e89bd54",
          "body": "…6) (#3623)\n\nBoxer resolved its candc/boxer executables with find_binary() and ran them via\nsubprocess.Popen. find_binary() also matches a binary relative to the current\nworking directory -- a relative bin_dir yields ./candc, and even the default\nbin_dir=None matches a candc/candc directory in the C\n[…]\nNDC environment variable and a\n$PATH lookup are unchanged. Add regression tests. Same class as the MaltParser\n(#3616), ReppTokenizer (#3618), Weka (#3620) and Senna (#3621) fixes and as\nCVE-2026-0848.",
          "is_bot": false,
          "headline": "fix(security): do not run the candc/boxer binary from the CWD (CWE-42…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:08:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cffe7b139ac054fad58ea9fef5462becba1f8aa6",
          "body": "* Add RELEASE-Github.md documentation\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Add RELEASE-Github.md documentation (#3627)",
          "author_name": "Eric Ka",
          "author_login": "ekaf",
          "committed_at": "2026-06-25T08:05:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf94145232c5ab11d75a9564d9196b086d5172fe",
          "body": "* fix(security): route read_sents through pathsec sentinel\n\n* Implement Copilot review suggestions",
          "is_bot": false,
          "headline": "fix(security): route read_sents through pathsec sentinel (#3626)",
          "author_name": "Eric Ka",
          "author_login": "ekaf",
          "committed_at": "2026-06-25T08:02:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9c33228448152f98d91a81c756728574e082996",
          "body": "…(CWE-1333) (#3646)\n\n* fix(security): stop exponential ReDoS in XMLCorpusView _VALID_XML_RE (CWE-1333)\n\nXMLCorpusView (the shared engine behind BNC/FrameNet/SemCor/NKJP/MTE/\nnps_chat) validates each XML fragment it reads from a corpus file with\n_VALID_XML_RE, which has the catastrophic shape [^<]* (\n[…]\nh exactly as before (0 mismatches\nover 8000), real CDATA is now validated/skipped correctly, and comment/doctype/\ncdata payloads stay linear.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>",
          "is_bot": false,
          "headline": "fix(security): stop exponential ReDoS in XMLCorpusView _VALID_XML_RE …",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T08:01:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83d25f65908a436ebc83b3884a270859a001306f",
          "body": "…xpansion DoS (CWE-776) (#3615)\n\n* fix(security): use defusedxml in corpus readers to block XML entity-expansion DoS (CWE-776)\n\nNLTK's XML corpus readers parsed untrusted corpus XML with the stdlib\nxml.etree.ElementTree, which performs entity expansion and is vulnerable to a\nBillion-Laughs denial of\n[…]\nters (e.g. ZipFilePathPointer). Open the pointer and parse the\nresulting stream, matching XMLCorpusReader.xml() and the propbank/nombank\nreaders. defusedxml's entity-expansion protection is unchanged.",
          "is_bot": false,
          "headline": "fix(security): use defusedxml in corpus readers to block XML entity-e…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:54:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb3b65e7aa12c7d8c9d4e64611be8cd56f522268",
          "body": "…59) (#3619)\n\n* Resolve symlinks in downloader containment check (CWE-59)\n\nThe download-target containment check added in #3595 is lexical\n(normpath/abspath + commonpath, not realpath), so it does not resolve\nsymbolic links. A symlink that already exists inside download_dir and\npoints outside it is \n[…]\ndownload_dir. Add a regression test for a link pointing to an ancestor.\n\nAlso skip the symlink tests where os.symlink is unavailable (e.g. Windows\nwithout Developer Mode) instead of failing the suite.",
          "is_bot": false,
          "headline": "fix(security): resolve symlinks in downloader containment check (CWE-…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:51:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1dea3e93ea5467753f3f096d54d0a4ec80ec0a47",
          "body": "* Route _download_package() writes through pathsec.open\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* Apply isort formatting after Copilot suggestion changes\n\n* Test scoped pathsec writes\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Route _download_package() writes through pathsec.open (#3622)",
          "author_name": "Eric Ka",
          "author_login": "ekaf",
          "committed_at": "2026-06-25T07:50:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0cec76e51f76fc94807619bffe6e3819dec3336f",
          "body": "…(#3630)",
          "is_bot": false,
          "headline": "fix(security): prevent ReDoS in chunk tag-pattern parsing (CWE-1333) …",
          "author_name": "Litesh Ghute",
          "author_login": "LiteshGhute",
          "committed_at": "2026-06-25T07:47:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5acf63c26e9eb31c6c42a38d2e6b1878fb5208a8",
          "body": "…621)\n\n* fix(security): do not run the senna binary from the CWD (CWE-829)\n\nSenna.__init__ accepted a relative senna_path (e.g. \".\") and resolved the\nexecutable against the current working directory. executable() returns a path\nthat contains a separator (e.g. ./senna-osx), and subprocess.Popen runs \n[…]\nnot found, so construction fails fast and consistently.\nThe security semantics are unchanged (relative senna_path / relative SENNA are\nstill rejected and the CWD is never used). Add a regression test.",
          "is_bot": false,
          "headline": "fix(security): do not run the senna binary from the CWD (CWE-829) (#3…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:45:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "880b6873aa70f67fc81e100085c8840e170c9e14",
          "body": "* fix(security): do not load weka.jar from the CWD (CWE-494)\n\nconfig_weka() searched for weka.jar with the current working directory (\".\")\nlisted first in _weka_search, before the system locations and WEKAHOME. A\n./weka.jar planted in the CWD by an attacker was therefore selected and executed\nvia ja\n[…]\ntion that the CWD is absent from the default search path.\n- config_weka() now copies _weka_search before inserting WEKAHOME, so repeated\n  calls no longer mutate the module-level default search order.",
          "is_bot": false,
          "headline": "fix(security): do not load weka.jar from the CWD (CWE-494) (#3620)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:44:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2fc0bf6c29e785046d7d4e2b13636e5cffd102f4",
          "body": "… not the CWD (CWE-427) (#3618)\n\n* fix(security): resolve relative ReppTokenizer dir via REPP_TOKENIZER, not the CWD (CWE-426)\n\nfind_repptokenizer() accepted repp_dirname as-is whenever os.path.exists() was\ntrue. For a relative name that resolves against the current working directory,\nand it was che\n[…]\nThe PathLike branch of test_absolute_path_still_accepted only asserted\ntruthiness of repp_dir. Assert it resolves to the same directory as the\ninput (os.path.realpath equality), matching the str case.",
          "is_bot": false,
          "headline": "fix(security): resolve relative ReppTokenizer dir via REPP_TOKENIZER,…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:43:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1c1ee39b3c3541148b607ee85ae2745594a7a6b",
          "body": "…RecursionError (CWE-674) (#3617)\n\n* fix(security): bound LogicParser recursion depth to prevent uncaught RecursionError (CWE-674)\n\nLogicParser is a recursive-descent parser: each nested sub-expression recurses\nthrough process_next_expression. Deeply nested input (e.g.\nExpression.fromstring(\"-\" * 50\n[…]\n the regression test (pytest.raises already\n  fails on an unexpected RecursionError) and correct the wording (this is\n  uncontrolled recursion, not ReDoS; nesting up to the cap parses, beyond raises).",
          "is_bot": false,
          "headline": "fix(security): bound LogicParser recursion depth to prevent uncaught …",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:42:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a23bffc0ada8b4e58311b20974ac4864f41c67c",
          "body": "…he CWD (CWE-426) (#3616)\n\n* fix(security): resolve relative MaltParser dir via MALT_PARSER, not the CWD (CWE-426)\n\nfind_maltparser() accepted parser_dirname as-is whenever os.path.exists() was\ntrue. For a relative name (as NLTK's docs use, e.g. MaltParser('maltparser-1.7.2'))\nthat resolves against \n[…]\nh a relative Path would otherwise\n  trip with an AssertionError);\n- check os.path.isdir() rather than os.path.exists() for the explicit-absolute\n  case, since the path is subsequently walked for jars.",
          "is_bot": false,
          "headline": "fix(security): resolve relative MaltParser dir via MALT_PARSER, not t…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:42:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b02e9ee8da67004559f55547082f706d52087a85",
          "body": "…) (#3614)\n\n* fix(security): prevent ReDoS in SensevalCorpusReader _fixXML (CWE-1333)\n\n_fixXML normalises Senseval pseudo-XML before parsing. Two of its substitutions\nused plain re patterns whose lazy/greedy whitespace and token runs rescan a long\ntoken / whitespace run that lacks the trailing <p=\".\n[…]\nt the comments (the crafted token is ~128 KB, not ~256 KB);\n- pass the fileid as a one-element list so CorpusReader treats it as an exact\n  fileid rather than a regexp (where `.` would be a wildcard).",
          "is_bot": false,
          "headline": "fix(security): prevent ReDoS in SensevalCorpusReader _fixXML (CWE-400…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:41:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "022fe14b8095ea91c1c653a0f8e1f4990ccfbc5f",
          "body": "…egex (CWE-1333) (#3612)\n\nTextTilingTokenizer._mark_paragraph_breaks scans for blank-line paragraph\nbreaks with [ \\t\\r\\f\\v]*\\n[ \\t\\r\\f\\v]*\\n[ \\t\\r\\f\\v]*. With the plain greedy `re`\npattern, finditer rescans a long horizontal-whitespace run that has no blank\nline quadratically: a crafted whitespace b\n[…]\ns are unchanged (verified identical finditer output) while the\nscan becomes linear. Add regression tests.\n\nReachable via the public TextTilingTokenizer().tokenize(text), where text is\nuntrusted input.",
          "is_bot": false,
          "headline": "fix(security): prevent ReDoS in TextTilingTokenizer paragraph-break r…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-25T07:40:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ed4fbd6ba0e53bb72d9d9b348e06af11fdbfbe4",
          "body": "* Fix perfect-agreement agreement metrics\n\n* Address Copilot review concerns in agreement metrics\n\n- _chance_corrected_agreement: raise ValueError instead of silently\n  returning 0.0 when expected~=1.0 but observed!=1.0, to avoid\n  masking violated distance contracts or undefined semantics.\n- S(): a\n[…]\neError when self.K is empty),\n  consistent with the existing guard in alpha().\n\n* Format with black to pass pre-commit checks\n\n---------\n\nCo-authored-by: Muhtasim-Munif-Fahim <fahim.stat.ru@gmail.com>",
          "is_bot": false,
          "headline": "Fix perfect-agreement edge cases in agreement metrics (#3608)",
          "author_name": "Md Muhtasim Munif Fahim",
          "author_login": "Muhtasim-Munif-Fahim",
          "committed_at": "2026-06-25T07:39:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16a32d680d070254d5744e33fa83f9c0056d5a1f",
          "body": null,
          "is_bot": false,
          "headline": "Fix release workflow CI check for tagged commits (#3611)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-11T20:09:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d791cbdaae1428e7f9b73fbf1c590ff7395ee562",
          "body": null,
          "is_bot": false,
          "headline": "Prepare release metadata for 3.10.0 (#3610)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-11T18:54:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be36cfe02f96deb9fc3e0bc4b21113a49cfc4cf7",
          "body": "* ci: apply review fixes, check docs, and use drafts\n\n* Prepare to build a release candidate",
          "is_bot": false,
          "headline": "Check that CI succeeded on the commit a release tag points to (#3506)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-11T18:14:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e8fcbb090d17d4e94a8d36aaca68c6bf82c7236",
          "body": null,
          "is_bot": false,
          "headline": "Document NLTK's new security policy (#3597)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-11T17:36:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e62eb121e4c897796d9399a56e3d4078c4742c8b",
          "body": "* Replace unsafe exec() with importlib in utility CLI\n\n* Address review concerns",
          "is_bot": false,
          "headline": "Replace unsafe exec() with importlib in utility CLI (#3609)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-11T17:02:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54228e2d9a69accb94aef8da9306c335f34f1757",
          "body": "* Fix remaining issues from PRs #3477 and #3498\n\n* Tighten Stanford segmenter JAR verification\n\n* Refactor Segmenter classpath validation and add regression tests",
          "is_bot": false,
          "headline": "Fix remaining post-merge issues from #3477 and #3498 (#3599)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-10T09:57:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2deaa35bce283767a20d1e96b21755690b866396",
          "body": "Cache WordNet max depth lazily for lch_similarity()",
          "is_bot": false,
          "headline": "Merge pull request #3592 from ekaf/hotfix-2273",
          "author_name": "Steven Bird",
          "author_login": "stevenbird",
          "committed_at": "2026-06-06T07:25:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a52ca96645577f1e77457769b14000a567c6f04f",
          "body": "Fix remaining corpus reader pathsec gaps before ENFORCE=True RC",
          "is_bot": false,
          "headline": "Merge pull request #3588 from ekaf/hotfix-3587",
          "author_name": "Steven Bird",
          "author_login": "stevenbird",
          "committed_at": "2026-06-06T07:23:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6e75671e8c96a0772018ef7179aa76f6e17274c",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'upstream/develop' into hotfix-3587",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-06T07:14:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "042359aa80c0428f59ff0f19a1c93e42a99686da",
          "body": "…WE-1333) (#3583)\n\n* fix(security): bound ReviewsCorpusReader FEATURES label to prevent ReDoS (CWE-1333)\n\nThe FEATURES regex used an unbounded feature label ((?:(?:\\w+\\s)+)?\\w+), so\nre.findall rescans a long, bracket-less review line quadratically: a crafted\ncorpus line such as \"word \" * 100000 hang\n[…]\nde the worker can no longer masquerade as a pass.\n- Use the tmp_path fixture instead of tempfile.mkdtemp(), so the temp corpus is\n  cleaned up automatically.\n- Drop the unused `re` import (ruff F401).",
          "is_bot": false,
          "headline": "fix(security): prevent ReDoS in ReviewsCorpusReader FEATURES regex (C…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-06T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7d1389d0789c1eca56bd0ed444089e0a3972e3ed",
          "body": "…#3581)\n\n* fix(security): block path traversal in FramenetCorpusReader.frame() (CWE-22)\n\nFramenetCorpusReader.frame(name) -> frame_by_name() interpolates the\ncaller-supplied frame name into an XML file path that is then read with the\nbuiltin open() via XMLCorpusView, bypassing the CorpusReader.open(\n[…]\n blocks, so a missing file behaves as before.\n\n- Add regression tests for doc() (previously untested), the Windows drive\n  prefix, and a legitimate in-root frame read that guards the abspath refactor.",
          "is_bot": false,
          "headline": "fix(security): block path traversal in FramenetCorpusReader.frame() (…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-06T06:48:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf3bf32786791394a1008258b4917a7f2d4dbcda",
          "body": "* fix(security): block path traversal in NKJPCorpusReader (CWE-22)\n\nNKJPCorpusReader's read methods (header/raw/words/sents/tagged_words) build\nfile paths from the caller-supplied `fileids` via add_root() string\nconcatenation and read them with the builtin open(), bypassing the\nCorpusReader.open() /\n[…]\nnchanged.\n\nAdds a regression test (test_nkjp_header_rejects_inroot_symlink_escape)\ncovering an in-root symlink that resolves outside the corpus -- the case\nthe old abspath-based check could not catch.",
          "is_bot": false,
          "headline": "fix(security): block path traversal in NKJPCorpusReader (#3579)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-06T06:47:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7df10e6efa0417145e370aa42d8342faa6d244b8",
          "body": "…s (#3575)\n\n* security: block URL-encoded path traversal in nltk: resource URLs\n\n`nltk.data.load()` validated the encoded form of a `nltk:` resource name\nagainst `_UNSAFE_NO_PROTOCOL_RE`, but `url2pathname()` decodes percent\nsequences when the path is resolved to a filesystem location. Inputs\nsuch a\n[…]\nk:/abs/path`` routing to ``file://``\nis preserved.\n\n---------\n\nCo-authored-by: LinZiyu <221020063@fzu.edu.cn>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(security): block URL-encoded path traversal in nltk: resource URL…",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-06T06:45:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a820afa58810cd05049b6c6eae306694d6cfe65",
          "body": "* fix(security): pin resolved IP in pathsec.urlopen to prevent DNS-rebinding SSRF\n\npathsec.urlopen validated the target hostname's resolved IP via the cached\n_resolve_hostname(), then passed the raw hostname to opener.open(), which\nre-resolved it independently at connect time. The validated IP was n\n[…]\nPR so #3582 cleanly supersedes it. Adds policy regression tests\n(non-global incl. CGNAT/unspecified, IPv4-mapped at both validation and\nconnect, multicast still blocked, genuine global still allowed).",
          "is_bot": false,
          "headline": "fix(security): prevent DNS-rebinding SSRF in pathsec.urlopen (#3582)",
          "author_name": "Ziyu Lin",
          "author_login": "LinZiyuu",
          "committed_at": "2026-06-06T06:44:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b3592ad47f483bb6169f6b9b6a969f0da130c6aa",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'upstream/develop' into hotfix-2273",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T10:34:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3e156ef618679d47b0004818b075a1474a2e432",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'upstream/develop' into hotfix-3587",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T10:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b792621957f04bff6499d03d251984a54904d833",
          "body": null,
          "is_bot": false,
          "headline": "Use lexical containment for downloader target paths (#3595)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T10:24:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02538d58111e514048bab44e03aab7bd606c137",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'upstream/develop' into hotfix-3587",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T09:23:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c08a50f0d2cb5b29a1d90a5bc25e5dbf38140d16",
          "body": null,
          "is_bot": false,
          "headline": "Use commonpath for downloader path containment on Windows (#3594)",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T09:21:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a73b1f727f496581baddd52dfe1e793492332081",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'upstream/develop' into hotfix-2273",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T07:59:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "348380e70288467212402b72b75aa4eb133bcd14",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'upstream/develop' into hotfix-3587",
          "author_name": "Eric Kafe",
          "author_login": "ekaf",
          "committed_at": "2026-06-05T07:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 529,
      "latest_release_at": "2026-06-11T21:07:13Z",
      "latest_release_tag": "v3.10.0-rc1",
      "releases_from_tags": false,
      "days_since_last_push": 13,
      "active_weeks_last_year": 39,
      "days_since_latest_release": 40,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "nltk",
          "exists": true,
          "license": "Apache License, Version 2.0",
          "keywords": [
            "NLP",
            "CL",
            "natural language processing",
            "computational linguistics",
            "parsing",
            "tagging",
            "tokenizing",
            "syntax",
            "linguistics",
            "language",
            "natural language",
            "text analytics",
            "Development Status :: 5 - Production/Stable",
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Information Technology",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: Apache Software License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14",
            "Topic :: Scientific/Engineering",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Scientific/Engineering :: Human Machine Interfaces",
            "Topic :: Scientific/Engineering :: Information Analysis",
            "Topic :: Text Processing",
            "Topic :: Text Processing :: Filters",
            "Topic :: Text Processing :: General",
            "Topic :: Text Processing :: Indexing",
            "Topic :: Text Processing :: Linguistic"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/nltk/",
          "is_deprecated": false,
          "latest_version": "3.10.0",
          "repository_url": "https://github.com/nltk/nltk",
          "versions_count": 57,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 65956482,
          "first_published_at": "2009-07-15T09:32:16.349425Z",
          "latest_published_at": "2026-07-08T02:39:13.562780Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 13
        }
      ]
    },
    "popularity": {
      "forks": 3028,
      "stars": 14679,
      "watchers": 437,
      "fork_history": {
        "days": [
          {
            "date": "2020-03-18",
            "count": 1
          },
          {
            "date": "2020-03-19",
            "count": 2
          },
          {
            "date": "2020-03-25",
            "count": 1
          },
          {
            "date": "2020-03-26",
            "count": 1
          },
          {
            "date": "2020-03-27",
            "count": 1
          },
          {
            "date": "2020-04-02",
            "count": 2
          },
          {
            "date": "2020-04-05",
            "count": 1
          },
          {
            "date": "2020-04-06",
            "count": 1
          },
          {
            "date": "2020-04-07",
            "count": 1
          },
          {
            "date": "2020-04-09",
            "count": 1
          },
          {
            "date": "2020-04-10",
            "count": 2
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-13",
            "count": 1
          },
          {
            "date": "2020-04-14",
            "count": 1
          },
          {
            "date": "2020-04-17",
            "count": 1
          },
          {
            "date": "2020-04-23",
            "count": 2
          },
          {
            "date": "2020-04-25",
            "count": 1
          },
          {
            "date": "2020-04-27",
            "count": 1
          },
          {
            "date": "2020-04-28",
            "count": 1
          },
          {
            "date": "2020-05-01",
            "count": 2
          },
          {
            "date": "2020-05-02",
            "count": 1
          },
          {
            "date": "2020-05-03",
            "count": 1
          },
          {
            "date": "2020-05-04",
            "count": 1
          },
          {
            "date": "2020-05-07",
            "count": 2
          },
          {
            "date": "2020-05-10",
            "count": 1
          },
          {
            "date": "2020-05-11",
            "count": 2
          },
          {
            "date": "2020-05-13",
            "count": 1
          },
          {
            "date": "2020-05-14",
            "count": 1
          },
          {
            "date": "2020-05-15",
            "count": 1
          },
          {
            "date": "2020-05-22",
            "count": 1
          },
          {
            "date": "2020-05-23",
            "count": 1
          },
          {
            "date": "2020-05-24",
            "count": 2
          },
          {
            "date": "2020-05-26",
            "count": 1
          },
          {
            "date": "2020-05-30",
            "count": 1
          },
          {
            "date": "2020-06-02",
            "count": 1
          },
          {
            "date": "2020-06-08",
            "count": 1
          },
          {
            "date": "2020-06-11",
            "count": 1
          },
          {
            "date": "2020-06-12",
            "count": 2
          },
          {
            "date": "2020-06-16",
            "count": 3
          },
          {
            "date": "2020-06-18",
            "count": 2
          },
          {
            "date": "2020-06-19",
            "count": 2
          },
          {
            "date": "2020-06-20",
            "count": 1
          },
          {
            "date": "2020-06-22",
            "count": 1
          },
          {
            "date": "2020-06-23",
            "count": 1
          },
          {
            "date": "2020-06-25",
            "count": 1
          },
          {
            "date": "2020-06-28",
            "count": 1
          },
          {
            "date": "2020-06-30",
            "count": 1
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-07-02",
            "count": 2
          },
          {
            "date": "2020-07-03",
            "count": 1
          },
          {
            "date": "2020-07-05",
            "count": 1
          },
          {
            "date": "2020-07-07",
            "count": 2
          },
          {
            "date": "2020-07-08",
            "count": 1
          },
          {
            "date": "2020-07-12",
            "count": 1
          },
          {
            "date": "2020-07-14",
            "count": 2
          },
          {
            "date": "2020-07-16",
            "count": 2
          },
          {
            "date": "2020-07-17",
            "count": 3
          },
          {
            "date": "2020-07-20",
            "count": 1
          },
          {
            "date": "2020-07-21",
            "count": 2
          },
          {
            "date": "2020-07-24",
            "count": 1
          },
          {
            "date": "2020-07-26",
            "count": 1
          },
          {
            "date": "2020-07-28",
            "count": 1
          },
          {
            "date": "2020-07-31",
            "count": 2
          },
          {
            "date": "2020-08-03",
            "count": 1
          },
          {
            "date": "2020-08-09",
            "count": 1
          },
          {
            "date": "2020-08-12",
            "count": 1
          },
          {
            "date": "2020-08-14",
            "count": 1
          },
          {
            "date": "2020-08-15",
            "count": 1
          },
          {
            "date": "2020-08-16",
            "count": 1
          },
          {
            "date": "2020-08-18",
            "count": 1
          },
          {
            "date": "2020-08-19",
            "count": 3
          },
          {
            "date": "2020-08-25",
            "count": 2
          },
          {
            "date": "2020-08-26",
            "count": 1
          },
          {
            "date": "2020-08-28",
            "count": 1
          },
          {
            "date": "2020-08-29",
            "count": 1
          },
          {
            "date": "2020-08-30",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-09-02",
            "count": 2
          },
          {
            "date": "2020-09-06",
            "count": 2
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-09-15",
            "count": 1
          },
          {
            "date": "2020-09-18",
            "count": 2
          },
          {
            "date": "2020-09-19",
            "count": 2
          },
          {
            "date": "2020-09-23",
            "count": 1
          },
          {
            "date": "2020-09-26",
            "count": 1
          },
          {
            "date": "2020-09-29",
            "count": 2
          },
          {
            "date": "2020-10-04",
            "count": 1
          },
          {
            "date": "2020-10-11",
            "count": 1
          },
          {
            "date": "2020-10-13",
            "count": 1
          },
          {
            "date": "2020-10-14",
            "count": 2
          },
          {
            "date": "2020-10-17",
            "count": 1
          },
          {
            "date": "2020-10-18",
            "count": 1
          },
          {
            "date": "2020-10-19",
            "count": 1
          },
          {
            "date": "2020-10-20",
            "count": 1
          },
          {
            "date": "2020-10-22",
            "count": 1
          },
          {
            "date": "2020-10-26",
            "count": 1
          },
          {
            "date": "2020-10-28",
            "count": 1
          },
          {
            "date": "2020-10-31",
            "count": 1
          },
          {
            "date": "2020-11-04",
            "count": 1
          },
          {
            "date": "2020-11-06",
            "count": 2
          },
          {
            "date": "2020-11-13",
            "count": 2
          },
          {
            "date": "2020-11-14",
            "count": 1
          },
          {
            "date": "2020-11-15",
            "count": 2
          },
          {
            "date": "2020-11-18",
            "count": 2
          },
          {
            "date": "2020-11-19",
            "count": 1
          },
          {
            "date": "2020-11-21",
            "count": 1
          },
          {
            "date": "2020-11-24",
            "count": 2
          },
          {
            "date": "2020-11-26",
            "count": 1
          },
          {
            "date": "2020-12-02",
            "count": 2
          },
          {
            "date": "2020-12-03",
            "count": 1
          },
          {
            "date": "2020-12-06",
            "count": 1
          },
          {
            "date": "2020-12-09",
            "count": 1
          },
          {
            "date": "2020-12-10",
            "count": 2
          },
          {
            "date": "2020-12-15",
            "count": 1
          },
          {
            "date": "2020-12-20",
            "count": 1
          },
          {
            "date": "2020-12-22",
            "count": 1
          },
          {
            "date": "2020-12-24",
            "count": 1
          },
          {
            "date": "2020-12-25",
            "count": 2
          },
          {
            "date": "2020-12-26",
            "count": 1
          },
          {
            "date": "2020-12-28",
            "count": 2
          },
          {
            "date": "2020-12-29",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 2
          },
          {
            "date": "2021-01-06",
            "count": 1
          },
          {
            "date": "2021-01-12",
            "count": 1
          },
          {
            "date": "2021-01-13",
            "count": 1
          },
          {
            "date": "2021-01-18",
            "count": 3
          },
          {
            "date": "2021-01-21",
            "count": 1
          },
          {
            "date": "2021-01-28",
            "count": 1
          },
          {
            "date": "2021-01-29",
            "count": 2
          },
          {
            "date": "2021-01-31",
            "count": 1
          },
          {
            "date": "2021-02-03",
            "count": 1
          },
          {
            "date": "2021-02-05",
            "count": 1
          },
          {
            "date": "2021-02-09",
            "count": 1
          },
          {
            "date": "2021-02-18",
            "count": 1
          },
          {
            "date": "2021-02-19",
            "count": 1
          },
          {
            "date": "2021-02-22",
            "count": 2
          },
          {
            "date": "2021-02-23",
            "count": 2
          },
          {
            "date": "2021-02-25",
            "count": 1
          },
          {
            "date": "2021-03-01",
            "count": 2
          },
          {
            "date": "2021-03-04",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 1
          },
          {
            "date": "2021-03-06",
            "count": 2
          },
          {
            "date": "2021-03-10",
            "count": 3
          },
          {
            "date": "2021-03-16",
            "count": 1
          },
          {
            "date": "2021-03-18",
            "count": 1
          },
          {
            "date": "2021-03-22",
            "count": 2
          },
          {
            "date": "2021-03-23",
            "count": 1
          },
          {
            "date": "2021-03-28",
            "count": 2
          },
          {
            "date": "2021-03-30",
            "count": 2
          },
          {
            "date": "2021-04-01",
            "count": 1
          },
          {
            "date": "2021-04-02",
            "count": 2
          },
          {
            "date": "2021-04-03",
            "count": 1
          },
          {
            "date": "2021-04-07",
            "count": 2
          },
          {
            "date": "2021-04-16",
            "count": 2
          },
          {
            "date": "2021-04-18",
            "count": 1
          },
          {
            "date": "2021-04-19",
            "count": 1
          },
          {
            "date": "2021-04-20",
            "count": 1
          },
          {
            "date": "2021-04-21",
            "count": 1
          },
          {
            "date": "2021-04-22",
            "count": 2
          },
          {
            "date": "2021-04-25",
            "count": 1
          },
          {
            "date": "2021-05-03",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-10",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 1
          },
          {
            "date": "2021-05-13",
            "count": 1
          },
          {
            "date": "2021-05-14",
            "count": 1
          },
          {
            "date": "2021-05-24",
            "count": 1
          },
          {
            "date": "2021-05-29",
            "count": 1
          },
          {
            "date": "2021-06-01",
            "count": 1
          },
          {
            "date": "2021-06-07",
            "count": 2
          },
          {
            "date": "2021-06-11",
            "count": 2
          },
          {
            "date": "2021-06-13",
            "count": 1
          },
          {
            "date": "2021-06-16",
            "count": 1
          },
          {
            "date": "2021-06-22",
            "count": 1
          },
          {
            "date": "2021-06-25",
            "count": 1
          },
          {
            "date": "2021-06-27",
            "count": 1
          },
          {
            "date": "2021-06-30",
            "count": 1
          },
          {
            "date": "2021-07-01",
            "count": 1
          },
          {
            "date": "2021-07-05",
            "count": 1
          },
          {
            "date": "2021-07-13",
            "count": 1
          },
          {
            "date": "2021-07-18",
            "count": 1
          },
          {
            "date": "2021-07-20",
            "count": 1
          },
          {
            "date": "2021-07-22",
            "count": 1
          },
          {
            "date": "2021-07-23",
            "count": 1
          },
          {
            "date": "2021-07-24",
            "count": 1
          },
          {
            "date": "2021-07-29",
            "count": 1
          },
          {
            "date": "2021-08-04",
            "count": 1
          },
          {
            "date": "2021-08-08",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-20",
            "count": 1
          },
          {
            "date": "2021-08-26",
            "count": 1
          },
          {
            "date": "2021-08-28",
            "count": 1
          },
          {
            "date": "2021-08-31",
            "count": 2
          },
          {
            "date": "2021-09-06",
            "count": 2
          },
          {
            "date": "2021-09-07",
            "count": 1
          },
          {
            "date": "2021-09-08",
            "count": 1
          },
          {
            "date": "2021-09-09",
            "count": 1
          },
          {
            "date": "2021-09-17",
            "count": 1
          },
          {
            "date": "2021-09-20",
            "count": 1
          },
          {
            "date": "2021-09-21",
            "count": 1
          },
          {
            "date": "2021-09-22",
            "count": 1
          },
          {
            "date": "2021-09-23",
            "count": 1
          },
          {
            "date": "2021-09-30",
            "count": 1
          },
          {
            "date": "2021-10-01",
            "count": 1
          },
          {
            "date": "2021-10-02",
            "count": 1
          },
          {
            "date": "2021-10-03",
            "count": 1
          },
          {
            "date": "2021-10-05",
            "count": 1
          },
          {
            "date": "2021-10-07",
            "count": 1
          },
          {
            "date": "2021-10-09",
            "count": 1
          },
          {
            "date": "2021-10-20",
            "count": 1
          },
          {
            "date": "2021-10-23",
            "count": 1
          },
          {
            "date": "2021-10-25",
            "count": 2
          },
          {
            "date": "2021-10-28",
            "count": 3
          },
          {
            "date": "2021-10-29",
            "count": 1
          },
          {
            "date": "2021-11-03",
            "count": 1
          },
          {
            "date": "2021-11-04",
            "count": 1
          },
          {
            "date": "2021-11-05",
            "count": 1
          },
          {
            "date": "2021-11-08",
            "count": 1
          },
          {
            "date": "2021-11-12",
            "count": 1
          },
          {
            "date": "2021-11-15",
            "count": 2
          },
          {
            "date": "2021-11-16",
            "count": 2
          },
          {
            "date": "2021-11-17",
            "count": 1
          },
          {
            "date": "2021-11-26",
            "count": 1
          },
          {
            "date": "2021-12-05",
            "count": 1
          },
          {
            "date": "2021-12-12",
            "count": 1
          },
          {
            "date": "2021-12-14",
            "count": 1
          },
          {
            "date": "2021-12-15",
            "count": 1
          },
          {
            "date": "2021-12-16",
            "count": 1
          },
          {
            "date": "2021-12-19",
            "count": 1
          },
          {
            "date": "2021-12-21",
            "count": 1
          },
          {
            "date": "2021-12-26",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 1
          },
          {
            "date": "2022-01-01",
            "count": 2
          },
          {
            "date": "2022-01-03",
            "count": 1
          },
          {
            "date": "2022-01-16",
            "count": 3
          },
          {
            "date": "2022-01-17",
            "count": 1
          },
          {
            "date": "2022-01-21",
            "count": 2
          },
          {
            "date": "2022-01-23",
            "count": 2
          },
          {
            "date": "2022-01-25",
            "count": 1
          },
          {
            "date": "2022-01-27",
            "count": 1
          },
          {
            "date": "2022-01-30",
            "count": 1
          },
          {
            "date": "2022-01-31",
            "count": 1
          },
          {
            "date": "2022-02-01",
            "count": 1
          },
          {
            "date": "2022-02-07",
            "count": 1
          },
          {
            "date": "2022-02-09",
            "count": 1
          },
          {
            "date": "2022-02-14",
            "count": 2
          },
          {
            "date": "2022-02-15",
            "count": 1
          },
          {
            "date": "2022-02-17",
            "count": 1
          },
          {
            "date": "2022-02-18",
            "count": 1
          },
          {
            "date": "2022-02-19",
            "count": 1
          },
          {
            "date": "2022-02-22",
            "count": 1
          },
          {
            "date": "2022-02-23",
            "count": 5
          },
          {
            "date": "2022-02-25",
            "count": 1
          },
          {
            "date": "2022-02-26",
            "count": 3
          },
          {
            "date": "2022-02-28",
            "count": 1
          },
          {
            "date": "2022-03-01",
            "count": 1
          },
          {
            "date": "2022-03-03",
            "count": 1
          },
          {
            "date": "2022-03-05",
            "count": 1
          },
          {
            "date": "2022-03-07",
            "count": 1
          },
          {
            "date": "2022-03-09",
            "count": 3
          },
          {
            "date": "2022-03-11",
            "count": 1
          },
          {
            "date": "2022-03-18",
            "count": 1
          },
          {
            "date": "2022-03-22",
            "count": 1
          },
          {
            "date": "2022-03-24",
            "count": 1
          },
          {
            "date": "2022-03-26",
            "count": 1
          },
          {
            "date": "2022-03-28",
            "count": 2
          },
          {
            "date": "2022-03-29",
            "count": 2
          },
          {
            "date": "2022-03-31",
            "count": 1
          },
          {
            "date": "2022-04-02",
            "count": 2
          },
          {
            "date": "2022-04-04",
            "count": 2
          },
          {
            "date": "2022-04-05",
            "count": 1
          },
          {
            "date": "2022-04-12",
            "count": 1
          },
          {
            "date": "2022-04-15",
            "count": 1
          },
          {
            "date": "2022-04-17",
            "count": 1
          },
          {
            "date": "2022-04-21",
            "count": 2
          },
          {
            "date": "2022-04-23",
            "count": 1
          },
          {
            "date": "2022-04-26",
            "count": 1
          },
          {
            "date": "2022-04-27",
            "count": 2
          },
          {
            "date": "2022-04-28",
            "count": 1
          },
          {
            "date": "2022-04-29",
            "count": 2
          },
          {
            "date": "2022-04-30",
            "count": 1
          },
          {
            "date": "2022-05-04",
            "count": 1
          },
          {
            "date": "2022-05-05",
            "count": 1
          },
          {
            "date": "2022-05-09",
            "count": 1
          },
          {
            "date": "2022-05-11",
            "count": 2
          },
          {
            "date": "2022-05-12",
            "count": 1
          },
          {
            "date": "2022-05-14",
            "count": 2
          },
          {
            "date": "2022-05-16",
            "count": 1
          },
          {
            "date": "2022-05-19",
            "count": 1
          },
          {
            "date": "2022-05-20",
            "count": 1
          },
          {
            "date": "2022-05-23",
            "count": 1
          },
          {
            "date": "2022-05-25",
            "count": 2
          },
          {
            "date": "2022-06-01",
            "count": 1
          },
          {
            "date": "2022-06-05",
            "count": 1
          },
          {
            "date": "2022-06-08",
            "count": 1
          },
          {
            "date": "2022-06-13",
            "count": 1
          },
          {
            "date": "2022-06-14",
            "count": 1
          },
          {
            "date": "2022-06-16",
            "count": 1
          },
          {
            "date": "2022-06-17",
            "count": 1
          },
          {
            "date": "2022-06-21",
            "count": 1
          },
          {
            "date": "2022-06-22",
            "count": 1
          },
          {
            "date": "2022-06-27",
            "count": 1
          },
          {
            "date": "2022-06-30",
            "count": 1
          },
          {
            "date": "2022-07-04",
            "count": 2
          },
          {
            "date": "2022-07-06",
            "count": 3
          },
          {
            "date": "2022-07-08",
            "count": 1
          },
          {
            "date": "2022-07-10",
            "count": 1
          },
          {
            "date": "2022-07-12",
            "count": 1
          },
          {
            "date": "2022-07-14",
            "count": 1
          },
          {
            "date": "2022-07-16",
            "count": 1
          },
          {
            "date": "2022-07-18",
            "count": 1
          },
          {
            "date": "2022-07-21",
            "count": 1
          },
          {
            "date": "2022-07-23",
            "count": 2
          },
          {
            "date": "2022-07-24",
            "count": 3
          },
          {
            "date": "2022-08-01",
            "count": 1
          },
          {
            "date": "2022-08-02",
            "count": 1
          },
          {
            "date": "2022-08-03",
            "count": 1
          },
          {
            "date": "2022-08-04",
            "count": 3
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-21",
            "count": 1
          },
          {
            "date": "2022-08-22",
            "count": 1
          },
          {
            "date": "2022-08-23",
            "count": 1
          },
          {
            "date": "2022-08-24",
            "count": 1
          },
          {
            "date": "2022-08-29",
            "count": 1
          },
          {
            "date": "2022-08-31",
            "count": 2
          },
          {
            "date": "2022-09-02",
            "count": 1
          },
          {
            "date": "2022-09-07",
            "count": 1
          },
          {
            "date": "2022-09-09",
            "count": 1
          },
          {
            "date": "2022-09-11",
            "count": 1
          },
          {
            "date": "2022-09-12",
            "count": 1
          },
          {
            "date": "2022-09-13",
            "count": 1
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-09-19",
            "count": 1
          },
          {
            "date": "2022-09-20",
            "count": 1
          },
          {
            "date": "2022-09-23",
            "count": 1
          },
          {
            "date": "2022-09-26",
            "count": 1
          },
          {
            "date": "2022-09-27",
            "count": 1
          },
          {
            "date": "2022-09-29",
            "count": 1
          },
          {
            "date": "2022-10-07",
            "count": 1
          },
          {
            "date": "2022-10-09",
            "count": 1
          },
          {
            "date": "2022-10-12",
            "count": 1
          },
          {
            "date": "2022-10-15",
            "count": 1
          },
          {
            "date": "2022-10-16",
            "count": 1
          },
          {
            "date": "2022-10-17",
            "count": 1
          },
          {
            "date": "2022-10-18",
            "count": 1
          },
          {
            "date": "2022-10-19",
            "count": 1
          },
          {
            "date": "2022-10-25",
            "count": 2
          },
          {
            "date": "2022-10-30",
            "count": 2
          },
          {
            "date": "2022-11-02",
            "count": 1
          },
          {
            "date": "2022-11-08",
            "count": 2
          },
          {
            "date": "2022-11-09",
            "count": 1
          },
          {
            "date": "2022-11-14",
            "count": 1
          },
          {
            "date": "2022-11-22",
            "count": 1
          },
          {
            "date": "2022-11-29",
            "count": 1
          },
          {
            "date": "2022-12-03",
            "count": 1
          },
          {
            "date": "2022-12-06",
            "count": 1
          },
          {
            "date": "2022-12-09",
            "count": 1
          },
          {
            "date": "2022-12-13",
            "count": 1
          },
          {
            "date": "2022-12-14",
            "count": 2
          },
          {
            "date": "2022-12-16",
            "count": 1
          },
          {
            "date": "2022-12-20",
            "count": 1
          },
          {
            "date": "2022-12-23",
            "count": 1
          },
          {
            "date": "2022-12-29",
            "count": 1
          },
          {
            "date": "2023-01-03",
            "count": 1
          },
          {
            "date": "2023-01-05",
            "count": 4
          },
          {
            "date": "2023-01-10",
            "count": 2
          },
          {
            "date": "2023-01-11",
            "count": 1
          },
          {
            "date": "2023-01-13",
            "count": 1
          },
          {
            "date": "2023-01-17",
            "count": 2
          },
          {
            "date": "2023-01-19",
            "count": 1
          },
          {
            "date": "2023-01-21",
            "count": 1
          },
          {
            "date": "2023-01-22",
            "count": 1
          },
          {
            "date": "2023-01-23",
            "count": 1
          },
          {
            "date": "2023-01-24",
            "count": 1
          },
          {
            "date": "2023-01-28",
            "count": 1
          },
          {
            "date": "2023-01-31",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 1
          },
          {
            "date": "2023-02-14",
            "count": 1
          },
          {
            "date": "2023-02-20",
            "count": 3
          },
          {
            "date": "2023-02-21",
            "count": 2
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-02-26",
            "count": 1
          },
          {
            "date": "2023-02-28",
            "count": 1
          },
          {
            "date": "2023-03-12",
            "count": 1
          },
          {
            "date": "2023-03-15",
            "count": 3
          },
          {
            "date": "2023-03-16",
            "count": 1
          },
          {
            "date": "2023-03-17",
            "count": 2
          },
          {
            "date": "2023-03-18",
            "count": 1
          },
          {
            "date": "2023-03-19",
            "count": 1
          },
          {
            "date": "2023-03-20",
            "count": 4
          },
          {
            "date": "2023-03-22",
            "count": 2
          },
          {
            "date": "2023-03-24",
            "count": 1
          },
          {
            "date": "2023-03-28",
            "count": 1
          },
          {
            "date": "2023-03-29",
            "count": 1
          },
          {
            "date": "2023-04-01",
            "count": 1
          },
          {
            "date": "2023-04-06",
            "count": 1
          },
          {
            "date": "2023-04-08",
            "count": 2
          },
          {
            "date": "2023-04-09",
            "count": 3
          },
          {
            "date": "2023-04-10",
            "count": 1
          },
          {
            "date": "2023-04-11",
            "count": 2
          },
          {
            "date": "2023-04-14",
            "count": 1
          },
          {
            "date": "2023-04-15",
            "count": 2
          },
          {
            "date": "2023-04-17",
            "count": 2
          },
          {
            "date": "2023-04-23",
            "count": 1
          },
          {
            "date": "2023-04-24",
            "count": 1
          },
          {
            "date": "2023-04-25",
            "count": 2
          },
          {
            "date": "2023-04-27",
            "count": 1
          },
          {
            "date": "2023-04-29",
            "count": 1
          },
          {
            "date": "2023-04-30",
            "count": 1
          },
          {
            "date": "2023-05-01",
            "count": 1
          },
          {
            "date": "2023-05-02",
            "count": 1
          },
          {
            "date": "2023-05-03",
            "count": 1
          },
          {
            "date": "2023-05-04",
            "count": 2
          },
          {
            "date": "2023-05-07",
            "count": 1
          },
          {
            "date": "2023-05-11",
            "count": 1
          },
          {
            "date": "2023-05-12",
            "count": 1
          },
          {
            "date": "2023-05-13",
            "count": 1
          },
          {
            "date": "2023-05-16",
            "count": 2
          },
          {
            "date": "2023-05-20",
            "count": 1
          },
          {
            "date": "2023-05-21",
            "count": 1
          },
          {
            "date": "2023-05-22",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-05-31",
            "count": 1
          },
          {
            "date": "2023-06-04",
            "count": 1
          },
          {
            "date": "2023-06-05",
            "count": 1
          },
          {
            "date": "2023-06-06",
            "count": 1
          },
          {
            "date": "2023-06-08",
            "count": 1
          },
          {
            "date": "2023-06-09",
            "count": 1
          },
          {
            "date": "2023-06-12",
            "count": 1
          },
          {
            "date": "2023-06-14",
            "count": 1
          },
          {
            "date": "2023-06-15",
            "count": 1
          },
          {
            "date": "2023-06-18",
            "count": 2
          },
          {
            "date": "2023-06-23",
            "count": 1
          },
          {
            "date": "2023-06-25",
            "count": 1
          },
          {
            "date": "2023-06-26",
            "count": 1
          },
          {
            "date": "2023-06-27",
            "count": 3
          },
          {
            "date": "2023-06-28",
            "count": 1
          },
          {
            "date": "2023-06-29",
            "count": 1
          },
          {
            "date": "2023-06-30",
            "count": 1
          },
          {
            "date": "2023-07-05",
            "count": 1
          },
          {
            "date": "2023-07-11",
            "count": 1
          },
          {
            "date": "2023-07-13",
            "count": 2
          },
          {
            "date": "2023-07-14",
            "count": 1
          },
          {
            "date": "2023-07-18",
            "count": 1
          },
          {
            "date": "2023-07-21",
            "count": 1
          },
          {
            "date": "2023-07-22",
            "count": 1
          },
          {
            "date": "2023-07-24",
            "count": 1
          },
          {
            "date": "2023-07-25",
            "count": 1
          },
          {
            "date": "2023-07-26",
            "count": 2
          },
          {
            "date": "2023-07-29",
            "count": 1
          },
          {
            "date": "2023-08-13",
            "count": 1
          },
          {
            "date": "2023-08-15",
            "count": 1
          },
          {
            "date": "2023-08-17",
            "count": 2
          },
          {
            "date": "2023-08-18",
            "count": 1
          },
          {
            "date": "2023-08-19",
            "count": 1
          },
          {
            "date": "2023-08-22",
            "count": 1
          },
          {
            "date": "2023-08-23",
            "count": 1
          },
          {
            "date": "2023-08-26",
            "count": 1
          },
          {
            "date": "2023-08-30",
            "count": 1
          },
          {
            "date": "2023-09-01",
            "count": 2
          },
          {
            "date": "2023-09-03",
            "count": 1
          },
          {
            "date": "2023-09-13",
            "count": 1
          },
          {
            "date": "2023-09-15",
            "count": 1
          },
          {
            "date": "2023-09-16",
            "count": 1
          },
          {
            "date": "2023-09-19",
            "count": 1
          },
          {
            "date": "2023-09-20",
            "count": 1
          },
          {
            "date": "2023-09-22",
            "count": 2
          },
          {
            "date": "2023-09-24",
            "count": 2
          },
          {
            "date": "2023-09-25",
            "count": 1
          },
          {
            "date": "2023-09-27",
            "count": 2
          },
          {
            "date": "2023-09-28",
            "count": 1
          },
          {
            "date": "2023-10-03",
            "count": 1
          },
          {
            "date": "2023-10-07",
            "count": 1
          },
          {
            "date": "2023-10-12",
            "count": 1
          },
          {
            "date": "2023-10-14",
            "count": 1
          },
          {
            "date": "2023-10-16",
            "count": 1
          },
          {
            "date": "2023-10-18",
            "count": 2
          },
          {
            "date": "2023-10-19",
            "count": 1
          },
          {
            "date": "2023-10-20",
            "count": 1
          },
          {
            "date": "2023-10-23",
            "count": 1
          },
          {
            "date": "2023-10-25",
            "count": 1
          },
          {
            "date": "2023-10-26",
            "count": 2
          },
          {
            "date": "2023-10-27",
            "count": 2
          },
          {
            "date": "2023-10-31",
            "count": 1
          },
          {
            "date": "2023-11-04",
            "count": 2
          },
          {
            "date": "2023-11-06",
            "count": 1
          },
          {
            "date": "2023-11-13",
            "count": 1
          },
          {
            "date": "2023-11-14",
            "count": 2
          },
          {
            "date": "2023-11-16",
            "count": 1
          },
          {
            "date": "2023-11-17",
            "count": 1
          },
          {
            "date": "2023-11-19",
            "count": 1
          },
          {
            "date": "2023-11-24",
            "count": 1
          },
          {
            "date": "2023-11-27",
            "count": 1
          },
          {
            "date": "2023-11-29",
            "count": 1
          },
          {
            "date": "2023-12-11",
            "count": 1
          },
          {
            "date": "2023-12-13",
            "count": 1
          },
          {
            "date": "2023-12-14",
            "count": 2
          },
          {
            "date": "2023-12-16",
            "count": 1
          },
          {
            "date": "2023-12-21",
            "count": 2
          },
          {
            "date": "2023-12-22",
            "count": 1
          },
          {
            "date": "2023-12-23",
            "count": 1
          },
          {
            "date": "2023-12-24",
            "count": 1
          },
          {
            "date": "2024-01-03",
            "count": 2
          },
          {
            "date": "2024-01-07",
            "count": 1
          },
          {
            "date": "2024-01-08",
            "count": 1
          },
          {
            "date": "2024-01-13",
            "count": 1
          },
          {
            "date": "2024-01-18",
            "count": 2
          },
          {
            "date": "2024-01-19",
            "count": 1
          },
          {
            "date": "2024-01-22",
            "count": 1
          },
          {
            "date": "2024-01-23",
            "count": 1
          },
          {
            "date": "2024-01-26",
            "count": 1
          },
          {
            "date": "2024-01-29",
            "count": 2
          },
          {
            "date": "2024-02-01",
            "count": 1
          },
          {
            "date": "2024-02-02",
            "count": 1
          },
          {
            "date": "2024-02-05",
            "count": 1
          },
          {
            "date": "2024-02-11",
            "count": 1
          },
          {
            "date": "2024-02-12",
            "count": 1
          },
          {
            "date": "2024-02-14",
            "count": 1
          },
          {
            "date": "2024-02-16",
            "count": 2
          },
          {
            "date": "2024-02-22",
            "count": 1
          },
          {
            "date": "2024-02-26",
            "count": 1
          },
          {
            "date": "2024-02-28",
            "count": 1
          },
          {
            "date": "2024-03-04",
            "count": 2
          },
          {
            "date": "2024-03-08",
            "count": 1
          },
          {
            "date": "2024-03-11",
            "count": 1
          },
          {
            "date": "2024-03-16",
            "count": 2
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-03-18",
            "count": 1
          },
          {
            "date": "2024-03-20",
            "count": 1
          },
          {
            "date": "2024-03-21",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-03-27",
            "count": 1
          },
          {
            "date": "2024-03-29",
            "count": 2
          },
          {
            "date": "2024-03-30",
            "count": 1
          },
          {
            "date": "2024-04-05",
            "count": 1
          },
          {
            "date": "2024-04-10",
            "count": 1
          },
          {
            "date": "2024-04-14",
            "count": 1
          },
          {
            "date": "2024-04-18",
            "count": 1
          },
          {
            "date": "2024-04-19",
            "count": 2
          },
          {
            "date": "2024-04-28",
            "count": 1
          },
          {
            "date": "2024-05-04",
            "count": 1
          },
          {
            "date": "2024-05-06",
            "count": 1
          },
          {
            "date": "2024-05-07",
            "count": 1
          },
          {
            "date": "2024-05-08",
            "count": 1
          },
          {
            "date": "2024-05-13",
            "count": 2
          },
          {
            "date": "2024-05-14",
            "count": 2
          },
          {
            "date": "2024-05-17",
            "count": 1
          },
          {
            "date": "2024-05-21",
            "count": 1
          },
          {
            "date": "2024-05-22",
            "count": 1
          },
          {
            "date": "2024-05-23",
            "count": 1
          },
          {
            "date": "2024-05-24",
            "count": 1
          },
          {
            "date": "2024-05-26",
            "count": 1
          },
          {
            "date": "2024-05-31",
            "count": 1
          },
          {
            "date": "2024-06-05",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-08",
            "count": 1
          },
          {
            "date": "2024-06-13",
            "count": 1
          },
          {
            "date": "2024-06-14",
            "count": 2
          },
          {
            "date": "2024-06-18",
            "count": 1
          },
          {
            "date": "2024-06-19",
            "count": 1
          },
          {
            "date": "2024-06-20",
            "count": 1
          },
          {
            "date": "2024-06-23",
            "count": 1
          },
          {
            "date": "2024-06-24",
            "count": 1
          },
          {
            "date": "2024-06-28",
            "count": 2
          },
          {
            "date": "2024-06-29",
            "count": 1
          },
          {
            "date": "2024-07-02",
            "count": 2
          },
          {
            "date": "2024-07-05",
            "count": 1
          },
          {
            "date": "2024-07-07",
            "count": 1
          },
          {
            "date": "2024-07-09",
            "count": 1
          },
          {
            "date": "2024-07-10",
            "count": 2
          },
          {
            "date": "2024-07-12",
            "count": 1
          },
          {
            "date": "2024-07-19",
            "count": 1
          },
          {
            "date": "2024-07-22",
            "count": 1
          },
          {
            "date": "2024-07-23",
            "count": 1
          },
          {
            "date": "2024-07-26",
            "count": 1
          },
          {
            "date": "2024-08-05",
            "count": 2
          },
          {
            "date": "2024-08-06",
            "count": 2
          },
          {
            "date": "2024-08-09",
            "count": 1
          },
          {
            "date": "2024-08-13",
            "count": 1
          },
          {
            "date": "2024-08-14",
            "count": 1
          },
          {
            "date": "2024-08-15",
            "count": 2
          },
          {
            "date": "2024-08-16",
            "count": 1
          },
          {
            "date": "2024-08-18",
            "count": 1
          },
          {
            "date": "2024-08-19",
            "count": 1
          },
          {
            "date": "2024-08-25",
            "count": 1
          },
          {
            "date": "2024-08-29",
            "count": 1
          },
          {
            "date": "2024-08-30",
            "count": 1
          },
          {
            "date": "2024-08-31",
            "count": 1
          },
          {
            "date": "2024-09-01",
            "count": 1
          },
          {
            "date": "2024-09-05",
            "count": 1
          },
          {
            "date": "2024-09-16",
            "count": 1
          },
          {
            "date": "2024-09-19",
            "count": 2
          },
          {
            "date": "2024-09-20",
            "count": 1
          },
          {
            "date": "2024-09-23",
            "count": 1
          },
          {
            "date": "2024-09-24",
            "count": 1
          },
          {
            "date": "2024-09-28",
            "count": 1
          },
          {
            "date": "2024-10-01",
            "count": 1
          },
          {
            "date": "2024-10-02",
            "count": 1
          },
          {
            "date": "2024-10-03",
            "count": 3
          },
          {
            "date": "2024-10-04",
            "count": 1
          },
          {
            "date": "2024-10-08",
            "count": 1
          },
          {
            "date": "2024-10-09",
            "count": 2
          },
          {
            "date": "2024-10-10",
            "count": 2
          },
          {
            "date": "2024-10-14",
            "count": 1
          },
          {
            "date": "2024-10-15",
            "count": 1
          },
          {
            "date": "2024-10-17",
            "count": 1
          },
          {
            "date": "2024-10-20",
            "count": 1
          },
          {
            "date": "2024-10-21",
            "count": 1
          },
          {
            "date": "2024-10-22",
            "count": 1
          },
          {
            "date": "2024-10-23",
            "count": 2
          },
          {
            "date": "2024-10-25",
            "count": 1
          },
          {
            "date": "2024-10-29",
            "count": 1
          },
          {
            "date": "2024-10-30",
            "count": 1
          },
          {
            "date": "2024-10-31",
            "count": 1
          },
          {
            "date": "2024-11-01",
            "count": 1
          },
          {
            "date": "2024-11-09",
            "count": 1
          },
          {
            "date": "2024-11-18",
            "count": 2
          },
          {
            "date": "2024-11-20",
            "count": 1
          },
          {
            "date": "2024-11-25",
            "count": 1
          },
          {
            "date": "2024-11-27",
            "count": 1
          },
          {
            "date": "2024-11-28",
            "count": 1
          },
          {
            "date": "2024-11-29",
            "count": 1
          },
          {
            "date": "2024-11-30",
            "count": 1
          },
          {
            "date": "2024-12-06",
            "count": 1
          },
          {
            "date": "2024-12-13",
            "count": 1
          },
          {
            "date": "2024-12-14",
            "count": 1
          },
          {
            "date": "2024-12-15",
            "count": 1
          },
          {
            "date": "2024-12-18",
            "count": 1
          },
          {
            "date": "2024-12-23",
            "count": 1
          },
          {
            "date": "2024-12-24",
            "count": 1
          },
          {
            "date": "2024-12-26",
            "count": 1
          },
          {
            "date": "2024-12-27",
            "count": 1
          },
          {
            "date": "2024-12-29",
            "count": 1
          },
          {
            "date": "2024-12-30",
            "count": 1
          },
          {
            "date": "2025-01-02",
            "count": 1
          },
          {
            "date": "2025-01-08",
            "count": 1
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-16",
            "count": 1
          },
          {
            "date": "2025-01-23",
            "count": 1
          },
          {
            "date": "2025-01-24",
            "count": 2
          },
          {
            "date": "2025-01-27",
            "count": 1
          },
          {
            "date": "2025-02-05",
            "count": 1
          },
          {
            "date": "2025-02-07",
            "count": 1
          },
          {
            "date": "2025-02-09",
            "count": 1
          },
          {
            "date": "2025-02-13",
            "count": 1
          },
          {
            "date": "2025-02-14",
            "count": 1
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-03-13",
            "count": 2
          },
          {
            "date": "2025-03-14",
            "count": 1
          },
          {
            "date": "2025-03-23",
            "count": 1
          },
          {
            "date": "2025-03-26",
            "count": 1
          },
          {
            "date": "2025-03-27",
            "count": 1
          },
          {
            "date": "2025-03-28",
            "count": 1
          },
          {
            "date": "2025-04-01",
            "count": 1
          },
          {
            "date": "2025-04-02",
            "count": 1
          },
          {
            "date": "2025-04-09",
            "count": 3
          },
          {
            "date": "2025-04-16",
            "count": 1
          },
          {
            "date": "2025-04-18",
            "count": 1
          },
          {
            "date": "2025-04-19",
            "count": 1
          },
          {
            "date": "2025-04-23",
            "count": 2
          },
          {
            "date": "2025-04-26",
            "count": 1
          },
          {
            "date": "2025-05-14",
            "count": 1
          },
          {
            "date": "2025-05-15",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 1
          },
          {
            "date": "2025-05-22",
            "count": 1
          },
          {
            "date": "2025-05-31",
            "count": 1
          },
          {
            "date": "2025-06-01",
            "count": 1
          },
          {
            "date": "2025-06-04",
            "count": 1
          },
          {
            "date": "2025-06-10",
            "count": 1
          },
          {
            "date": "2025-06-13",
            "count": 1
          },
          {
            "date": "2025-06-23",
            "count": 1
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-06-30",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-07",
            "count": 1
          },
          {
            "date": "2025-07-23",
            "count": 1
          },
          {
            "date": "2025-07-24",
            "count": 1
          },
          {
            "date": "2025-07-25",
            "count": 1
          },
          {
            "date": "2025-07-27",
            "count": 1
          },
          {
            "date": "2025-07-31",
            "count": 2
          },
          {
            "date": "2025-08-01",
            "count": 1
          },
          {
            "date": "2025-08-05",
            "count": 2
          },
          {
            "date": "2025-08-10",
            "count": 1
          },
          {
            "date": "2025-08-21",
            "count": 1
          },
          {
            "date": "2025-08-28",
            "count": 1
          },
          {
            "date": "2025-08-30",
            "count": 1
          },
          {
            "date": "2025-09-01",
            "count": 1
          },
          {
            "date": "2025-09-10",
            "count": 1
          },
          {
            "date": "2025-09-14",
            "count": 1
          },
          {
            "date": "2025-09-17",
            "count": 1
          },
          {
            "date": "2025-09-19",
            "count": 1
          },
          {
            "date": "2025-09-22",
            "count": 1
          },
          {
            "date": "2025-09-24",
            "count": 1
          },
          {
            "date": "2025-10-01",
            "count": 1
          },
          {
            "date": "2025-10-02",
            "count": 1
          },
          {
            "date": "2025-10-11",
            "count": 1
          },
          {
            "date": "2025-10-17",
            "count": 1
          },
          {
            "date": "2025-10-18",
            "count": 2
          },
          {
            "date": "2025-10-19",
            "count": 1
          },
          {
            "date": "2025-10-20",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 1
          },
          {
            "date": "2025-10-23",
            "count": 1
          },
          {
            "date": "2025-10-24",
            "count": 1
          },
          {
            "date": "2025-10-25",
            "count": 6
          },
          {
            "date": "2025-10-26",
            "count": 6
          },
          {
            "date": "2025-10-27",
            "count": 2
          },
          {
            "date": "2025-10-28",
            "count": 1
          },
          {
            "date": "2025-10-29",
            "count": 2
          },
          {
            "date": "2025-10-30",
            "count": 1
          },
          {
            "date": "2025-10-31",
            "count": 1
          },
          {
            "date": "2025-11-04",
            "count": 2
          },
          {
            "date": "2025-11-05",
            "count": 1
          },
          {
            "date": "2025-11-09",
            "count": 1
          },
          {
            "date": "2025-11-12",
            "count": 1
          },
          {
            "date": "2025-11-21",
            "count": 1
          },
          {
            "date": "2025-11-23",
            "count": 1
          },
          {
            "date": "2025-11-24",
            "count": 1
          },
          {
            "date": "2025-11-25",
            "count": 1
          },
          {
            "date": "2025-11-26",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2025-12-23",
            "count": 1
          },
          {
            "date": "2025-12-27",
            "count": 1
          },
          {
            "date": "2025-12-28",
            "count": 1
          },
          {
            "date": "2026-01-05",
            "count": 1
          },
          {
            "date": "2026-01-12",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-01-28",
            "count": 1
          },
          {
            "date": "2026-02-03",
            "count": 1
          },
          {
            "date": "2026-02-10",
            "count": 2
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-13",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-23",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 2
          },
          {
            "date": "2026-02-26",
            "count": 1
          },
          {
            "date": "2026-03-01",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 2
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 2
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 2
          },
          {
            "date": "2026-03-16",
            "count": 2
          },
          {
            "date": "2026-03-18",
            "count": 3
          },
          {
            "date": "2026-03-19",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-03-30",
            "count": 1
          },
          {
            "date": "2026-04-03",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 2
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-18",
            "count": 3
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 2
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-20",
            "count": 2
          },
          {
            "date": "2026-06-21",
            "count": 2
          },
          {
            "date": "2026-06-22",
            "count": 1
          },
          {
            "date": "2026-06-23",
            "count": 1
          },
          {
            "date": "2026-06-28",
            "count": 2
          },
          {
            "date": "2026-06-30",
            "count": 2
          },
          {
            "date": "2026-07-04",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 3
          },
          {
            "date": "2026-07-20",
            "count": 4
          },
          {
            "date": "2026-07-21",
            "count": 2
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_forks": 3028
      },
      "star_history": {
        "days": [
          {
            "date": "2025-02-26",
            "count": 3
          },
          {
            "date": "2025-02-27",
            "count": 4
          },
          {
            "date": "2025-02-28",
            "count": 2
          },
          {
            "date": "2025-03-01",
            "count": 4
          },
          {
            "date": "2025-03-02",
            "count": 1
          },
          {
            "date": "2025-03-03",
            "count": 3
          },
          {
            "date": "2025-03-04",
            "count": 3
          },
          {
            "date": "2025-03-05",
            "count": 2
          },
          {
            "date": "2025-03-06",
            "count": 3
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-03-08",
            "count": 1
          },
          {
            "date": "2025-03-09",
            "count": 2
          },
          {
            "date": "2025-03-10",
            "count": 1
          },
          {
            "date": "2025-03-11",
            "count": 3
          },
          {
            "date": "2025-03-12",
            "count": 3
          },
          {
            "date": "2025-03-13",
            "count": 3
          },
          {
            "date": "2025-03-14",
            "count": 3
          },
          {
            "date": "2025-03-15",
            "count": 7
          },
          {
            "date": "2025-03-16",
            "count": 2
          },
          {
            "date": "2025-03-17",
            "count": 3
          },
          {
            "date": "2025-03-18",
            "count": 6
          },
          {
            "date": "2025-03-19",
            "count": 5
          },
          {
            "date": "2025-03-20",
            "count": 3
          },
          {
            "date": "2025-03-21",
            "count": 2
          },
          {
            "date": "2025-03-22",
            "count": 1
          },
          {
            "date": "2025-03-23",
            "count": 1
          },
          {
            "date": "2025-03-24",
            "count": 2
          },
          {
            "date": "2025-03-25",
            "count": 3
          },
          {
            "date": "2025-03-26",
            "count": 2
          },
          {
            "date": "2025-03-27",
            "count": 4
          },
          {
            "date": "2025-03-28",
            "count": 1
          },
          {
            "date": "2025-03-29",
            "count": 2
          },
          {
            "date": "2025-03-30",
            "count": 3
          },
          {
            "date": "2025-03-31",
            "count": 10
          },
          {
            "date": "2025-04-01",
            "count": 1
          },
          {
            "date": "2025-04-02",
            "count": 8
          },
          {
            "date": "2025-04-03",
            "count": 4
          },
          {
            "date": "2025-04-04",
            "count": 1
          },
          {
            "date": "2025-04-05",
            "count": 2
          },
          {
            "date": "2025-04-07",
            "count": 3
          },
          {
            "date": "2025-04-08",
            "count": 3
          },
          {
            "date": "2025-04-09",
            "count": 12
          },
          {
            "date": "2025-04-10",
            "count": 1
          },
          {
            "date": "2025-04-11",
            "count": 1
          },
          {
            "date": "2025-04-12",
            "count": 4
          },
          {
            "date": "2025-04-13",
            "count": 4
          },
          {
            "date": "2025-04-14",
            "count": 3
          },
          {
            "date": "2025-04-16",
            "count": 3
          },
          {
            "date": "2025-04-18",
            "count": 1
          },
          {
            "date": "2025-04-19",
            "count": 1
          },
          {
            "date": "2025-04-21",
            "count": 2
          },
          {
            "date": "2025-04-22",
            "count": 5
          },
          {
            "date": "2025-04-23",
            "count": 4
          },
          {
            "date": "2025-04-24",
            "count": 4
          },
          {
            "date": "2025-04-25",
            "count": 2
          },
          {
            "date": "2025-04-26",
            "count": 2
          },
          {
            "date": "2025-04-27",
            "count": 1
          },
          {
            "date": "2025-04-28",
            "count": 2
          },
          {
            "date": "2025-04-29",
            "count": 2
          },
          {
            "date": "2025-04-30",
            "count": 6
          },
          {
            "date": "2025-05-01",
            "count": 3
          },
          {
            "date": "2025-05-02",
            "count": 2
          },
          {
            "date": "2025-05-03",
            "count": 1
          },
          {
            "date": "2025-05-04",
            "count": 1
          },
          {
            "date": "2025-05-05",
            "count": 1
          },
          {
            "date": "2025-05-06",
            "count": 1
          },
          {
            "date": "2025-05-07",
            "count": 2
          },
          {
            "date": "2025-05-08",
            "count": 1
          },
          {
            "date": "2025-05-09",
            "count": 1
          },
          {
            "date": "2025-05-10",
            "count": 3
          },
          {
            "date": "2025-05-12",
            "count": 3
          },
          {
            "date": "2025-05-13",
            "count": 1
          },
          {
            "date": "2025-05-15",
            "count": 3
          },
          {
            "date": "2025-05-16",
            "count": 3
          },
          {
            "date": "2025-05-17",
            "count": 2
          },
          {
            "date": "2025-05-18",
            "count": 3
          },
          {
            "date": "2025-05-19",
            "count": 3
          },
          {
            "date": "2025-05-20",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 6
          },
          {
            "date": "2025-05-22",
            "count": 5
          },
          {
            "date": "2025-05-23",
            "count": 3
          },
          {
            "date": "2025-05-24",
            "count": 3
          },
          {
            "date": "2025-05-25",
            "count": 3
          },
          {
            "date": "2025-05-26",
            "count": 2
          },
          {
            "date": "2025-05-27",
            "count": 1
          },
          {
            "date": "2025-05-28",
            "count": 3
          },
          {
            "date": "2025-05-29",
            "count": 4
          },
          {
            "date": "2025-05-30",
            "count": 5
          },
          {
            "date": "2025-05-31",
            "count": 2
          },
          {
            "date": "2025-06-01",
            "count": 4
          },
          {
            "date": "2025-06-02",
            "count": 3
          },
          {
            "date": "2025-06-03",
            "count": 1
          },
          {
            "date": "2025-06-04",
            "count": 1
          },
          {
            "date": "2025-06-05",
            "count": 1
          },
          {
            "date": "2025-06-06",
            "count": 5
          },
          {
            "date": "2025-06-07",
            "count": 2
          },
          {
            "date": "2025-06-08",
            "count": 2
          },
          {
            "date": "2025-06-09",
            "count": 2
          },
          {
            "date": "2025-06-10",
            "count": 4
          },
          {
            "date": "2025-06-11",
            "count": 2
          },
          {
            "date": "2025-06-12",
            "count": 2
          },
          {
            "date": "2025-06-13",
            "count": 2
          },
          {
            "date": "2025-06-14",
            "count": 1
          },
          {
            "date": "2025-06-15",
            "count": 2
          },
          {
            "date": "2025-06-16",
            "count": 2
          },
          {
            "date": "2025-06-17",
            "count": 2
          },
          {
            "date": "2025-06-18",
            "count": 1
          },
          {
            "date": "2025-06-19",
            "count": 4
          },
          {
            "date": "2025-06-20",
            "count": 2
          },
          {
            "date": "2025-06-21",
            "count": 3
          },
          {
            "date": "2025-06-22",
            "count": 1
          },
          {
            "date": "2025-06-23",
            "count": 2
          },
          {
            "date": "2025-06-24",
            "count": 2
          },
          {
            "date": "2025-06-25",
            "count": 4
          },
          {
            "date": "2025-06-26",
            "count": 3
          },
          {
            "date": "2025-06-27",
            "count": 3
          },
          {
            "date": "2025-06-28",
            "count": 2
          },
          {
            "date": "2025-06-29",
            "count": 2
          },
          {
            "date": "2025-06-30",
            "count": 2
          },
          {
            "date": "2025-07-01",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 4
          },
          {
            "date": "2025-07-03",
            "count": 5
          },
          {
            "date": "2025-07-04",
            "count": 1
          },
          {
            "date": "2025-07-05",
            "count": 2
          },
          {
            "date": "2025-07-07",
            "count": 3
          },
          {
            "date": "2025-07-08",
            "count": 2
          },
          {
            "date": "2025-07-09",
            "count": 4
          },
          {
            "date": "2025-07-10",
            "count": 2
          },
          {
            "date": "2025-07-11",
            "count": 4
          },
          {
            "date": "2025-07-12",
            "count": 1
          },
          {
            "date": "2025-07-14",
            "count": 2
          },
          {
            "date": "2025-07-15",
            "count": 4
          },
          {
            "date": "2025-07-16",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 2
          },
          {
            "date": "2025-07-18",
            "count": 2
          },
          {
            "date": "2025-07-20",
            "count": 2
          },
          {
            "date": "2025-07-21",
            "count": 5
          },
          {
            "date": "2025-07-22",
            "count": 5
          },
          {
            "date": "2025-07-23",
            "count": 1
          },
          {
            "date": "2025-07-26",
            "count": 5
          },
          {
            "date": "2025-07-27",
            "count": 4
          },
          {
            "date": "2025-07-28",
            "count": 2
          },
          {
            "date": "2025-07-29",
            "count": 3
          },
          {
            "date": "2025-07-30",
            "count": 4
          },
          {
            "date": "2025-07-31",
            "count": 6
          },
          {
            "date": "2025-08-01",
            "count": 3
          },
          {
            "date": "2025-08-02",
            "count": 1
          },
          {
            "date": "2025-08-04",
            "count": 1
          },
          {
            "date": "2025-08-05",
            "count": 4
          },
          {
            "date": "2025-08-06",
            "count": 3
          },
          {
            "date": "2025-08-07",
            "count": 1
          },
          {
            "date": "2025-08-08",
            "count": 3
          },
          {
            "date": "2025-08-09",
            "count": 1
          },
          {
            "date": "2025-08-11",
            "count": 2
          },
          {
            "date": "2025-08-12",
            "count": 3
          },
          {
            "date": "2025-08-13",
            "count": 2
          },
          {
            "date": "2025-08-14",
            "count": 4
          },
          {
            "date": "2025-08-15",
            "count": 1
          },
          {
            "date": "2025-08-17",
            "count": 2
          },
          {
            "date": "2025-08-19",
            "count": 1
          },
          {
            "date": "2025-08-22",
            "count": 3
          },
          {
            "date": "2025-08-24",
            "count": 2
          },
          {
            "date": "2025-08-25",
            "count": 2
          },
          {
            "date": "2025-08-27",
            "count": 3
          },
          {
            "date": "2025-08-29",
            "count": 3
          },
          {
            "date": "2025-08-30",
            "count": 4
          },
          {
            "date": "2025-08-31",
            "count": 1
          },
          {
            "date": "2025-09-01",
            "count": 1
          },
          {
            "date": "2025-09-03",
            "count": 2
          },
          {
            "date": "2025-09-04",
            "count": 4
          },
          {
            "date": "2025-09-06",
            "count": 2
          },
          {
            "date": "2025-09-07",
            "count": 2
          },
          {
            "date": "2025-09-08",
            "count": 3
          },
          {
            "date": "2025-09-10",
            "count": 3
          },
          {
            "date": "2025-09-11",
            "count": 4
          },
          {
            "date": "2025-09-12",
            "count": 2
          },
          {
            "date": "2025-09-13",
            "count": 1
          },
          {
            "date": "2025-09-14",
            "count": 4
          },
          {
            "date": "2025-09-15",
            "count": 4
          },
          {
            "date": "2025-09-17",
            "count": 4
          },
          {
            "date": "2025-09-19",
            "count": 4
          },
          {
            "date": "2025-09-21",
            "count": 2
          },
          {
            "date": "2025-09-22",
            "count": 2
          },
          {
            "date": "2025-09-23",
            "count": 4
          },
          {
            "date": "2025-09-24",
            "count": 2
          },
          {
            "date": "2025-09-25",
            "count": 3
          },
          {
            "date": "2025-09-26",
            "count": 1
          },
          {
            "date": "2025-09-27",
            "count": 2
          },
          {
            "date": "2025-09-28",
            "count": 4
          },
          {
            "date": "2025-09-29",
            "count": 1
          },
          {
            "date": "2025-10-01",
            "count": 2
          },
          {
            "date": "2025-10-02",
            "count": 4
          },
          {
            "date": "2025-10-03",
            "count": 2
          },
          {
            "date": "2025-10-04",
            "count": 1
          },
          {
            "date": "2025-10-05",
            "count": 2
          },
          {
            "date": "2025-10-06",
            "count": 2
          },
          {
            "date": "2025-10-07",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 1
          },
          {
            "date": "2025-10-09",
            "count": 4
          },
          {
            "date": "2025-10-10",
            "count": 5
          },
          {
            "date": "2025-10-11",
            "count": 2
          },
          {
            "date": "2025-10-12",
            "count": 2
          },
          {
            "date": "2025-10-13",
            "count": 5
          },
          {
            "date": "2025-10-14",
            "count": 1
          },
          {
            "date": "2025-10-15",
            "count": 1
          },
          {
            "date": "2025-10-16",
            "count": 2
          },
          {
            "date": "2025-10-17",
            "count": 2
          },
          {
            "date": "2025-10-21",
            "count": 2
          },
          {
            "date": "2025-10-22",
            "count": 3
          },
          {
            "date": "2025-10-23",
            "count": 5
          },
          {
            "date": "2025-10-24",
            "count": 1
          },
          {
            "date": "2025-10-25",
            "count": 2
          },
          {
            "date": "2025-10-26",
            "count": 2
          },
          {
            "date": "2025-10-27",
            "count": 3
          },
          {
            "date": "2025-10-28",
            "count": 2
          },
          {
            "date": "2025-10-29",
            "count": 2
          },
          {
            "date": "2025-10-30",
            "count": 2
          },
          {
            "date": "2025-10-31",
            "count": 1
          },
          {
            "date": "2025-11-01",
            "count": 1
          },
          {
            "date": "2025-11-02",
            "count": 2
          },
          {
            "date": "2025-11-04",
            "count": 4
          },
          {
            "date": "2025-11-05",
            "count": 3
          },
          {
            "date": "2025-11-06",
            "count": 5
          },
          {
            "date": "2025-11-07",
            "count": 2
          },
          {
            "date": "2025-11-08",
            "count": 1
          },
          {
            "date": "2025-11-09",
            "count": 2
          },
          {
            "date": "2025-11-10",
            "count": 4
          },
          {
            "date": "2025-11-11",
            "count": 1
          },
          {
            "date": "2025-11-12",
            "count": 2
          },
          {
            "date": "2025-11-13",
            "count": 3
          },
          {
            "date": "2025-11-14",
            "count": 2
          },
          {
            "date": "2025-11-15",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 2
          },
          {
            "date": "2025-11-18",
            "count": 3
          },
          {
            "date": "2025-11-19",
            "count": 2
          },
          {
            "date": "2025-11-22",
            "count": 4
          },
          {
            "date": "2025-11-23",
            "count": 1
          },
          {
            "date": "2025-11-26",
            "count": 2
          },
          {
            "date": "2025-11-27",
            "count": 3
          },
          {
            "date": "2025-11-28",
            "count": 1
          },
          {
            "date": "2025-11-29",
            "count": 2
          },
          {
            "date": "2025-11-30",
            "count": 3
          },
          {
            "date": "2025-12-01",
            "count": 3
          },
          {
            "date": "2025-12-02",
            "count": 4
          },
          {
            "date": "2025-12-03",
            "count": 2
          },
          {
            "date": "2025-12-04",
            "count": 2
          },
          {
            "date": "2025-12-05",
            "count": 2
          },
          {
            "date": "2025-12-06",
            "count": 1
          },
          {
            "date": "2025-12-07",
            "count": 1
          },
          {
            "date": "2025-12-08",
            "count": 3
          },
          {
            "date": "2025-12-09",
            "count": 3
          },
          {
            "date": "2025-12-10",
            "count": 3
          },
          {
            "date": "2025-12-11",
            "count": 3
          },
          {
            "date": "2025-12-13",
            "count": 3
          },
          {
            "date": "2025-12-14",
            "count": 1
          },
          {
            "date": "2025-12-15",
            "count": 3
          },
          {
            "date": "2025-12-16",
            "count": 1
          },
          {
            "date": "2025-12-17",
            "count": 1
          },
          {
            "date": "2025-12-18",
            "count": 2
          },
          {
            "date": "2025-12-20",
            "count": 1
          },
          {
            "date": "2025-12-21",
            "count": 1
          },
          {
            "date": "2025-12-22",
            "count": 1
          },
          {
            "date": "2025-12-23",
            "count": 2
          },
          {
            "date": "2025-12-26",
            "count": 1
          },
          {
            "date": "2025-12-28",
            "count": 1
          },
          {
            "date": "2025-12-29",
            "count": 2
          },
          {
            "date": "2025-12-30",
            "count": 1
          },
          {
            "date": "2025-12-31",
            "count": 2
          },
          {
            "date": "2026-01-02",
            "count": 1
          },
          {
            "date": "2026-01-03",
            "count": 1
          },
          {
            "date": "2026-01-04",
            "count": 3
          },
          {
            "date": "2026-01-05",
            "count": 2
          },
          {
            "date": "2026-01-06",
            "count": 1
          },
          {
            "date": "2026-01-07",
            "count": 2
          },
          {
            "date": "2026-01-08",
            "count": 3
          },
          {
            "date": "2026-01-09",
            "count": 1
          },
          {
            "date": "2026-01-11",
            "count": 1
          },
          {
            "date": "2026-01-12",
            "count": 1
          },
          {
            "date": "2026-01-13",
            "count": 2
          },
          {
            "date": "2026-01-14",
            "count": 2
          },
          {
            "date": "2026-01-15",
            "count": 2
          },
          {
            "date": "2026-01-17",
            "count": 1
          },
          {
            "date": "2026-01-18",
            "count": 2
          },
          {
            "date": "2026-01-19",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 2
          },
          {
            "date": "2026-01-21",
            "count": 2
          },
          {
            "date": "2026-01-22",
            "count": 1
          },
          {
            "date": "2026-01-23",
            "count": 1
          },
          {
            "date": "2026-01-24",
            "count": 1
          },
          {
            "date": "2026-01-25",
            "count": 2
          },
          {
            "date": "2026-01-26",
            "count": 1
          },
          {
            "date": "2026-01-27",
            "count": 2
          },
          {
            "date": "2026-01-28",
            "count": 4
          },
          {
            "date": "2026-01-29",
            "count": 2
          },
          {
            "date": "2026-01-30",
            "count": 3
          },
          {
            "date": "2026-01-31",
            "count": 2
          },
          {
            "date": "2026-02-01",
            "count": 1
          },
          {
            "date": "2026-02-02",
            "count": 1
          },
          {
            "date": "2026-02-04",
            "count": 3
          },
          {
            "date": "2026-02-05",
            "count": 4
          },
          {
            "date": "2026-02-06",
            "count": 1
          },
          {
            "date": "2026-02-07",
            "count": 1
          },
          {
            "date": "2026-02-08",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-10",
            "count": 3
          },
          {
            "date": "2026-02-11",
            "count": 2
          },
          {
            "date": "2026-02-12",
            "count": 2
          },
          {
            "date": "2026-02-14",
            "count": 2
          },
          {
            "date": "2026-02-15",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-02-18",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 4
          },
          {
            "date": "2026-02-20",
            "count": 2
          },
          {
            "date": "2026-02-21",
            "count": 3
          },
          {
            "date": "2026-02-23",
            "count": 3
          },
          {
            "date": "2026-02-24",
            "count": 1
          },
          {
            "date": "2026-02-25",
            "count": 1
          },
          {
            "date": "2026-02-26",
            "count": 3
          },
          {
            "date": "2026-02-27",
            "count": 3
          },
          {
            "date": "2026-02-28",
            "count": 1
          },
          {
            "date": "2026-03-01",
            "count": 2
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 3
          },
          {
            "date": "2026-03-04",
            "count": 3
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 2
          },
          {
            "date": "2026-03-10",
            "count": 2
          },
          {
            "date": "2026-03-12",
            "count": 3
          },
          {
            "date": "2026-03-13",
            "count": 4
          },
          {
            "date": "2026-03-14",
            "count": 2
          },
          {
            "date": "2026-03-15",
            "count": 2
          },
          {
            "date": "2026-03-16",
            "count": 4
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 2
          },
          {
            "date": "2026-03-19",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-21",
            "count": 3
          },
          {
            "date": "2026-03-22",
            "count": 5
          },
          {
            "date": "2026-03-23",
            "count": 4
          },
          {
            "date": "2026-03-24",
            "count": 2
          },
          {
            "date": "2026-03-25",
            "count": 2
          },
          {
            "date": "2026-03-26",
            "count": 3
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-30",
            "count": 4
          },
          {
            "date": "2026-03-31",
            "count": 5
          },
          {
            "date": "2026-04-02",
            "count": 2
          },
          {
            "date": "2026-04-03",
            "count": 4
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 2
          },
          {
            "date": "2026-04-08",
            "count": 4
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-12",
            "count": 2
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 4
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 2
          },
          {
            "date": "2026-04-19",
            "count": 2
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 3
          },
          {
            "date": "2026-04-22",
            "count": 2
          },
          {
            "date": "2026-04-23",
            "count": 2
          },
          {
            "date": "2026-04-24",
            "count": 1
          },
          {
            "date": "2026-04-26",
            "count": 1
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 3
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-03",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 2
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 2
          },
          {
            "date": "2026-05-08",
            "count": 2
          },
          {
            "date": "2026-05-10",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 3
          },
          {
            "date": "2026-05-12",
            "count": 2
          },
          {
            "date": "2026-05-13",
            "count": 2
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 2
          },
          {
            "date": "2026-05-18",
            "count": 3
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 2
          },
          {
            "date": "2026-05-23",
            "count": 2
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-27",
            "count": 5
          },
          {
            "date": "2026-05-28",
            "count": 2
          },
          {
            "date": "2026-05-29",
            "count": 3
          },
          {
            "date": "2026-05-30",
            "count": 3
          },
          {
            "date": "2026-05-31",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 3
          },
          {
            "date": "2026-06-02",
            "count": 2
          },
          {
            "date": "2026-06-03",
            "count": 2
          },
          {
            "date": "2026-06-04",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 2
          },
          {
            "date": "2026-06-08",
            "count": 2
          },
          {
            "date": "2026-06-10",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 3
          },
          {
            "date": "2026-06-13",
            "count": 3
          },
          {
            "date": "2026-06-14",
            "count": 2
          },
          {
            "date": "2026-06-15",
            "count": 2
          },
          {
            "date": "2026-06-16",
            "count": 2
          },
          {
            "date": "2026-06-17",
            "count": 2
          },
          {
            "date": "2026-06-20",
            "count": 2
          },
          {
            "date": "2026-06-21",
            "count": 1
          },
          {
            "date": "2026-06-22",
            "count": 1
          },
          {
            "date": "2026-06-23",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 3
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 1
          },
          {
            "date": "2026-06-29",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 2
          },
          {
            "date": "2026-07-01",
            "count": 2
          },
          {
            "date": "2026-07-03",
            "count": 2
          },
          {
            "date": "2026-07-04",
            "count": 1
          },
          {
            "date": "2026-07-05",
            "count": 5
          },
          {
            "date": "2026-07-06",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-09",
            "count": 4
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 2
          },
          {
            "date": "2026-07-14",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 4
          },
          {
            "date": "2026-07-17",
            "count": 2
          },
          {
            "date": "2026-07-19",
            "count": 3
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_stars": 14679
      },
      "open_issues_and_prs": 269
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "nltk/test/Makefile",
        "web/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 177919,
      "source_files_sampled": 434,
      "oversized_source_files": 13,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "requirements-ci.txt",
        "requirements-test.txt",
        "setup.cfg",
        "setup.py"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 5,
        "malicious_count": 0,
        "assessed_package": "pypi:nltk@3.10.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "click",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "defusedxml",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "gensim",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "joblib",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "markdown-it-py",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "matplotlib",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mdit-plain",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mdit-py-plugins",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pylint",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyparsing",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-cov",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-mock",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-xdist",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-crfsuite",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "regex",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "scikit-learn",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "scipy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tox",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "twython",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 24,
        "direct_count": 0,
        "indirect_count": 24
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 26,
        "merged_prs": 1404,
        "open_issues": 243,
        "closed_ratio": 0.873,
        "closed_issues": 1671,
        "closed_unmerged_prs": 331
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "stevenbird",
          "commits": 5221,
          "avatar_url": "https://avatars.githubusercontent.com/u/55406?v=4"
        },
        {
          "type": "User",
          "login": "alvations",
          "commits": 889,
          "avatar_url": "https://avatars.githubusercontent.com/u/1050316?v=4"
        },
        {
          "type": "User",
          "login": "dhgarrette",
          "commits": 361,
          "avatar_url": "https://avatars.githubusercontent.com/u/484190?v=4"
        },
        {
          "type": "User",
          "login": "kmike",
          "commits": 332,
          "avatar_url": "https://avatars.githubusercontent.com/u/107893?v=4"
        },
        {
          "type": "User",
          "login": "ekaf",
          "commits": 320,
          "avatar_url": "https://avatars.githubusercontent.com/u/4782556?v=4"
        },
        {
          "type": "User",
          "login": "fievelk",
          "commits": 269,
          "avatar_url": "https://avatars.githubusercontent.com/u/2814672?v=4"
        },
        {
          "type": "User",
          "login": "tomaarsen",
          "commits": 192,
          "avatar_url": "https://avatars.githubusercontent.com/u/37621491?v=4"
        },
        {
          "type": "User",
          "login": "iliakur",
          "commits": 185,
          "avatar_url": "https://avatars.githubusercontent.com/u/899591?v=4"
        },
        {
          "type": "User",
          "login": "dimazest",
          "commits": 113,
          "avatar_url": "https://avatars.githubusercontent.com/u/885751?v=4"
        },
        {
          "type": "User",
          "login": "heatherleaf",
          "commits": 109,
          "avatar_url": "https://avatars.githubusercontent.com/u/1324196?v=4"
        }
      ],
      "contributors_sampled": 99,
      "top_contributor_share": 0.527
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "cffconvert.yml",
        "ci.yml",
        "labeler.yml",
        "release.yml",
        "retest-pr.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "ruff.toml",
        "tox.ini"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": null,
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T15:19:06Z",
      "oldest_open_prs": [
        {
          "number": 2956,
          "created_at": "2022-03-05T15:23:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3332,
          "created_at": "2024-10-10T18:45:51Z",
          "last_comment_at": "2025-02-20T05:42:56Z",
          "last_comment_author": "stevenbird"
        },
        {
          "number": 3434,
          "created_at": "2025-10-26T01:34:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3458,
          "created_at": "2025-11-07T19:43:19Z",
          "last_comment_at": "2026-03-18T02:39:52Z",
          "last_comment_author": "alvations"
        },
        {
          "number": 3472,
          "created_at": "2025-11-25T23:54:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3505,
          "created_at": "2026-02-23T16:17:31Z",
          "last_comment_at": "2026-02-28T11:19:12Z",
          "last_comment_author": "ekaf"
        },
        {
          "number": 3517,
          "created_at": "2026-03-15T17:22:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3527,
          "created_at": "2026-03-18T14:17:33Z",
          "last_comment_at": "2026-03-23T10:24:23Z",
          "last_comment_author": "EgodPrime"
        },
        {
          "number": 3538,
          "created_at": "2026-03-20T20:05:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3539,
          "created_at": "2026-03-20T20:30:19Z",
          "last_comment_at": "2026-03-24T10:00:12Z",
          "last_comment_author": "stevenbird"
        },
        {
          "number": 3571,
          "created_at": "2026-04-30T11:43:05Z",
          "last_comment_at": "2026-04-30T12:03:58Z",
          "last_comment_author": "stevenbird"
        },
        {
          "number": 3577,
          "created_at": "2026-05-18T19:45:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3601,
          "created_at": "2026-06-08T08:48:50Z",
          "last_comment_at": "2026-06-26T17:24:52Z",
          "last_comment_author": "ekaf"
        },
        {
          "number": 3649,
          "created_at": "2026-06-22T23:20:52Z",
          "last_comment_at": "2026-06-25T06:40:09Z",
          "last_comment_author": "ekaf"
        },
        {
          "number": 3650,
          "created_at": "2026-06-23T00:55:22Z",
          "last_comment_at": "2026-07-21T03:29:16Z",
          "last_comment_author": "dev-willbird1936"
        },
        {
          "number": 3687,
          "created_at": "2026-06-28T21:19:24Z",
          "last_comment_at": "2026-07-07T06:11:08Z",
          "last_comment_author": "trinik15"
        },
        {
          "number": 3688,
          "created_at": "2026-06-30T14:14:13Z",
          "last_comment_at": "2026-06-30T16:30:55Z",
          "last_comment_author": "ekaf"
        },
        {
          "number": 3695,
          "created_at": "2026-07-07T11:30:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3696,
          "created_at": "2026-07-07T22:34:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3697,
          "created_at": "2026-07-08T09:07:31Z",
          "last_comment_at": "2026-07-09T09:46:44Z",
          "last_comment_author": "ekaf"
        }
      ],
      "last_merged_pr_at": "2026-07-05T10:15:49Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1157,
          "created_at": "2015-10-06T14:21:51Z",
          "last_comment_at": "2015-10-07T18:18:20Z",
          "last_comment_author": "stevenbird"
        },
        {
          "number": 1214,
          "created_at": "2015-11-30T16:17:56Z",
          "last_comment_at": "2021-07-13T12:43:14Z",
          "last_comment_author": "andreasvc"
        },
        {
          "number": 1305,
          "created_at": "2016-02-26T16:45:01Z",
          "last_comment_at": "2023-12-22T21:03:56Z",
          "last_comment_author": "Higgs32584"
        },
        {
          "number": 1317,
          "created_at": "2016-03-02T03:24:40Z",
          "last_comment_at": "2016-03-18T21:55:15Z",
          "last_comment_author": "syllog1sm"
        },
        {
          "number": 1384,
          "created_at": "2016-04-29T20:41:46Z",
          "last_comment_at": "2017-10-04T09:40:52Z",
          "last_comment_author": "fcbond"
        },
        {
          "number": 1489,
          "created_at": "2016-10-26T09:16:42Z",
          "last_comment_at": "2023-12-22T21:05:36Z",
          "last_comment_author": "Higgs32584"
        },
        {
          "number": 1612,
          "created_at": "2017-02-07T16:52:42Z",
          "last_comment_at": "2025-05-02T07:41:09Z",
          "last_comment_author": "ekaf"
        },
        {
          "number": 1622,
          "created_at": "2017-02-10T05:34:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1656,
          "created_at": "2017-03-18T12:35:05Z",
          "last_comment_at": "2017-03-19T19:18:28Z",
          "last_comment_author": "fievelk"
        },
        {
          "number": 1689,
          "created_at": "2017-04-16T10:47:47Z",
          "last_comment_at": "2022-08-20T19:27:43Z",
          "last_comment_author": "arademaker"
        },
        {
          "number": 1694,
          "created_at": "2017-04-17T17:56:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1700,
          "created_at": "2017-04-24T20:52:14Z",
          "last_comment_at": "2019-12-26T21:06:42Z",
          "last_comment_author": "sunnylnct007"
        },
        {
          "number": 1708,
          "created_at": "2017-05-03T14:02:58Z",
          "last_comment_at": "2021-05-22T17:45:41Z",
          "last_comment_author": "b-mackey"
        },
        {
          "number": 1724,
          "created_at": "2017-05-18T01:03:57Z",
          "last_comment_at": "2017-08-31T19:23:56Z",
          "last_comment_author": "campionfellin"
        },
        {
          "number": 1728,
          "created_at": "2017-05-19T07:51:16Z",
          "last_comment_at": "2017-10-13T08:48:41Z",
          "last_comment_author": "alvations"
        },
        {
          "number": 1740,
          "created_at": "2017-05-31T02:54:30Z",
          "last_comment_at": "2017-06-05T20:03:48Z",
          "last_comment_author": "Bsmil3y"
        },
        {
          "number": 1745,
          "created_at": "2017-06-04T06:39:23Z",
          "last_comment_at": "2017-10-15T17:24:24Z",
          "last_comment_author": "nschneid"
        },
        {
          "number": 1748,
          "created_at": "2017-06-07T09:54:13Z",
          "last_comment_at": "2017-06-07T10:15:53Z",
          "last_comment_author": "alvations"
        },
        {
          "number": 1756,
          "created_at": "2017-06-20T01:37:25Z",
          "last_comment_at": "2018-01-23T17:29:34Z",
          "last_comment_author": "Thunderforge"
        },
        {
          "number": 1767,
          "created_at": "2017-07-04T10:21:01Z",
          "last_comment_at": "2021-11-05T15:47:38Z",
          "last_comment_author": "tomaarsen"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/nltk/nltk",
    "host": "github.com",
    "name": "nltk",
    "owner": "nltk"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": "High-Risk Jurisdiction Policy applies a 50% multiplier to weighted overall health and gives it an At risk ceiling of 49.",
      "notes": [
        {
          "code": "jurisdiction_overall_adjustment",
          "params": {
            "cap": 49,
            "pct": 50
          }
        }
      ],
      "value": 38,
      "inputs": {
        "security": 49,
        "vitality": 83,
        "community": 90,
        "governance": 69,
        "engineering": 85,
        "high_risk_jurisdiction_cap": 49,
        "high_risk_jurisdiction_multiplier": 50,
        "weighted_overall_before_jurisdiction": 76,
        "overall_after_jurisdiction_multiplier": 38
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 529,
              "human_commit_share": 0.99,
              "days_since_last_push": 13,
              "active_weeks_last_year": 39
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 13 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "39/52 weeks with commits",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 39
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "529 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 529
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v3.10.0-rc1",
              "releases_from_tags": false,
              "days_since_latest_release": 40,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 40 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 40
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "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": 16,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 16 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 16
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 90,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "excellent",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "forks": 3028,
              "stars": 14679,
              "watchers": 437,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "14,679 stars",
                "points": 60,
                "status": "met",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 14679
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3,028 forks",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3028
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "437 watchers",
                "points": 14.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 437
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "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": 100,
            "inputs": {
              "packages": [
                "nltk"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 65956482
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "65,956,482 downloads/month across pypi",
                "points": 80,
                "status": "met",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 65956482,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "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": 69,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 99,
              "top_contributor_share": 0.527
            },
            "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 53% of commits",
                "points": 10.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 53
                    }
                  }
                ],
                "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 1404,
              "open_issues": 243,
              "closed_issues": 1671,
              "issue_closed_ratio": 0.873,
              "closed_unmerged_prs": 331
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "87% of issues closed",
                "points": 40.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 87
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1404/1735 decided PRs merged",
                "points": 31,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1404,
                      "decided": 1735
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "followers": 512,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "nltk",
              "public_repos": 10,
              "account_age_days": 6161
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "512 followers of nltk",
                "points": 19.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 512,
                      "login": "nltk"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "10 public repos, account ~16 yr old",
                "points": 19.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 10
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "nltk"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 13
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 13 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "57 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 57
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 85,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "ruff.toml, tox.ini",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "ruff.toml, tox.ini"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "nltk",
                "python",
                "nlp",
                "natural-language-processing",
                "machine-learning"
              ],
              "has_wiki": true,
              "homepage": "https://www.nltk.org",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://www.nltk.org",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized. High-Risk Jurisdiction Policy applies a 50% multiplier to Security posture and gives it an At risk ceiling of 49.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dependency_lockfiles"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "jurisdiction_posture_adjustment",
                "params": {
                  "cap": 49,
                  "pct": 50
                }
              }
            ],
            "value": 36,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [],
              "manifests": [
                "requirements-ci.txt",
                "requirements-test.txt",
                "setup.cfg",
                "setup.py"
              ],
              "has_codeql_workflow": false,
              "has_security_policy": true,
              "has_dependabot_config": true,
              "high_risk_jurisdiction_cap": 49,
              "high_risk_jurisdiction_multiplier": 50,
              "security_posture_after_multiplier": 36,
              "security_posture_before_jurisdiction": 73
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": "published library — lockfiles are an application concern, not expected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "lockfiles_not_expected",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:nltk@3.10.0 runtime dependency closure — what installing the published package pulls in — 5 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:nltk@3.10.0",
                  "assessed": 5
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 5,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 5,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "moderate",
            "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": 50,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": true,
              "exposures": [
                {
                  "role": "top_contributor",
                  "count": 1,
                  "country": "Russia"
                }
              ],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 15
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "Russia: top_contributor (1)",
                "points": 50,
                "status": "partial",
                "details": [
                  {
                    "code": "jurisdiction_exposure",
                    "params": {
                      "role": "top_contributor",
                      "count": 1,
                      "country": "Russia"
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "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.939,
              "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": "93 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 93,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile",
                "nltk/test/Makefile",
                "web/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.06,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, nltk/test/Makefile, web/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, nltk/test/Makefile, web/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "ruff.toml, tox.ini",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "ruff.toml, tox.ini"
                    }
                  }
                ],
                "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": "6 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 6,
                      "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 177919,
              "source_files_sampled": 434,
              "oversized_source_files": 13
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "13/434 source files over 60KB",
                "points": 53.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 434,
                      "oversized": 13
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "notebooks"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "notebooks"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "OpenSSF Scorecard timed out after 240s; skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T00:32:35.818983Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/nltk/nltk.svg",
  "full_name": "nltk/nltk",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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