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

ihmeuw / vivarium-suite

Vivarium simulation framework and tools monorepo

PythonBSD-3-Clause★ 2 estrellas⑂ 0 forksdesde abr 2026Ver en GitHub ↗

ihmeuw/vivarium-suite tiene un índice de salud de 67 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (94/100) y la más baja, Community & Adoption (36/100). Se actualizó por última vez hoy. 3 personas concentran la mayor parte del trabajo reciente.

67
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

170 seguidores203 repositorios públicosdesde jun 2013

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
PyPIvivarium-engine5.5.3-25hace 0 días
PyPIvivarium-artifact1.0.8-9hace 0 días
PyPIvivarium-profiling0.5.3-22hace 7 días
PyPIvivarium-validation0.1.2-3hace 0 días
PyPIvivarium-build-utils4.4.2-65hace 0 días
PyPIvivarium-config-tree5.0.12-13hace 0 días
PyPIvivarium-gbd-mapping6.0.7-8hace 0 días
PyPIvivarium-dependencies1.2.4-17hace 8 días

Métricas por categoría

Vitalidad

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

94Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
36/36Cadencia de commits — 52/52 semanas con commits
18/18Volumen de commits — 915 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year915
human_commit_share1
days_since_last_push0
active_weeks_last_year52
Cómo se puntúa
27/27Publica versiones — 100 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~0 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count100
latest_release_tagvivarium-fuzzy-checker-v0.2.1
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

36En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (BSD-3-Clause)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template

Sostenibilidad y Gobernanza

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

82Bueno · 24% del índice global
Cómo se puntúa
36/54Factor bus — la mitad de los commits recae en 3 contribuyente(s)
17.7/22.5Distribución de commits — el principal contribuyente firma el 22% de los commits
13.5/13.5Amplitud de contribuyentes — 21 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 6 contributing companies or organizations
Datos de entrada utilizados
bus_factor3
contributors_sampled21
top_contributor_share0,215
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
33.7/38.3Aceptación de PR — 194/220 PR decididos fusionados
10.5/15OpenSSF Scorecard: Code-Review — Found 8/11 approved changesets -- score normalized to 7
Datos de entrada utilizados
merged_prs194
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs26
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
16.1/25Alcance del propietario — 170 seguidores de ihmeuw
25/25Trayectoria — 203 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers170
owner_typeOrganization
is_verified
owner_loginihmeuw
public_repos203
account_age_days4789
Cómo se puntúa
25/25Publicado y resoluble — 8 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 65 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesvivarium-engine, vivarium-artifact, vivarium-profiling, vivarium-validation, vivarium-build-utils, vivarium-config-tree, vivarium-gbd-mapping, vivarium-dependencies
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

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

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

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

48En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
5.2/7.5Code-Review — Found 8/11 approved changesets -- score normalized to 7
2.5/2.5Contributors — project has 6 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,8
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

68Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 82 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,82
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes6633
Cómo se puntúa
18/18Arranque con un solo comando — libs/artifact/Makefile, libs/artifact/docs/Makefile, libs/build-utils/Makefile, libs/cluster-tools/Makefile, libs/cluster-tools/docs/Makefile, libs/config-tree/Makefile, libs/config-tree/docs/Makefile, libs/dependencies/Makefile, libs/engine/Makefile, libs/engine/docs/Makefile, libs/fuzzy-checker/Makefile, libs/fuzzy-checker/docs/Makefile, libs/gbd-mapping/Makefile, libs/gbd-mapping/docs/Makefile, libs/profiling/Makefile, libs/public-health/Makefile, libs/public-health/docs/Makefile, libs/pytest-vivarium/Makefile, libs/pytest-vivarium/docs/Makefile, libs/risk-distributions/Makefile, libs/risk-distributions/docs/Makefile, libs/validation/Makefile, libs/validation/docs/Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — libs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 33 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_fileslibs/artifact/Makefile, libs/artifact/docs/Makefile, libs/build-utils/Makefile, libs/cluster-tools/Makefile, libs/cluster-tools/docs/Makefile, libs/config-tree/Makefile, libs/config-tree/docs/Makefile, libs/dependencies/Makefile, libs/engine/Makefile, libs/engine/docs/Makefile, libs/fuzzy-checker/Makefile, libs/fuzzy-checker/docs/Makefile, libs/gbd-mapping/Makefile, libs/gbd-mapping/docs/Makefile, libs/profiling/Makefile, libs/public-health/Makefile, libs/public-health/docs/Makefile, libs/pytest-vivarium/Makefile, libs/pytest-vivarium/docs/Makefile, libs/risk-distributions/Makefile, libs/risk-distributions/docs/Makefile, libs/validation/Makefile, libs/validation/docs/Makefile
has_devcontainerno
has_linter_configno
typecheck_configslibs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed
agent_commit_share0,33
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — Python con configuración de verificación de tipos (libs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed)
54.2/55Tamaños de archivo manejables — 7/485 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes903.070
source_files_sampled485
oversized_source_files7
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples, notebooks
Datos de entrada utilizados
example_dirsexamples, notebooks
has_mcp_signalno
api_schema_files

Datos clave

2estrellas de GitHub
21contribuidores
915commits en los últimos 12 meses
0días desde el último push
100versiones publicadas
3factor bus
0issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:vivarium-engine@5.5.3; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.8 / 10
4.8agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 23:08 UTC

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests11 out of 11 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
7Code-ReviewFound 8/11 approved changesets -- score normalized to 7
10Contributorsproject has 6 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 49
RegistroPaqueteRestricción de versiónManifiesto
PyPIvivarium-dependencieslibs/artifact/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/artifact/pyproject.toml
PyPIpackaginglibs/build-utils/pyproject.toml
PyPItomlilibs/build-utils/pyproject.toml
PyPIvivarium-dependencieslibs/cluster-tools/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/cluster-tools/pyproject.toml
PyPIvivarium-engine>=5.1.0libs/cluster-tools/pyproject.toml
PyPIvivarium-config-tree>=5.0.0libs/cluster-tools/pyproject.toml
PyPIdilllibs/cluster-tools/pyproject.toml
PyPIpsutillibs/cluster-tools/pyproject.toml
PyPIvivarium-dependencieslibs/config-tree/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/config-tree/pyproject.toml
PyPIvivarium-artifact>=1.0.2libs/engine/pyproject.toml
PyPIvivarium-config-treelibs/engine/pyproject.toml
PyPIvivarium-dependencieslibs/engine/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/engine/pyproject.toml
PyPIdilllibs/engine/pyproject.toml
PyPIvivarium-dependencieslibs/fuzzy-checker/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/fuzzy-checker/pyproject.toml
PyPIvivarium-dependencieslibs/gbd-mapping/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/gbd-mapping/pyproject.toml
PyPIpyyamllibs/gbd-mapping/pyproject.toml
PyPIvivarium-dependencieslibs/profiling/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/profiling/pyproject.toml
PyPIvivarium-gbd-mapping>=6.0.0libs/profiling/pyproject.toml
PyPIvivarium-engine>=5.1.0libs/profiling/pyproject.toml
PyPIvivarium-public-health>=6.0.0libs/profiling/pyproject.toml
PyPIvivarium-config-tree>=5.0.1libs/profiling/pyproject.toml
PyPIjinja2libs/profiling/pyproject.toml
PyPIpyyamllibs/profiling/pyproject.toml
PyPImemory-profilerlibs/profiling/pyproject.toml
PyPImatplotliblibs/profiling/pyproject.toml
PyPIseabornlibs/profiling/pyproject.toml
PyPIscalenelibs/profiling/pyproject.toml
PyPInbformat>=5.0libs/profiling/pyproject.toml
PyPIvivarium-dependencieslibs/public-health/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/public-health/pyproject.toml
PyPIvivarium-engine>=5.2.0libs/public-health/pyproject.toml
PyPIvivarium-config-tree>=5.0.0libs/public-health/pyproject.toml
PyPIvivarium-risk-distributions>=3.0.0,<4.0.0libs/public-health/pyproject.toml
PyPIvivarium-dependencieslibs/pytest-vivarium/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/pytest-vivarium/pyproject.toml
PyPIvivarium-config-treelibs/pytest-vivarium/pyproject.toml
PyPIvivarium-dependencieslibs/risk-distributions/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/risk-distributions/pyproject.toml
PyPIvivarium-dependencieslibs/validation/pyproject.toml
PyPIvivarium-build-utils>=4.0.0,<5.0.0libs/validation/pyproject.toml
PyPIvivarium-config-treelibs/validation/pyproject.toml
PyPIvivarium-fuzzy-checkerlibs/validation/pyproject.toml
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 20183,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 378,
        "HTML": 44896,
        "Shell": 23264,
        "Groovy": 52412,
        "Python": 6168972,
        "Makefile": 78096,
        "JavaScript": 14021,
        "Jupyter Notebook": 5459
      },
      "pushed_at": "2026-07-23T23:05:40Z",
      "created_at": "2026-04-27T20:01:48Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T23:05:02Z",
      "description": "Vivarium simulation framework and tools monorepo",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "BSD-3-Clause",
      "default_branch": "main",
      "license_spdx_raw": "BSD-3-Clause",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "http://www.healthdata.org/",
      "name": "Institute for Health Metrics and Evaluation",
      "type": "Organization",
      "login": "ihmeuw",
      "company": null,
      "location": "Seattle, WA",
      "followers": 170,
      "avatar_url": "https://avatars.githubusercontent.com/u/4683173?v=4",
      "created_at": "2013-06-12T21:27:03Z",
      "is_verified": null,
      "public_repos": 203,
      "account_age_days": 4789
    },
    "license": {
      "state": "standard",
      "spdx_id": "BSD-3-Clause",
      "raw_spdx": "BSD-3-Clause",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "vivarium-fuzzy-checker-v0.2.1",
          "kind": "other",
          "published_at": "2026-07-23T23:07:18Z"
        },
        {
          "tag": "vivarium-validation-v0.1.2",
          "kind": "other",
          "published_at": "2026-07-23T23:08:06Z"
        },
        {
          "tag": "pytest-vivarium-v0.1.1",
          "kind": "other",
          "published_at": "2026-07-23T23:07:34Z"
        },
        {
          "tag": "vivarium-risk-distributions-v3.1.8",
          "kind": "other",
          "published_at": "2026-07-23T23:07:18Z"
        },
        {
          "tag": "vivarium-artifact-v1.0.8",
          "kind": "other",
          "published_at": "2026-07-23T23:07:05Z"
        },
        {
          "tag": "vivarium-build-utils-v4.4.2",
          "kind": "other",
          "published_at": "2026-07-23T23:06:11Z"
        },
        {
          "tag": "vivarium-engine-v5.5.3",
          "kind": "other",
          "published_at": "2026-07-23T23:08:13Z"
        },
        {
          "tag": "vivarium-gbd-mapping-v6.0.7",
          "kind": "other",
          "published_at": "2026-07-23T23:07:03Z"
        },
        {
          "tag": "vivarium-config-tree-v5.0.12",
          "kind": "other",
          "published_at": "2026-07-23T23:06:52Z"
        },
        {
          "tag": "pytest-vivarium-v0.1.0",
          "kind": "other",
          "published_at": "2026-07-23T22:25:48Z"
        },
        {
          "tag": "vivarium-ai-tools-v0.23.1",
          "kind": "other",
          "published_at": "2026-07-23T22:21:50Z"
        },
        {
          "tag": "vivarium-validation-v0.1.1",
          "kind": "other",
          "published_at": "2026-07-22T18:03:13Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.13",
          "kind": "other",
          "published_at": "2026-07-22T17:59:40Z"
        },
        {
          "tag": "vivarium-validation-v0.1.0",
          "kind": "other",
          "published_at": "2026-07-21T20:07:40Z"
        },
        {
          "tag": "vivarium-build-utils-v4.4.1",
          "kind": "other",
          "published_at": "2026-07-21T19:00:55Z"
        },
        {
          "tag": "vivarium-public-health-v6.4.4",
          "kind": "other",
          "published_at": "2026-07-21T18:30:13Z"
        },
        {
          "tag": "vivarium-engine-v5.5.2",
          "kind": "other",
          "published_at": "2026-07-21T18:27:54Z"
        },
        {
          "tag": "vivarium-fuzzy-checker-v0.2.0",
          "kind": "other",
          "published_at": "2026-07-21T18:20:01Z"
        },
        {
          "tag": "vivarium-public-health-v6.4.3",
          "kind": "other",
          "published_at": "2026-07-20T17:47:55Z"
        },
        {
          "tag": "vivarium-engine-v5.5.1",
          "kind": "other",
          "published_at": "2026-07-20T17:45:00Z"
        },
        {
          "tag": "vivarium-fuzzy-checker-v0.1.0",
          "kind": "other",
          "published_at": "2026-07-20T17:40:53Z"
        },
        {
          "tag": "vivarium-engine-v5.5.0",
          "kind": "other",
          "published_at": "2026-07-17T16:43:39Z"
        },
        {
          "tag": "vivarium-public-health-v6.4.2",
          "kind": "other",
          "published_at": "2026-07-16T23:59:17Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.6",
          "kind": "other",
          "published_at": "2026-07-16T18:15:01Z"
        },
        {
          "tag": "vivarium-profiling-v0.5.3",
          "kind": "other",
          "published_at": "2026-07-16T17:34:30Z"
        },
        {
          "tag": "vivarium-public-health-v6.4.1",
          "kind": "other",
          "published_at": "2026-07-16T17:33:40Z"
        },
        {
          "tag": "vivarium-public-health-v6.4.0",
          "kind": "other",
          "published_at": "2026-07-15T17:09:43Z"
        },
        {
          "tag": "vivarium-engine-v5.4.0",
          "kind": "other",
          "published_at": "2026-07-15T16:49:32Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.5",
          "kind": "other",
          "published_at": "2026-07-14T23:51:44Z"
        },
        {
          "tag": "vivarium-profiling-v0.5.2",
          "kind": "other",
          "published_at": "2026-07-14T23:55:03Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.9",
          "kind": "other",
          "published_at": "2026-07-14T23:54:03Z"
        },
        {
          "tag": "vivarium-engine-v5.3.5",
          "kind": "other",
          "published_at": "2026-07-14T23:51:56Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.12",
          "kind": "other",
          "published_at": "2026-07-14T23:52:47Z"
        },
        {
          "tag": "vivarium-gbd-mapping-v6.0.6",
          "kind": "other",
          "published_at": "2026-07-14T23:50:40Z"
        },
        {
          "tag": "vivarium-risk-distributions-v3.1.7",
          "kind": "other",
          "published_at": "2026-07-14T23:50:52Z"
        },
        {
          "tag": "vivarium-config-tree-v5.0.11",
          "kind": "other",
          "published_at": "2026-07-14T23:50:35Z"
        },
        {
          "tag": "vivarium-dependencies-v1.2.4",
          "kind": "other",
          "published_at": "2026-07-14T23:49:53Z"
        },
        {
          "tag": "vivarium-artifact-v1.0.7",
          "kind": "other",
          "published_at": "2026-07-14T23:50:36Z"
        },
        {
          "tag": "vivarium-config-tree-v5.0.10",
          "kind": "other",
          "published_at": "2026-07-14T22:59:03Z"
        },
        {
          "tag": "vivarium-engine-v5.3.4",
          "kind": "other",
          "published_at": "2026-07-14T22:59:56Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.8",
          "kind": "other",
          "published_at": "2026-07-13T22:13:09Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.7",
          "kind": "other",
          "published_at": "2026-07-13T22:10:07Z"
        },
        {
          "tag": "vivarium-build-utils-v4.4.0",
          "kind": "other",
          "published_at": "2026-07-13T21:50:40Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.11",
          "kind": "other",
          "published_at": "2026-07-13T20:55:09Z"
        },
        {
          "tag": "vivarium-engine-v5.3.3",
          "kind": "other",
          "published_at": "2026-07-13T17:20:02Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.6",
          "kind": "other",
          "published_at": "2026-07-09T00:30:48Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.5",
          "kind": "other",
          "published_at": "2026-07-09T00:01:25Z"
        },
        {
          "tag": "vivarium-build-utils-v4.3.0",
          "kind": "other",
          "published_at": "2026-07-08T23:06:13Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.4",
          "kind": "other",
          "published_at": "2026-07-08T18:57:33Z"
        },
        {
          "tag": "vivarium-risk-distributions-v3.1.6",
          "kind": "other",
          "published_at": "2026-07-08T18:36:37Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.10",
          "kind": "other",
          "published_at": "2026-07-07T16:45:44Z"
        },
        {
          "tag": "vivarium-ai-tools-v0.23.0",
          "kind": "other",
          "published_at": "2026-07-06T19:43:31Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.4",
          "kind": "other",
          "published_at": "2026-07-06T19:40:18Z"
        },
        {
          "tag": "vivarium-artifact-v1.0.6",
          "kind": "other",
          "published_at": "2026-07-06T19:11:34Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.3",
          "kind": "other",
          "published_at": "2026-07-06T19:13:02Z"
        },
        {
          "tag": "vivarium-build-utils-v4.2.5",
          "kind": "other",
          "published_at": "2026-07-06T19:11:18Z"
        },
        {
          "tag": "vivarium-gbd-mapping-v6.0.5",
          "kind": "other",
          "published_at": "2026-07-06T19:11:28Z"
        },
        {
          "tag": "vivarium-config-tree-v5.0.9",
          "kind": "other",
          "published_at": "2026-07-06T19:11:27Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.9",
          "kind": "other",
          "published_at": "2026-07-06T19:11:41Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.3",
          "kind": "other",
          "published_at": "2026-07-06T19:11:35Z"
        },
        {
          "tag": "vivarium-profiling-v0.5.1",
          "kind": "other",
          "published_at": "2026-07-06T19:11:28Z"
        },
        {
          "tag": "vivarium-risk-distributions-v3.1.5",
          "kind": "other",
          "published_at": "2026-07-06T19:11:24Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.2",
          "kind": "other",
          "published_at": "2026-07-02T22:39:53Z"
        },
        {
          "tag": "vivarium-profiling-v0.5.0",
          "kind": "other",
          "published_at": "2026-07-02T22:18:26Z"
        },
        {
          "tag": "vivarium-compat-v0.7.0",
          "kind": "other",
          "published_at": "2026-07-02T22:10:10Z"
        },
        {
          "tag": "vivarium-engine-v5.3.2",
          "kind": "other",
          "published_at": "2026-07-02T20:07:53Z"
        },
        {
          "tag": "vivarium-build-utils-v4.2.4",
          "kind": "other",
          "published_at": "2026-07-01T21:52:19Z"
        },
        {
          "tag": "vivarium-build-utils-v4.2.3",
          "kind": "other",
          "published_at": "2026-07-01T20:23:34Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.2",
          "kind": "other",
          "published_at": "2026-07-01T17:13:50Z"
        },
        {
          "tag": "vivarium-engine-v5.3.1",
          "kind": "other",
          "published_at": "2026-06-30T23:00:12Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.8",
          "kind": "other",
          "published_at": "2026-06-30T22:20:44Z"
        },
        {
          "tag": "vivarium-engine-v5.3.0",
          "kind": "other",
          "published_at": "2026-06-30T21:35:18Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.1",
          "kind": "other",
          "published_at": "2026-06-30T19:40:50Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.7",
          "kind": "other",
          "published_at": "2026-06-30T19:38:49Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.1",
          "kind": "other",
          "published_at": "2026-06-30T19:38:48Z"
        },
        {
          "tag": "vivarium-engine-v5.2.1",
          "kind": "other",
          "published_at": "2026-06-30T19:38:47Z"
        },
        {
          "tag": "vivarium-compat-v0.6.4",
          "kind": "other",
          "published_at": "2026-06-30T19:38:46Z"
        },
        {
          "tag": "vivarium-config-tree-v5.0.8",
          "kind": "other",
          "published_at": "2026-06-30T19:38:44Z"
        },
        {
          "tag": "vivarium-profiling-v0.4.17",
          "kind": "other",
          "published_at": "2026-06-30T19:38:43Z"
        },
        {
          "tag": "vivarium-artifact-v1.0.5",
          "kind": "other",
          "published_at": "2026-06-30T19:38:38Z"
        },
        {
          "tag": "vivarium-risk-distributions-v3.1.4",
          "kind": "other",
          "published_at": "2026-06-30T19:38:37Z"
        },
        {
          "tag": "vivarium-gbd-mapping-v6.0.4",
          "kind": "other",
          "published_at": "2026-06-30T19:38:33Z"
        },
        {
          "tag": "vivarium-build-utils-v4.2.2",
          "kind": "other",
          "published_at": "2026-06-30T19:38:32Z"
        },
        {
          "tag": "vivarium-dependencies-v1.2.3",
          "kind": "other",
          "published_at": "2026-06-30T19:38:27Z"
        },
        {
          "tag": "vivarium-build-utils-v4.2.1",
          "kind": "other",
          "published_at": "2026-06-30T19:15:27Z"
        },
        {
          "tag": "vivarium-dependencies-v1.2.2",
          "kind": "other",
          "published_at": "2026-06-30T19:09:26Z"
        },
        {
          "tag": "vivarium-ai-tools-v0.22.2",
          "kind": "other",
          "published_at": "2026-06-30T18:15:04Z"
        },
        {
          "tag": "vivarium-ai-tools-v0.22.1",
          "kind": "other",
          "published_at": "2026-06-30T17:05:55Z"
        },
        {
          "tag": "vivarium-build-utils-v4.2.0",
          "kind": "other",
          "published_at": "2026-06-29T23:26:07Z"
        },
        {
          "tag": "vivarium-testing-utils-v0.7.0",
          "kind": "other",
          "published_at": "2026-06-29T23:15:57Z"
        },
        {
          "tag": "vivarium-public-health-v6.3.0",
          "kind": "other",
          "published_at": "2026-06-29T22:52:39Z"
        },
        {
          "tag": "vivarium-engine-v5.2.0",
          "kind": "other",
          "published_at": "2026-06-29T20:02:26Z"
        },
        {
          "tag": "vivarium-public-health-v6.2.0",
          "kind": "other",
          "published_at": "2026-06-29T19:37:44Z"
        },
        {
          "tag": "vivarium-build-utils-v4.1.0",
          "kind": "other",
          "published_at": "2026-06-29T17:36:51Z"
        },
        {
          "tag": "vivarium-public-health-v6.1.2",
          "kind": "other",
          "published_at": "2026-06-29T15:50:39Z"
        },
        {
          "tag": "vivarium-ai-tools-v0.22.0",
          "kind": "other",
          "published_at": "2026-06-25T21:36:14Z"
        },
        {
          "tag": "vivarium-ai-tools-v0.21.0",
          "kind": "other",
          "published_at": "2026-06-25T16:50:17Z"
        },
        {
          "tag": "vivarium-build-utils-v4.0.2",
          "kind": "other",
          "published_at": "2026-06-24T16:33:13Z"
        },
        {
          "tag": "vivarium-build-utils-v4.0.1",
          "kind": "other",
          "published_at": "2026-06-23T22:37:11Z"
        },
        {
          "tag": "vivarium-cluster-tools-v4.2.6",
          "kind": "other",
          "published_at": "2026-06-23T21:05:14Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cb6bec6a3edb20fa76fadbcc280cb4ad346e46de",
          "body": null,
          "is_bot": false,
          "headline": "Standardize package __init__ docstrings and add project URLs (#224)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T23:04:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1bf76e47130471797f3b8730370d0623fd96ae7",
          "body": null,
          "is_bot": false,
          "headline": "update changelog dates",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "721e8200e4d63e3bc8077b7b51f2f2b2f5007ca7",
          "body": null,
          "is_bot": false,
          "headline": "update outer-level README to include latest batch of libs",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fc0eb062e3df22ad2efba6bee54236d771244e5",
          "body": null,
          "is_bot": false,
          "headline": "minor cleanups",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2697ac97c630fd58f34355ad872c6b82d3cdb4ec",
          "body": "Ships the pytest-vivarium / vivarium.fuzzy_checker pointer updates as an\nai-tools patch release (its release workflow fires on a CHANGELOG.rst touch).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump ai-tools to 0.23.1 for the split-package reference fixes",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5298d4bd1a85f9343cf6114419a03ea8b31475d4",
          "body": "Release workflow (highest-impact): parse the dist-name tag prefix with tomllib\ninstead of a fragile unanchored regex - [project]-scoped, and raises loudly on a\nmissing/malformed pyproject instead of silently yielding a malformed tag under\nset -e. Move \"Set up Python\" ahead of the collect step so tom\n[…]\nthe git tag prefix is now the dist name (`<dist>-v<X.Y.Z>`), not\nuniversally `vivarium-<pkg>-` (pytest-vivarium is the exception).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Address PR3 review findings",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0378bd4b22f1d60c851681f00a9ffbe8d7f1235b",
          "body": "Point the ai-tools pytest/model-development references at their post-split homes\n(the markers at pytest-vivarium; FuzzyChecker at vivarium.fuzzy_checker) and fix\nthe skills/pytest path to libs/pytest-vivarium. Rename the synthetic\nvivarium-testing-utils fixture in the dependency-graph tests to an obviously-fake\nvivarium-fake-plugin so it is not mistaken for the real, now-removed package.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refresh ai-tools plugin pointers and de-real the synthetic test names",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7417f1267e97a90194fe4ebf3c25945fdd19978",
          "body": "Point the labeler glob/label and the root README package table at the new\npackage, and refresh the build-utils comments that cited config-tree's now-gone\ntesting-utils test cycle (still accurate with pytest-vivarium, which likewise\ndepends on build-utils and so cannot be a dependency of it).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update references from testing-utils to pytest-vivarium",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a85ab26906a5e5529033a63914b5dc973b8414b5",
          "body": "release.yml hardcoded the tag as vivarium-<dir>, which cannot express a\nnon-vivarium- distribution like pytest-vivarium. Derive the tag prefix from each\npackage's pyproject [project].name instead: for the push and workflow_dispatch\npaths via a get_dist pyproject reader, for the release-published pat\n[…]\nld emitted by build-release-matrix. Backward-compatible:\nevery existing lib's dist IS vivarium-<dir>, so their tags are unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Derive the release git tag from the dist name, not vivarium-<dir>",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0831cb8fc098ce601544acb989c206e2905b67b9",
          "body": "Every remaining consumer depended on vivarium-testing-utils only for the\nauto-loaded pytest plugin, so swap that test dependency for pytest-vivarium\nacross artifact, cluster-tools, config-tree, engine, fuzzy-checker, gbd-mapping,\nprofiling, public-health, risk-distributions, and validation. Stale version\npins (>=0.3.4, >=0.6.0) are dropped since pytest-vivarium starts at 0.1.0.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Repoint vivarium-testing-utils dependents to pytest-vivarium",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0f9fdad2492f193fa2da32ab2e9f9b7425378d4",
          "body": "Rewrite the moved plugin/test imports and docstring for the new package, add the\npackage __init__ (with numpy.seterr), pyproject (pytest11 entry point, deps,\npackaging), README, docs, and smoke tests, and delete the now-empty\nlibs/testing-utils (frozen on PyPI at 0.7.6).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adapt moved files, add pytest-vivarium scaffolding, delete testing-utils",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7aff9d08498116905cf9a1ad50c80c92e80e68b7",
          "body": "Byte-identical git mv of the extracted files from libs/testing-utils to the new\nlibs/pytest-vivarium package, so history is preserved and reviewers can skip this\ncommit. All adaptation (imports, docstrings, new package config, deletion of the\nrest of testing-utils) is in the following commits.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Move pytest plugin + shared scaffolding into pytest-vivarium (pure move)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-23T22:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59ea2977a41a4564968a609c31d953d6212e0330",
          "body": null,
          "is_bot": false,
          "headline": "Reorganize tests into subdirs (#222)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-22T18:01:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "238032150d077d03f83c0de9d1453829da603542",
          "body": "Add job id to name of performance logs\n\nAdd job id to name of performance logs\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-6941\n\nChanges and notes\n-add job id to name of performance logs",
          "is_bot": false,
          "headline": "Add job id to name of performance logs (#217)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-22T17:58:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa2204229f537028bfcc9960356902a6a11c07e9",
          "body": "Rename the distribution (vivarium-validation), import path\n(vivarium.validation), and lib directory (libs/validation) per the decision to\ndrop the 'auto' qualifier. git mv preserves file history; also repoints the\nsetuptools_scm tag_regex, the .readthedocs.yaml paths, and the .github/labeler.yml\nglob/label to the new name.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rename package vivarium-auto-validation -> vivarium-validation",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a9a56df67338c57927d4749a9ecec55d8229f56",
          "body": null,
          "is_bot": false,
          "headline": "delete testing-utils jenkinsfile to stop running CI",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cbc43e60a0f6ac58b5160136c649d835dd37a57",
          "body": null,
          "is_bot": false,
          "headline": "minor changelog tweak",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f089ebf13e38235a450a2e301dde8a5572aa72d",
          "body": "- Drop scipy from core deps: it was inherited from vivarium-testing-utils where\n  it backed FuzzyChecker's beta fitting (now in vivarium-fuzzy-checker);\n  auto_validation imports no scipy.\n- Move matplotlib/ipython into the validation extra. They are imported\n  unconditionally by the feature (plotti\n[…]\nTML display) but were\n  declared only in docs, so pip install vivarium-auto-validation[validation]\n  could not import the package.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prune and correct auto-validation dependencies",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8a635aa6801456a2542a44566b05e2477c74d513",
          "body": "The list was inherited verbatim from vivarium-testing-utils, whose docs\nauto-documented an API; auto-validation's docs are narrative-only (no autodoc),\nso nitpicky mode emits no unresolved references and every entry was dead.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Trim copy-pasted nitpick-exceptions from auto-validation docs",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e4c3080195e3f278d9e79a7bbddca2adcd7e176b",
          "body": "… docs\n\n- Restore pyyaml to core dependencies (interface.py uses yaml.safe_load; it was\n  explicit in testing-utils and the split had been leaning on config-tree's\n  transitive copy).\n- Re-add numpy.seterr(all=\"raise\") in the package __init__, which auto_validation\n  previously inherited via vivariu\n[…]\n proportions\n  docs and fix a stale automated_validation comment; document why the test extra\n  depends on vivarium-testing-utils.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Address review: restore pyyaml + numpy.seterr, tighten smoke test and…",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b3873530d2d2e3b6143ab397ce64ec7914e6762d",
          "body": "automated_validation moved to vivarium-auto-validation, so drop the validation\nextra, the pandera dep + pandera.mypy plugin, the stale plot_utils mypy exclude\nand the now-unused mypy overrides, trim the dependency set to what the pytest\nplugin needs, and remove the automated_v_and_v docs toctree entry.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Strip automated-V&V from vivarium-testing-utils",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1af402067345ec6a78547a0d6d3abe95492ab09e",
          "body": "pyproject (test extra uses vivarium-testing-utils until the plugin is extracted;\nvalidation extra carries the artifactory-only deps), Makefile, Jenkinsfile,\nLICENSE, python_versions, README, CHANGELOG, docs, .readthedocs.yaml, and\npackage smoke tests. The moved automated_v_and_v doc drops the fuzzy-checking\nsection (now in vivarium-fuzzy-checker) + its figure/citation and cross-references\nfuzzy-checker instead.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add vivarium-auto-validation scaffolding and split the V&V docs",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3b68bb35900010346b02392f3091608f0858e328",
          "body": "Rewrite internal vivarium.testing_utils.automated_validation.* imports to\nvivarium.auto_validation.* (fuzzy imports already point at vivarium.fuzzy_checker\nfrom the earlier split); add the package __version__, py.typed, and __init__.py\nmarkers for the data_transformation/visualization subpackages.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adapt auto-validation imports and package markers",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db4e895175b22f4828ca4733e9dd78c435129c89",
          "body": "…re move)\n\nByte-identical relocation of the automated-V&V subtree (source, tests, docs) out\nof vivarium-testing-utils, renamed automated_validation -> auto_validation. No\ncontent changes - reviewers can skip this commit.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Move automated_validation into a vivarium-auto-validation package (pu…",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c2096024478d04229d091bf5a266104be680e0cb",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG.rst (#220)",
          "author_name": "Hussain Jafari",
          "author_login": "hussain-jafari",
          "committed_at": "2026-07-21T18:59:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb53920c21d36b0669e89f1185607dadba6c91e3",
          "body": null,
          "is_bot": false,
          "headline": "Reorganize fuzzy-checker and rename assert_proportion (#219)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-21T18:18:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58e626ffc410afd7ad7bc18cc8975d5496d9c65b",
          "body": "Category: CI/infrastructure\nJIRA issue: https://jira.ihme.washington.edu/browse/MIC-6034\n\nChanges and notes\nJenkins logged a spurious error — ERROR: Specified HTML directory '.../output/htmlcov_tests' does not exist — on every libs/* build. Root cause: the makefile only generates coverage when COV i\n[…]\ncribing the removal.\nCoverage opt-in machinery (pytest-cov, [tool.coverage], --cov plumbing) left intact, so no local coverage workflow is broken and no CI signal changes.\n🤖 Generated with Claude Code",
          "is_bot": false,
          "headline": "Stop test-coverage reporting in CI (#208)",
          "author_name": "Hussain Jafari",
          "author_login": "hussain-jafari",
          "committed_at": "2026-07-21T17:35:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e14275d412dda5af133b3d3ad3801e8b896ea6f",
          "body": "Albrja/mic-7309/Add pr labeler workflow\n\nAdd workflow to automatically label pull requests\n- *Category*: CI\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7309\n\nChanges and notes\n-add pr labeler workflow\n\nTesting\n<img width=\"1742\" height=\"606\" alt=\"image\" src=\"https://github.com/user-attachments/assets/610aa4a9-3f7f-47e9-a8e4-b634b80b223a\" />\n\nNote the Engine and Public-Health labels, and then the Public-Health update was removed, and the labels stay in sync.",
          "is_bot": false,
          "headline": "Albrja/mic-7309/Add pr labeler workflow (#212)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-20T21:40:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87a101d97f28c84df6f6544db79073ea7f229ff3",
          "body": null,
          "is_bot": false,
          "headline": "Move docs from testing-utils to fuzzy-checker (#216)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-20T20:02:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ceafea4457696bf118caec591d02365453e7ae1",
          "body": null,
          "is_bot": false,
          "headline": "Add .readthedocs.yaml for vivarium-fuzzy-checker (#215)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-20T17:56:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc53c0380d41c97447cfd21d4b3f5ae43e35ac68",
          "body": null,
          "is_bot": false,
          "headline": "Fix fuzzy-checker README underline to unblock the 0.1.0 release (#214)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-20T17:37:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdf6973e25aae327aa232f2286c7c664a6b33f8f",
          "body": null,
          "is_bot": false,
          "headline": "Extract FuzzyChecker into vivarium-fuzzy-checker (#211)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-20T17:14:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fbd0e6a601b8c5b0111cb75ea3896131a8aef7b",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG.rst",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-17T16:42:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57d1e0a8655b53d77ac34c9c044f08feb0e4108f",
          "body": "* Vectorize order-0 interpolation merge (MIC-7097)\n\nInterpolation.__call__ scaled linearly with the number of categorical\ngroups: it grouped the population by the key columns and ran one\npd.merge per group via Order0Interp (74 merges per lookup for 37\nsubnationals x 2 sexes; ~30% of runtime over a 4\n[…]\n(1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: Steve Bachmeier <23350991+stevebachmeier@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Vectorize order-0 interpolation merge (#194)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-17T16:42:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c19ec91b87daf6f634567e2914b928254210b2be",
          "body": "* Tighten the lookup-key contract; simplify validation (MIC-7097)\n\n- Raise at construction (validate=True) when the key columns (categorical\n  values plus bin starts) do not uniquely identify a data row, replacing\n  the silent first-row-wins behavior for duplicate rows in purely\n  categorical tables\n[…]\nctly from\n__init__.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Remove jira ticket mention\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tighten the lookup-key contract; simplify validation (#193)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-17T16:42:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ac7e96617ef3ccba40ad53a46fe410f55bc2b9eb",
          "body": "Introduce ContinuousParameter (name, start_column, end_column) and pass\nit everywhere the interpolation machinery previously re-derived edge\ncolumn names from base-name strings: Order0Interp, validate_parameters,\nvalidate_call_data, and check_data_complete (whose (name, start, end)\ntuple interface p\n[…]\n the\nLookupTableData type it guards; its consumers are the LookupTable input\ncontract (table.py, interface.py), not interpolation.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Represent continuous lookup parameters as records (MIC-7097) (#192)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-17T16:42:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd6f79576a791925ae3e2be50121db79477848f3",
          "body": "…n (MIC-7097)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add consolidated 5.5.0 changelog entry for interpolation vectorizatio…",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-17T16:42:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d177b0a1f8b97a0aad977f2ebffe63f6bcff6389",
          "body": "* Characterize order-0 lookup behavior (MIC-7097)\n\nTests-only: pin the observable behavior of the interpolation machinery\nahead of the MIC-7097 refactor stack, so later changes are reviewed\nagainst unchanged expectations. Adds multi-categorical selection, a\nshared-bin-edge fan-out guard, unknown-cat\n[…]\nngine unmodified.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Remove reference to 'Golden\"\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Characterize order-0 lookup behavior (#195)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-17T16:42:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a55838ddbee6dc7c27cb7b521233e9237309c922",
          "body": "* Add load_tmred/load_categories data-source normalizers (MIC-7071)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Route risk-effect data through config data_sources (MIC-7071)\n\nAdd tmred, relative_risk_scalar, and demographic_dimensions data sources to CausalFactorEffect (\n[…]\n.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Hussain Jafari <hjafari@uw.edu>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make VPH risk components artifact-less (MIC-7071) (#186)",
          "author_name": "Hussain Jafari",
          "author_login": "hussain-jafari",
          "committed_at": "2026-07-16T23:56:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0dc425e1d65b4af6ef2a589cc37de2b45add7668",
          "body": "* Remove redundant scenario re-filter in _get_combined_data (MIC-7214)\n\nScenario levels are filtered and dropped at bundle formatting\n(RatioMeasureDataBundle._get_formatted_datasets), so the re-filter in\nplot_utils._get_combined_data always raised KeyError: 'Level scenario not\nfound' for any compari\n[…]\n pushed commit failed with 'reference is not a tree' before\nSphinx ever ran).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove redundant scenario re-filter in plotting (#206)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-16T18:13:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "475b897914d2c1d997c8c521b3d34b949efc1234",
          "body": null,
          "is_bot": false,
          "headline": "stop xfailing now-passing tests (#209)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-16T17:33:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0dfff8b1275c94ad2be3b356ec18b017036925e9",
          "body": null,
          "is_bot": false,
          "headline": "Sbachmei/public health/mic 7283/fix hardcoded entity type (#205)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-16T17:31:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5d830ff41d461fde6ade92a152f849592492996",
          "body": "Albrja/mic 6867/change-population-events-order\n\nUpdate order in which population characteristics are updated\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-6867",
          "is_bot": false,
          "headline": "Albrja/mic 6867/change-population-events-order (#125)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-15T17:07:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43350455b3695eb57eea04f0f690b7c83f865d74",
          "body": "Albrja/mic 6867/observer priority\n\nAdd priority for observer and events\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-6867\n\nChanges and notes\n-support priority for observers",
          "is_bot": false,
          "headline": "Albrja/mic 6867/observer priority (#124)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-15T16:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b510b9e3ded0d8f085a1491caf4e676ae2fa4737",
          "body": "* Update stale references\n\n* Fix stale :mod:`vivarium` cross-refs in cluster-tools docstrings\n\nThe vivarium-engine RTD inventory doesn't include a bare 'vivarium' module\n(that path is now just the namespace-package __init__), so the two\n:mod:`vivarium` cross-refs failed docs-build. Point them at\n:mod:`vivarium.engine` where the target now lives.",
          "is_bot": false,
          "headline": "Update stale references (#204)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-14T23:48:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5749a7e6b4322bbf7de3ecd633bcb294a1c280e",
          "body": "…ms (MIC-7100) (#202)",
          "is_bot": false,
          "headline": "Remove pre-monorepo LayeredConfigTree + vivarium attribute-import shi…",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-14T22:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "246e0264de05fc2813cc4f3433b119cf8f5891df",
          "body": "Use fuzzy checker for stochastic proportion assertions\n\nUse FuzzyChecker in test suite for stochastic proportion assertions\n- *Category*: Test\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7274\n\nChanges and notes\n-use FuzzyChecker for stochastic proportion assertions\n-tighten deterministic assertions that cannot use FuzzyChecker",
          "is_bot": false,
          "headline": "Use fuzzy checker for stochastic proportion assertions (#197)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-13T22:11:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8728e0501e617bb7bc841289cf9474e04943222",
          "body": "The release workflow's detect job installs vivarium-build-utils with\n`uv pip install --system` to compute the dependency-ordered release\nmatrix, but had no Set up Python / Set up uv steps. uv therefore\ntargeted the runner's system interpreter at /usr, which is\nexternally-managed (PEP 668), and refus\n[…]\ne install targets\na managed toolcache interpreter. Latent until now because release.yml\nonly runs on release pushes, not on PR CI.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Set up managed Python in release detect job (#203)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-13T21:48:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b381d43d6a34ba1e5510ae60f354e9c0c5d947b",
          "body": "Skip validation of lookup data. Only do once\n\nSkip validation of lookup table data to speed up test suite\n- *Category*: Test\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7257\n\nChanges and notes\n-Skip per build validation of lookup data. \n-Add new test to validate mocked data once per session",
          "is_bot": false,
          "headline": "Skip validation of lookup data. Only do once (#196)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-13T21:42:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10f159be953d6a9736a917358fa335950dbf0439",
          "body": "* Add packaging and tomli runtime deps to vivarium-build-utils\n\nThe new vivarium.build_utils.dependencies module needs packaging\n(Requirement/SpecifierSet) and, on the 3.10 floor, the tomli tomllib backport.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Add vivarium.build_\n[…]\n order function; leverage graphlib\n\n* rename helper\n\n* change function name\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: Patrick Nast <pnast@uw.edu>",
          "is_bot": false,
          "headline": "Support atomic cross-package PRs against in-tree sibling versions (#152)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-13T21:23:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "245fe4ff78887fda62be702c5357325f3f42dc29",
          "body": "Albrja/feature/mic 7107/jobmon all artifacts\n\nUse Jobmon instead of drmaa to parallelize \"all\" location artifact building\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7107\n\nChanges and notes\n-use Jobmon to parallelize \"all\" artifact building by fanning out a workflow for each location\n\nTesting\n-successfully ran ``make_artifacts -vvv -l \"all\" -o ~/scartch ``",
          "is_bot": false,
          "headline": "Albrja/feature/mic 7107/jobmon all artifacts (#191)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-13T20:53:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b9c36fe11867f39f305f12105f9d8cec502f6cd",
          "body": null,
          "is_bot": false,
          "headline": "push back the test_get_skip_post_processor_deprecation date (#199)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-13T17:18:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d22214db8b3e61e38a01bdf2c013b2a185e90d5",
          "body": "Update mortality tests to use shared step fixture\n\nUpdate mortality tests to use shared step fixture\n- *Category*: Refactor/test\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7256\n\nChanges and notes\n-Update mortality tests to use shared step fixture",
          "is_bot": false,
          "headline": "Albrja/public-health/mic-7256/part-3 (#188)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-09T00:28:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c61dc0a3eac325d1286df55a80640b8b24390948",
          "body": "Albrja/public health/mic 7256/pt 2\n\nMore fixture taxonomy updates\n- *Category*: Refactor/test\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7256\n\nChanges and notes\n-more updates to use shared fixture InteractiveContext",
          "is_bot": false,
          "headline": "Albrja/public health/mic 7256/pt 2 (#187)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-08T23:58:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e1b703c706b454070e968aa0dc45f9890dab186",
          "body": "* Add shared README python-version sync tool (MIC-5670)\n\nDRY up the easylink-style README updater into vivarium-build-utils so each\nlib no longer copies its own update_readme.py.\n\n- Add vivarium.build_utils.readme module (stdlib-only): enumerated list,\n  \"requires Python X.Y+\" floor, and python=X.Y \n[…]\nminimal: README.rst only.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Update CHANGELOG.rst\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add shared README python-version sync tool (MIC-5670) (#185)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-08T23:05:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "319eaf8abb006eb780d2cc51c6b9e5d2781dcced",
          "body": "Albrja/public-health/fixture-taxonomy-pt1\n\nAdd shared InteractiveContext fixtures\n- *Category*: Test/Refactor\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7256\n\nChanges and notes\n-adds new InteractiveContext fixtures to share components to decrease runtime\n-update scope of fixtures to be more efficient",
          "is_bot": false,
          "headline": "Albrja/public-health/fixture-taxonomy-pt1 (#184)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-08T18:54:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "891cfb7105a41f46cba7eb79ddae1ff3f3c0db4c",
          "body": "Category: bugfix\nJIRA issue: https://jira.ihme.washington.edu/browse/MIC-7277\n\nChanges and notes\nMirrored distributions returned NaN for valid inputs because the computability window was in reflected space; this maps it back into data space via mirror_point - bound.\n\nTesting\nAdded test_mirrored_cdf_within_support_is_not_nan (parametrized over MirroredGumbel/MirroredGamma) is not NaN and equals 1 - underlying.cdf(mirror_point - x).\nExisting risk-distributions unit tests pass",
          "is_bot": false,
          "headline": "mirrored computability bounds bugfix (#176)",
          "author_name": "Hussain Jafari",
          "author_login": "hussain-jafari",
          "committed_at": "2026-07-08T18:35:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c859b932fd22fa8c8966c223ca6315a35fa659b7",
          "body": "Albrja/cluster-tools/bugfix/mic-7278/prevent-order-test-failures\n\nUpdate pandas and loguru fixtures to not leak state to later tests\n- *Category*: Bugfix\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7278\n\nChanges and notes\n-update pandas display settings to not leak to later tests\n-restore default loguru sink",
          "is_bot": false,
          "headline": "Albrja/cluster-tools/bugfix/mic-7278/prevent-order-test-failures (#177)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-07T16:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6d8c5291e116df0d958d5cfb5c0c3c8303a1fe2",
          "body": "* ai-tools: add model-development workflow (MIC-6986)\n\nAdd /viv:model-development, the model-repo sibling of\n/viv:framework-development: a staged artifact->component->observer build\ndriven from an iteration plan, with blind parallel InteractiveContext\nverification, simulation-based checks, _review-c\n[…]\nranged up front rather than discovered mid-build.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add model-development workflow (MIC-6986) (#137)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-06T19:43:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66246238e340b98f8d4c8f07c673d7a29e0ff7bf",
          "body": "## Pin Vivarium Inputs to be compatible with monorepo\n\nChanges and notes\nPin Vivarium Inputs to be compatible with monorepo",
          "is_bot": false,
          "headline": "Pin Vivarium Inputs to be compatible with monorepo (#183)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-06T19:36:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32e04d64fdf98603f6b217902486d28c9996185a",
          "body": "* Add PyPI classifiers to lib pyproject.toml files\n\nWhen migrating from per-repo setup.py to the monorepo pyproject.toml, the\ntrove classifiers were not carried over. Restore them per lib, adapted\nfrom each library's pre-migration setup.py, with the license classifier\ncorrected to BSD-3-Clause (seve\n[…]\n 4.2.8 -> 4.2.9\n- profiling:      0.4.18 -> 0.5.1\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add PyPI classifiers to lib pyproject.toml files (#154)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-07-06T19:10:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6265d9b8f77f0367d2ee0372b613dd8320052a55",
          "body": "…r with xdist\n\nAlbrja/testing-tuils/bugfix/prevent-malformed-data-with-ordering\n\nMore updates to prevent future CI failures from test ordering with xdist\n- *Category*: Bugfix\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7278",
          "is_bot": false,
          "headline": "Albrja/testing-tuils/bugfix/prevent-malformed-data-with-ordering (#175)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-02T22:38:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5994fa093023cb87dd7e5413443140cd0472076e",
          "body": "…0) (#182)",
          "is_bot": false,
          "headline": "Delete libs/compat from monorepo, drop profiling runtime dep (MIC-710…",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-02T22:14:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "718dc75232003347a5817bd117133830bcc06003",
          "body": "…C-7100) (#181)",
          "is_bot": false,
          "headline": "Deprecate vivarium-compat: gut import hook, add retirement banner (MI…",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-02T22:09:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0682a1d3151bae5ac5ae5410efdd19ae76abd976",
          "body": "Albrja/bugfix/test-ordering-malformation\n\nClear context to prevent test failure on ordering\n- *Category*: Bugfix\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7278\n\nChanges and notes\n-clear simulation context",
          "is_bot": false,
          "headline": "Albrja/bugfix/test-ordering-malformation (#174)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-02T20:06:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53217794be0a3d2e3db9d2eafa9e930d0bf640a6",
          "body": null,
          "is_bot": false,
          "headline": "Sbachmei/build utils/mic 7086/leverage make targets (#173)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-07-01T21:51:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a269051080fa677e1b6008ed2232c5758f4866f",
          "body": "Albrja/build-utils/mic-7854/Only use pip cache on push/PR\n\nOnly use pip cache on push/pr \n- *Category*: Build\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-6854\n\nChanges and notes\n-update builds to only use pip cache on push/pr",
          "is_bot": false,
          "headline": "Albrja/build-utils/mic-6854/Only use pip cache on push/PR (#172)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-01T20:22:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b06329118069cebb273dcd0594a7ee63b9418d1",
          "body": "Albrja/public-health/mic-7255/Reduce pop size in tests\n\nReduce population size in test suites to improve runtime\n- *Category*: Test\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7255\n\nChanges and notes\n-Reduce population size in test suites to improve runtime",
          "is_bot": false,
          "headline": "Albrja/public-health/mic-7255/Reduce pop size in tests (#170)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-07-01T17:11:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af2c4b7721686229c47418669fb34d1a4bb2cb5e",
          "body": "Fix order dependent test fixtures\n\nFix order dependent test fixtures causes results to not be reproduced\n- *Category*: Bugfix\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-XYZ\n\nChanges and notes\n-Fix order dependent test fixtures",
          "is_bot": false,
          "headline": "Fix order dependent test fixtures (#165)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-30T22:58:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06720bb7f8f531e80f8e3210ad2f9020d1e7654c",
          "body": null,
          "is_bot": false,
          "headline": "Isolate cluster-tools mkdir test with tmp_path (#171)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-30T22:19:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8fedcdf45dd9daa3588dfdfa0fcfd75ae353191",
          "body": "Category: feature\nJIRA issue: https://jira.ihme.washington.edu/browse/MIC-7116\n\nChanges and notes\nFeature: LookupTable accepts DataFrame/Series with lookup attributes on the row index.\nAPI: LookupTable.value_columns is now a pandas.Index (was list[str]).\nAPI: Interpolation.__init__ infers parameter \n[…]\nDeprecation: passing a flat DataFrame to build_table/set_data is deprecated.\nDeprecation: passing a Mapping to build_table/set_data is deprecated.\n\nTesting\nAdded/updated unit tests for indexed inputs.",
          "is_bot": false,
          "headline": "lookup table multiindex (#110)",
          "author_name": "Rajan Mudambi",
          "author_login": "rmudambi",
          "committed_at": "2026-06-30T21:34:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d883f45f3262da4c3379db416c008882c5eb768d",
          "body": null,
          "is_bot": false,
          "headline": "Add support for no artifactory access in 'make build-env' (#162)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-30T19:37:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40fc585814432a46dae506c97a14ce90d7bc0fb5",
          "body": null,
          "is_bot": false,
          "headline": "Remove pytest-xdist as pytest dependency (#169)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-30T19:14:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c34198c5a3db3bf95f51c5ab0c6a16d158a8f888",
          "body": null,
          "is_bot": false,
          "headline": "Include pytest-xdist in pytest group (#168)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-30T19:08:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e774edc2fa26475c330773ffa9b4bb9c59050562",
          "body": "* ai-tools: fix doc drift found by /viv:repo-maintenance (MIC-7128)\n\nAudit of the ai-tools plugin docs and the root CLAUDE.md against their\nupstreams surfaced five stale references; correct them:\n\n- continuous-integration: GH runners install vivarium-build-utils from\n  PyPI, not git (build-utils its\n[…]\nRead the Docs API version\n\nBump ai-tools to 0.22.1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n* Update CHANGELOG.rst\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix doc drift found by /viv:repo-maintenance (MIC-7128) (#164)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-06-30T18:14:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91cbd98744b1d7d2e3a050a22f2111402369d0c7",
          "body": "* Add confidence scoring and Sonnet review agents\n\nAdapt Anthropic's official code-review plugin into viv:code-reviewer:\n\n- Run the five _review_* lenses on Sonnet (model: sonnet).\n- Add a Haiku _review_scorer sub-agent that independently scores each\n  finding 0-100 against a verbatim rubric, judgin\n[…]\n\n\nMIC-7262\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Update CHANGELOG for version 0.22.1\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add confidence scoring and Sonnet review agents (#156)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-06-30T17:05:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64eb00952ec31e617e76eb1231f5feb2067e56af",
          "body": "Albrja/build utils/mic 7254/turn cov off\n\nTurn on n auto and turn off coverage for test step of CI\n- *Category*: CI\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7254\n\nChanges and notes\n-turns --cov off to save runtime\n-enables n auto from pytest plugin",
          "is_bot": false,
          "headline": "Albrja/build utils/mic 7254/turn cov off, enable n auto (#158)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T23:25:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "454001730a8bc23736df4b397abff66b591a8050",
          "body": "Albrja/testing-utils/mic-7253Update xdist plugin behavior\n\nUpdate xdist plugin default behavior\n- *Category*: <!-- one of bugfix, feature, refactor, POC, CI/infrastructure, documentation, \n                   revert, test, release, other/misc -->\n- *JIRA issue*: https://jira.ihme.washington.edu/brows\n[…]\ndds a `pytest_report_header` line reporting the resolved worker\n  count and the CPU/memory it was derived from, so the decision is auditable in CI\n  logs (xdist still prints the actual spawned count).",
          "is_bot": false,
          "headline": "Albrja/testing-utils/mic-7253Update xdist plugin behavior (#155)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T23:14:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90d53f7293c728d7480e9b97bc67eaeb9e0d4e3c",
          "body": null,
          "is_bot": false,
          "headline": "Changelog",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7807dca567f710af9a0e7044335b6fff094bf8e4",
          "body": "albrja/public-health/mic-7234/microdata-closed-cohort\n\nAdd implementation for single sample closed cohort feature of Microdata Observer\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7234\n\nChanges and notes\n-add single random sample for closed cohort",
          "is_bot": false,
          "headline": "albrja/public-health/mic-7234/microdata-closed-cohort (#148)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1196403fb85197a78f27137a36f39892feb4050c",
          "body": "Albrja/feature/mic 7064/microdata obs configuration\n\nConfiguration capabilities for Microdata Observer\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7064\n\nChanges and notes\n-add configuration for row filters\n-add configuration for row limit\n-add configuration for time step filtering",
          "is_bot": false,
          "headline": "Albrja/feature/mic 7064/microdata obs configuration (#140)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4d94543e29cf7e04906a99e2bd4d1a1da697499",
          "body": null,
          "is_bot": false,
          "headline": "Add tutorial",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1162375d557e507df022c4abb08c9ed36b7431e",
          "body": null,
          "is_bot": false,
          "headline": "Address pr comments",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8aac8896c5a0b8cf18a3307e3aa3c336f73bb3f",
          "body": null,
          "is_bot": false,
          "headline": "Revert change",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebfd9721d8d3fe2a859bc2e4bb77fcaf471a7688",
          "body": null,
          "is_bot": false,
          "headline": "Remove MicrodataCode from Engine",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a45630742a899ee8526d6db03510f486cd427dcc",
          "body": null,
          "is_bot": false,
          "headline": "Move Microdata Observer to public-health lib",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25ebf13f8eeb3a67f7083bb5e7b730b63aeb07af",
          "body": null,
          "is_bot": false,
          "headline": "Update implementation for column filtering",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ac6576354a63809620571b67e7cf493cde7cbd8",
          "body": null,
          "is_bot": false,
          "headline": "Implementation of Microdata Observer",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1560d1e7e4c14cc87d42eae49e9d3d28d0904f78",
          "body": null,
          "is_bot": false,
          "headline": "Stubs and xfail tests for Microdata Observer",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T22:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec4dac58fca7ff6297718f05114d77ff0ecc5cf2",
          "body": "Albrja/mic-7064/Support callable and tuple(str, callable) for population filter\n\n\nSupport callable and tuple(str, callable) for population filter\n- *Category*: Feature\n- *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-7064\n\nChanges and notes\n-Support callable and tuple(str, callable) for population filter",
          "is_bot": false,
          "headline": "Support callable and tuple(str, callable) for population filter (#139)",
          "author_name": "Jim Albright",
          "author_login": "albrja",
          "committed_at": "2026-06-29T20:01:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1b4145df11721826b775f64de12ad626301a072",
          "body": "Category: feature\n\nChanges and notes\nApply the calibration constant (PAF) via a value attribute modifier instead of a pipeline post-processor\nRaise a descriptive ValueError when combining calibration constants (PAFs) produces NaNs\nBugfix: build the CausalFactorEffect.get_filtered_data target mask as\n[…]\nionEffect.get_name and risk/intervention properties\n\nTesting\nRan NO pregnancy, NO child, and MNNCH models and checked that results were identical to previous runs for a given draw, seed, and scenario.",
          "is_bot": false,
          "headline": "VPH 6.2 calibration constant updates (#161)",
          "author_name": "Hussain Jafari",
          "author_login": "hussain-jafari",
          "committed_at": "2026-06-29T19:29:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d92da378bd741afb58c34421ffcdc6ff5e5fc7f5",
          "body": null,
          "is_bot": false,
          "headline": "use the newly-released mypy-if-typed target in cy.yml (#160)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-29T18:03:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71806e15b9c61abccd14565a2700cb6199f8dd02",
          "body": null,
          "is_bot": false,
          "headline": "Gate Jenkins mypy on py.typed marker (#159)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-29T17:35:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9786dcf9a8f023e9a52cb12ab5128d1618d2c1bd",
          "body": "Category: feature\n\nChanges and notes\nAllow RiskAttributableDisease to pass \"distribution\" data through configuration defaults.\nUpdate docs tutorial to not use an artifact.\n\nTesting\nRan pytest and built docs.",
          "is_bot": false,
          "headline": "artifactless disease components (#145)",
          "author_name": "Hussain Jafari",
          "author_login": "hussain-jafari",
          "committed_at": "2026-06-29T15:43:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "056e3e774d35779f792e5792bc95bc00e38465b8",
          "body": "* Add change-propagation skill and _propagate_target worker\n\nAdd an agentic workflow that propagates an adapted copy of a reference\nfile/directory across several targets (monorepo libs and/or external\nrepos) in parallel, then files one draft PR per repo.\n\n- skills/change-propagation/SKILL.md: the le\n[…]\n<130876799+patricktnast@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>\nCo-authored-by: Steve Bachmeier <23350991+stevebachmeier@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Add change-propagation skill and worker agent (#142)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-06-25T21:36:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66cc87158489a5214edee00aafa607b7487b8522",
          "body": "* ai-tools: stub workflow-assessment skill and _trace_extractor contract (MIC-6988)\n\nBody-less baseline for the assessment tool: frontmatter and section\nintents only. Content lands in follow-up commits.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* ai-tools: add workflow-assessment skil\n[…]\nde Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* Update CHANGELOG.rst\n\n* Update tools/ai-tools/skills/workflow-assessment/SKILL.md\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add workflow-assessment skill and trace extractor (#119)",
          "author_name": "Patrick Nast",
          "author_login": "patricktnast",
          "committed_at": "2026-06-25T16:50:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87bdcd5853dc62aff705bca8643194091d60e8fd",
          "body": "* Add support for 'pytest --runslow'\n\n* Add --runweekly support; code reviewer updates",
          "is_bot": false,
          "headline": "Add support for 'pytest --runslow' (#151)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-24T16:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b069a99f43b2841c7fc6829dff8045c7a0c8ac3",
          "body": null,
          "is_bot": false,
          "headline": "Fix getting vbu version when self-boostrapping (#149)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-23T22:36:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2eb4cec852c92e5e001ef744224a6bc9299c76ff",
          "body": null,
          "is_bot": false,
          "headline": "Enforce a fixed central performance log schema (#144)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-23T21:03:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d918e94bee07186af98613c1ca21c54a26dbb0d1",
          "body": null,
          "is_bot": false,
          "headline": "git fetch --unshallow in readthedocs (#150)",
          "author_name": "Steve Bachmeier",
          "author_login": "stevebachmeier",
          "committed_at": "2026-06-23T20:56:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 915,
      "latest_release_at": "2026-07-23T23:07:18Z",
      "latest_release_tag": "vivarium-fuzzy-checker-v0.2.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 52,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "vivarium-engine",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Education",
            "Topic :: Scientific/Engineering",
            "Topic :: Scientific/Engineering :: Artificial Life",
            "Topic :: Scientific/Engineering :: Mathematics",
            "Topic :: Scientific/Engineering :: Medical Science Apps.",
            "Topic :: Scientific/Engineering :: Physics",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vivarium-engine/",
          "is_deprecated": false,
          "latest_version": "5.5.3",
          "repository_url": "https://github.com/ihmeuw/vivarium-suite/tree/main/libs/engine",
          "versions_count": 25,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-05-22T18:27:00.858035Z",
          "latest_published_at": "2026-07-23T23:08:11.133592Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "vivarium-artifact",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Education",
            "Topic :: Scientific/Engineering",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vivarium-artifact/",
          "is_deprecated": false,
          "latest_version": "1.0.8",
          "repository_url": "https://github.com/ihmeuw/vivarium-suite/tree/main/libs/artifact",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-05-20T20:29:46.374732Z",
          "latest_published_at": "2026-07-23T23:07:01.983412Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "vivarium-profiling",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Education",
            "Topic :: Scientific/Engineering",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": null,
          "registry_url": "https://pypi.org/project/vivarium-profiling/",
          "is_deprecated": false,
          "latest_version": "0.5.3",
          "repository_url": null,
          "versions_count": 22,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-05-11T21:05:12.163572Z",
          "latest_published_at": "2026-07-16T17:34:28.432309Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 7
        },
        {
          "name": "vivarium-validation",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Education",
            "Topic :: Scientific/Engineering",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vivarium-validation/",
          "is_deprecated": false,
          "latest_version": "0.1.2",
          "repository_url": "https://github.com/ihmeuw/vivarium-suite/tree/main/libs/validation",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-07-21T20:07:35.981692Z",
          "latest_published_at": "2026-07-23T23:08:04.033450Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "vivarium-build-utils",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Software Development :: Build Tools",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vivarium-build-utils/",
          "is_deprecated": false,
          "latest_version": "4.4.2",
          "repository_url": "https://github.com/ihmeuw/vivarium-suite/tree/main/libs/build-utils",
          "versions_count": 65,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2025-07-08T16:53:27.645033Z",
          "latest_published_at": "2026-07-23T23:06:08.761032Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "vivarium-config-tree",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vivarium-config-tree/",
          "is_deprecated": false,
          "latest_version": "5.0.12",
          "repository_url": "https://github.com/ihmeuw/vivarium-suite/tree/main/libs/config-tree",
          "versions_count": 13,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-05-14T20:11:59.113786Z",
          "latest_published_at": "2026-07-23T23:06:50.250591Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "vivarium-gbd-mapping",
          "exists": true,
          "license": "BSD 3-Clause",
          "keywords": [
            "Intended Audience :: Developers",
            "Intended Audience :: Education",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: BSD License",
            "Natural Language :: English",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX",
            "Operating System :: POSIX :: BSD",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python",
            "Programming Language :: Python :: Implementation :: CPython",
            "Topic :: Education",
            "Topic :: Scientific/Engineering",
            "Topic :: Scientific/Engineering :: Medical Science Apps.",
            "Topic :: Software Development :: Libraries"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/vivarium-gbd-mapping/",
          "is_deprecated": false,
          "latest_version": "6.0.7",
          "repository_url": "https://github.com/ihmeuw/vivarium-suite/tree/main/libs/gbd-mapping",
          "versions_count": 8,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-05-19T19:47:00.018560Z",
          "latest_published_at": "2026-07-23T23:07:00.811720Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "vivarium-dependencies",
          "exists": true,
          "license": "BSD-3-Clause",
          "keywords": [],
          "ecosystem": "pypi",
          "matches_repo": null,
          "registry_url": "https://pypi.org/project/vivarium-dependencies/",
          "is_deprecated": false,
          "latest_version": "1.2.4",
          "repository_url": null,
          "versions_count": 17,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2025-07-30T16:54:23.390442Z",
          "latest_published_at": "2026-07-14T23:49:52.077307Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 10
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "libs/artifact/Makefile",
        "libs/artifact/docs/Makefile",
        "libs/build-utils/Makefile",
        "libs/cluster-tools/Makefile",
        "libs/cluster-tools/docs/Makefile",
        "libs/config-tree/Makefile",
        "libs/config-tree/docs/Makefile",
        "libs/dependencies/Makefile",
        "libs/engine/Makefile",
        "libs/engine/docs/Makefile",
        "libs/fuzzy-checker/Makefile",
        "libs/fuzzy-checker/docs/Makefile",
        "libs/gbd-mapping/Makefile",
        "libs/gbd-mapping/docs/Makefile",
        "libs/profiling/Makefile",
        "libs/public-health/Makefile",
        "libs/public-health/docs/Makefile",
        "libs/pytest-vivarium/Makefile",
        "libs/pytest-vivarium/docs/Makefile",
        "libs/risk-distributions/Makefile",
        "libs/risk-distributions/docs/Makefile",
        "libs/validation/Makefile",
        "libs/validation/docs/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "libs/artifact/src/vivarium/artifact/py.typed",
        "libs/cluster-tools/src/vivarium/cluster_tools/py.typed",
        "libs/config-tree/src/vivarium/config_tree/py.typed",
        "libs/engine/src/vivarium/engine/py.typed",
        "libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed",
        "libs/pytest-vivarium/src/pytest_vivarium/py.typed",
        "libs/risk-distributions/src/vivarium/risk_distributions/py.typed",
        "libs/validation/src/vivarium/validation/py.typed"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 903070,
      "source_files_sampled": 485,
      "oversized_source_files": 7,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6633
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/artifact/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/artifact/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "packaging",
          "manifest": "libs/build-utils/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "tomli",
          "manifest": "libs/build-utils/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/cluster-tools/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/cluster-tools/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-engine",
          "manifest": "libs/cluster-tools/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.1.0"
        },
        {
          "name": "vivarium-config-tree",
          "manifest": "libs/cluster-tools/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0.0"
        },
        {
          "name": "dill",
          "manifest": "libs/cluster-tools/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "psutil",
          "manifest": "libs/cluster-tools/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/config-tree/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/config-tree/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-artifact",
          "manifest": "libs/engine/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.2"
        },
        {
          "name": "vivarium-config-tree",
          "manifest": "libs/engine/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/engine/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/engine/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "dill",
          "manifest": "libs/engine/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/fuzzy-checker/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/fuzzy-checker/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/gbd-mapping/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/gbd-mapping/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "pyyaml",
          "manifest": "libs/gbd-mapping/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-gbd-mapping",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.0"
        },
        {
          "name": "vivarium-engine",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.1.0"
        },
        {
          "name": "vivarium-public-health",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.0"
        },
        {
          "name": "vivarium-config-tree",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0.1"
        },
        {
          "name": "jinja2",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pyyaml",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "memory-profiler",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "matplotlib",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "seaborn",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "scalene",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "nbformat",
          "manifest": "libs/profiling/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0"
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/public-health/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/public-health/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-engine",
          "manifest": "libs/public-health/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.2.0"
        },
        {
          "name": "vivarium-config-tree",
          "manifest": "libs/public-health/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0.0"
        },
        {
          "name": "vivarium-risk-distributions",
          "manifest": "libs/public-health/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.0,<4.0.0"
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/pytest-vivarium/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/pytest-vivarium/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-config-tree",
          "manifest": "libs/pytest-vivarium/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/risk-distributions/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/risk-distributions/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-dependencies",
          "manifest": "libs/validation/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-build-utils",
          "manifest": "libs/validation/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.0.0,<5.0.0"
        },
        {
          "name": "vivarium-config-tree",
          "manifest": "libs/validation/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "vivarium-fuzzy-checker",
          "manifest": "libs/validation/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 10,
        "merged_prs": 194,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 26
      },
      "bus_factor": 3,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "stevebachmeier",
          "commits": 760,
          "avatar_url": "https://avatars.githubusercontent.com/u/23350991?v=4"
        },
        {
          "type": "User",
          "login": "jehmumford",
          "commits": 749,
          "avatar_url": "https://avatars.githubusercontent.com/u/17072425?v=4"
        },
        {
          "type": "User",
          "login": "rmudambi",
          "commits": 517,
          "avatar_url": "https://avatars.githubusercontent.com/u/11376379?v=4"
        },
        {
          "type": "User",
          "login": "patricktnast",
          "commits": 399,
          "avatar_url": "https://avatars.githubusercontent.com/u/130876799?v=4"
        },
        {
          "type": "User",
          "login": "albrja",
          "commits": 383,
          "avatar_url": "https://avatars.githubusercontent.com/u/37345113?v=4"
        },
        {
          "type": "User",
          "login": "KjellSwedin",
          "commits": 170,
          "avatar_url": "https://avatars.githubusercontent.com/u/4910318?v=4"
        },
        {
          "type": "User",
          "login": "kfwilson",
          "commits": 120,
          "avatar_url": "https://avatars.githubusercontent.com/u/33732724?v=4"
        },
        {
          "type": "User",
          "login": "aflaxman",
          "commits": 114,
          "avatar_url": "https://avatars.githubusercontent.com/u/51236?v=4"
        },
        {
          "type": "User",
          "login": "mattkappel",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/13937263?v=4"
        },
        {
          "type": "User",
          "login": "hussain-jafari",
          "commits": 91,
          "avatar_url": "https://avatars.githubusercontent.com/u/25186372?v=4"
        }
      ],
      "contributors_sampled": 21,
      "top_contributor_share": 0.215
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "labeler.yml",
        "release-ai-tools.yml",
        "release.yml",
        "update-readme.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 5,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 7,
            "reason": "Found 8/11 approved changesets -- score normalized to 7",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 6 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cb6bec6a3edb20fa76fadbcc280cb4ad346e46de",
        "ran_at": "2026-07-23T23:08:35Z",
        "aggregate_score": 4.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-23T23:05:17Z",
      "oldest_open_prs": [
        {
          "number": 153,
          "created_at": "2026-06-24T20:39:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 190,
          "created_at": "2026-07-08T20:31:31Z",
          "last_comment_at": "2026-07-08T20:32:46Z",
          "last_comment_author": "hussain-jafari"
        },
        {
          "number": 207,
          "created_at": "2026-07-15T21:04:25Z",
          "last_comment_at": "2026-07-21T20:51:24Z",
          "last_comment_author": "patricktnast"
        },
        {
          "number": 221,
          "created_at": "2026-07-21T20:59:51Z",
          "last_comment_at": "2026-07-23T14:51:45Z",
          "last_comment_author": "albrja"
        },
        {
          "number": 225,
          "created_at": "2026-07-23T17:06:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 226,
          "created_at": "2026-07-23T17:24:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 227,
          "created_at": "2026-07-23T17:34:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 228,
          "created_at": "2026-07-23T17:36:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 229,
          "created_at": "2026-07-23T17:44:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 230,
          "created_at": "2026-07-23T19:33:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-23T23:04:57Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ihmeuw/vivarium-suite",
    "host": "github.com",
    "name": "vivarium-suite",
    "owner": "ihmeuw"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 67,
      "inputs": {
        "security": 48,
        "vitality": 94,
        "community": 36,
        "governance": 82,
        "engineering": 61
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 94,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "commits_last_year": 915,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 52
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "52/52 weeks with commits",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 52
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "915 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 915
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "vivarium-fuzzy-checker-v0.2.1",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 36,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (BSD-3-Clause)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "BSD-3-Clause"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 82,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "good",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "bus_factor": 3,
              "contributors_sampled": 21,
              "top_contributor_share": 0.215
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "3 contributor(s) cover half of all commits",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 22% of commits",
                "points": 17.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 22
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "21 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 83,
            "inputs": {
              "merged_prs": 194,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 26
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "194/220 decided PRs merged",
                "points": 33.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 194,
                      "decided": 220
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 8/11 approved changesets -- score normalized to 7",
                "points": 10.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "followers": 170,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "ihmeuw",
              "public_repos": 203,
              "account_age_days": 4789
            },
            "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": "170 followers of ihmeuw",
                "points": 16.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 170,
                      "login": "ihmeuw"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "203 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 203
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "vivarium-engine",
                "vivarium-artifact",
                "vivarium-profiling",
                "vivarium-validation",
                "vivarium-build-utils",
                "vivarium-config-tree",
                "vivarium-gbd-mapping",
                "vivarium-dependencies"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "8 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 8,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "65 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 65
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 61,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 8/11 approved changesets -- score normalized to 7",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 5
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 68,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.82,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6633
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "82 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 82,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "libs/artifact/Makefile",
                "libs/artifact/docs/Makefile",
                "libs/build-utils/Makefile",
                "libs/cluster-tools/Makefile",
                "libs/cluster-tools/docs/Makefile",
                "libs/config-tree/Makefile",
                "libs/config-tree/docs/Makefile",
                "libs/dependencies/Makefile",
                "libs/engine/Makefile",
                "libs/engine/docs/Makefile",
                "libs/fuzzy-checker/Makefile",
                "libs/fuzzy-checker/docs/Makefile",
                "libs/gbd-mapping/Makefile",
                "libs/gbd-mapping/docs/Makefile",
                "libs/profiling/Makefile",
                "libs/public-health/Makefile",
                "libs/public-health/docs/Makefile",
                "libs/pytest-vivarium/Makefile",
                "libs/pytest-vivarium/docs/Makefile",
                "libs/risk-distributions/Makefile",
                "libs/risk-distributions/docs/Makefile",
                "libs/validation/Makefile",
                "libs/validation/docs/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "libs/artifact/src/vivarium/artifact/py.typed",
                "libs/cluster-tools/src/vivarium/cluster_tools/py.typed",
                "libs/config-tree/src/vivarium/config_tree/py.typed",
                "libs/engine/src/vivarium/engine/py.typed",
                "libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed",
                "libs/pytest-vivarium/src/pytest_vivarium/py.typed",
                "libs/risk-distributions/src/vivarium/risk_distributions/py.typed",
                "libs/validation/src/vivarium/validation/py.typed"
              ],
              "agent_commit_share": 0.33,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "libs/artifact/Makefile, libs/artifact/docs/Makefile, libs/build-utils/Makefile, libs/cluster-tools/Makefile, libs/cluster-tools/docs/Makefile, libs/config-tree/Makefile, libs/config-tree/docs/Makefile, libs/dependencies/Makefile, libs/engine/Makefile, libs/engine/docs/Makefile, libs/fuzzy-checker/Makefile, libs/fuzzy-checker/docs/Makefile, libs/gbd-mapping/Makefile, libs/gbd-mapping/docs/Makefile, libs/profiling/Makefile, libs/public-health/Makefile, libs/public-health/docs/Makefile, libs/pytest-vivarium/Makefile, libs/pytest-vivarium/docs/Makefile, libs/risk-distributions/Makefile, libs/risk-distributions/docs/Makefile, libs/validation/Makefile, libs/validation/docs/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "libs/artifact/Makefile, libs/artifact/docs/Makefile, libs/build-utils/Makefile, libs/cluster-tools/Makefile, libs/cluster-tools/docs/Makefile, libs/config-tree/Makefile, libs/config-tree/docs/Makefile, libs/dependencies/Makefile, libs/engine/Makefile, libs/engine/docs/Makefile, libs/fuzzy-checker/Makefile, libs/fuzzy-checker/docs/Makefile, libs/gbd-mapping/Makefile, libs/gbd-mapping/docs/Makefile, libs/profiling/Makefile, libs/public-health/Makefile, libs/public-health/docs/Makefile, libs/pytest-vivarium/Makefile, libs/pytest-vivarium/docs/Makefile, libs/risk-distributions/Makefile, libs/risk-distributions/docs/Makefile, libs/validation/Makefile, libs/validation/docs/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "libs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "libs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed"
                    }
                  }
                ],
                "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": "33 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 33,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 903070,
              "source_files_sampled": 485,
              "oversized_source_files": 7
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (libs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "libs/artifact/src/vivarium/artifact/py.typed, libs/cluster-tools/src/vivarium/cluster_tools/py.typed, libs/config-tree/src/vivarium/config_tree/py.typed, libs/engine/src/vivarium/engine/py.typed, libs/fuzzy-checker/src/vivarium/fuzzy_checker/py.typed, libs/pytest-vivarium/src/pytest_vivarium/py.typed, libs/risk-distributions/src/vivarium/risk_distributions/py.typed, libs/validation/src/vivarium/validation/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "7/485 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 485,
                      "oversized": 7
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "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": "examples, notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, 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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:vivarium-engine@5.5.3; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T23:09:00.158533Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/ihmeuw/vivarium-suite.svg",
  "full_name": "ihmeuw/vivarium-suite",
  "license_state": "standard",
  "license_spdx": "BSD-3-Clause"
}

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

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

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