Registro público
Informe de salud del softwareesquema 0.25.0 · métricas 1.13.0 · 2026-07-21 22:52 UTC

EpsilabAI / epsilab-python

The official Python library for the Epsilab API

PythonApache-2.0★ 0 estrellas⑂ 1 forkdesde sept 2025Ver en GitHub ↗

EpsilabAI/epsilab-python tiene un índice de salud de 55 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (75/100) y la más baja, Community & Adoption (32/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

55
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

EpsilabOrganización
1 seguidor1 repositorio públicodesde jun 2025

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIepsilab0.17.17270641hace 0 díasaievaluationfine-tuningllmmarketplacerl-environmentstraining-data

Métricas por categoría

Vitalidad

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

75Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
4.2/36Cadencia de commits — 6/52 semanas con commits
16.6/18Volumen de commits — 69 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year69
human_commit_share1
days_since_last_push0
active_weeks_last_year6
Cómo se puntúa
16.2/27Publica versiones — 42 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~0,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count42
latest_release_tagv0.17.17
releases_from_tags
days_since_latest_release0
mean_days_between_releases0,4
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?

32En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars0
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 (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
45.8/80Descargas mensuales — 2706 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesepsilab
dependents
ecosystemspypi
total_downloads
monthly_downloads2706
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

52Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.6/22.5Distribución de commits — el principal contribuyente firma el 98% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,975
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 1/1 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 1/29 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs1
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
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
2.2/25Alcance del propietario — 1 seguidores de EpsilabAI
4.4/25Trayectoria — 1 repos públicos, cuenta de ~1 años
Datos de entrada utilizados
followers1
owner_typeOrganization
is_verified
owner_loginEpsilabAI
public_repos1
account_age_days396
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 41 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesepsilab
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 — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://epsilab.com/
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepagehttps://epsilab.com/
has_readme
has_docs_dir
has_description

Seguridad

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

50Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/29 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
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
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
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
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,9
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.

41En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
37.1/40Historial de commits legible — 55 de 79 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,696
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — epsilab/py.typed
0/10Entorno reproducible
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 79
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_files
has_devcontainerno
has_linter_configno
typecheck_configsepsilab/py.typed
agent_commit_share0
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 (epsilab/py.typed)
43.4/55Tamaños de archivo manejables — 4/19 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes200.365
source_files_sampled19
oversized_source_files4
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:epsilab@0.17.17; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.9 / 10
4.9agregado

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-21 22:52 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/29 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
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
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 2
RegistroPaqueteRestricción de versiónManifiesto
PyPIhttpx>=0.27.0pyproject.toml
PyPIpython-dotenv>=1.0.1pyproject.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": 491,
      "has_wiki": false,
      "homepage": "https://epsilab.com/",
      "languages": {
        "Python": 700130
      },
      "pushed_at": "2026-07-21T21:54:22Z",
      "created_at": "2025-09-10T13:35:24Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T21:54:27Z",
      "description": "The official Python library for the Epsilab API",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "epsilab.com",
      "name": "Epsilab",
      "type": "Organization",
      "login": "EpsilabAI",
      "company": null,
      "location": "United States of America",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/217142952?v=4",
      "created_at": "2025-06-20T03:22:52Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 396
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.17.17",
          "kind": "patch",
          "published_at": "2026-07-21T21:54:20Z"
        },
        {
          "tag": "v0.17.16",
          "kind": "patch",
          "published_at": "2026-07-21T20:23:04Z"
        },
        {
          "tag": "v0.17.15",
          "kind": "patch",
          "published_at": "2026-07-21T18:09:29Z"
        },
        {
          "tag": "v0.17.14",
          "kind": "patch",
          "published_at": "2026-07-21T01:48:28Z"
        },
        {
          "tag": "v0.17.13",
          "kind": "patch",
          "published_at": "2026-07-20T06:44:13Z"
        },
        {
          "tag": "v0.17.12",
          "kind": "patch",
          "published_at": "2026-07-20T04:34:50Z"
        },
        {
          "tag": "v0.17.11",
          "kind": "patch",
          "published_at": "2026-07-19T17:37:50Z"
        },
        {
          "tag": "v0.17.10",
          "kind": "patch",
          "published_at": "2026-07-18T18:51:35Z"
        },
        {
          "tag": "v0.17.9",
          "kind": "patch",
          "published_at": "2026-07-18T18:40:49Z"
        },
        {
          "tag": "v0.17.8",
          "kind": "patch",
          "published_at": "2026-07-18T17:51:38Z"
        },
        {
          "tag": "v0.17.7",
          "kind": "patch",
          "published_at": "2026-07-18T09:34:43Z"
        },
        {
          "tag": "v0.17.6",
          "kind": "patch",
          "published_at": "2026-07-18T09:19:45Z"
        },
        {
          "tag": "v0.17.5",
          "kind": "patch",
          "published_at": "2026-07-18T09:12:23Z"
        },
        {
          "tag": "v0.17.4",
          "kind": "patch",
          "published_at": "2026-07-18T08:49:10Z"
        },
        {
          "tag": "v0.17.3",
          "kind": "patch",
          "published_at": "2026-07-18T08:39:03Z"
        },
        {
          "tag": "v0.17.2",
          "kind": "patch",
          "published_at": "2026-07-18T08:03:57Z"
        },
        {
          "tag": "v0.17.1",
          "kind": "patch",
          "published_at": "2026-07-18T07:45:56Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-18T07:38:49Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-07-17T18:50:07Z"
        },
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-07-17T14:14:38Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-07-16T22:26:41Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-07-16T21:21:43Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-07-16T18:54:57Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-07-16T18:16:50Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-16T16:26:23Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-07-16T02:13:48Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-07-16T00:54:44Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-07-15T22:42:27Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-15T22:37:42Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-15T18:12:05Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-06-19T09:16:03Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-19T08:20:24Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-19T08:11:45Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-07T00:57:09Z"
        },
        {
          "tag": "0.5.0",
          "kind": "minor",
          "published_at": "2026-06-04T08:13:29Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-04T08:13:29Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-28T07:44:54Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-19T08:32:26Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2025-09-10T15:37:33Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2025-09-10T15:21:26Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2025-09-10T15:10:14Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2025-09-10T14:46:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9dcb81e0a576d0d76ecd1043263618966918758b",
          "body": null,
          "is_bot": false,
          "headline": "release: prepare version 0.17.17",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T21:54:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55522c12b0bcc1c720b77f0918a8e81fefb1c3be",
          "body": null,
          "is_bot": false,
          "headline": "fix: display environment verification authority",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T21:53:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb6793a4baa080b8649e4e439a0e4f66102a8792",
          "body": null,
          "is_bot": false,
          "headline": "release: prepare version 0.17.16",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T20:23:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57a73eacd053e30e124d8a229f547830e8db5410",
          "body": null,
          "is_bot": false,
          "headline": "fix: preserve fractional environment rewards",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T20:22:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26b8ca0de1de1c7ade6c045155b06ec20ff7fec4",
          "body": null,
          "is_bot": false,
          "headline": "release: prepare version 0.17.15",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T18:09:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17e520faa76c35550fa3cb2a51ccf4dcffaa969f",
          "body": null,
          "is_bot": false,
          "headline": "fix: make fresh environment deployment reliable",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T17:44:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d424ae2d5316dec7dc336518b4d9200925929901",
          "body": null,
          "is_bot": false,
          "headline": "feat: complete environment visibility workflow",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T17:14:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd1de359bfc12fa6b1b662a2d0a1208009ee9719",
          "body": null,
          "is_bot": false,
          "headline": "feat: support environment resource policies",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T14:15:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1d20ee915e319a247545ad9de47b370e62639f5",
          "body": "- Add `epsilab env test` for local multi-step session testing against\n  containerized environments (builds, starts, exercises tools, reports)\n- Add incremental build detection to `epsilab deploy` — hashes build\n  context and skips rebuild when unchanged (--force to override)\n- Improve image size warnings (1GB/2GB thresholds with actionable hints)\n- Validate Dockerfile USER directive against actual container user\n- Bump to 0.17.14",
          "is_bot": false,
          "headline": "feat: env test command, incremental builds, image/user validation",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T01:48:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff92b94f390bb9356ee3c17d7b394324eb64b1f9",
          "body": "After the protocol smoke test, re-resets the environment and probes\neach tool listed in the observation's context.tools. Uses lightweight\nread/list actions to verify that tool dependencies (e.g. Playwright\nfor browser, API clients for plugins) are actually installed and\nfunctional in the container.",
          "is_bot": false,
          "headline": "feat: add tool smoke test to deploy --test validation",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-21T01:35:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a898b72bba747389ecc01a962be8fe60bfe8e182",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.17.13",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-20T06:44:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a19239e2ac0a1cb6ac7296393363aa80fcd9970c",
          "body": null,
          "is_bot": false,
          "headline": "feat: add run_id to create_rl_session and get_session_runs method",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-20T06:43:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55a8e68fdf5900957c2f7f2e93bd0e68b85ab46d",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.17.12",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-20T04:34:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a7c0d82bcfc8441e42d781ac233b8083bf96f28",
          "body": "…Listing model\n\nSupport setting per-listing default visibility for new sessions.",
          "is_bot": false,
          "headline": "feat: add default_result_visibility to update_listing and Environment…",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-20T04:33:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d66f874ae0c66f5e3c1b52376f2f2242106d38a2",
          "body": "- Agent runner with traced long-horizon episodes\n- Horizon preflight for environment deployments\n- Model and usage tracking in session/step APIs\n- Default max_steps raised to 10,000",
          "is_bot": false,
          "headline": "release: prepare version 0.17.11",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-19T17:37:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78b1d8c92006df139fde8afcb486690e48c5eaf3",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'pr-2'",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-19T17:16:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "690f483521cfc2748468502115bc4ca92a8f7ba5",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'pr-1'",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-19T17:16:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "940c74714e0be8d38dd664d856440518aa54997f",
          "body": "Aligns run_environment_episode, run_batch, and drive_batch defaults\nwith the backend's new uncapped step policy.",
          "is_bot": false,
          "headline": "feat: raise default max_steps to 10,000 in SDK convenience wrappers",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-19T16:55:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe61ec9274e7ce61fb884f262baf610e46a1673c",
          "body": null,
          "is_bot": false,
          "headline": "Add traced long-horizon agent runner",
          "author_name": "Fengjiao Peng",
          "author_login": "GothParrot",
          "committed_at": "2026-07-19T16:51:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c72b1b02f55e3baecf0b8f7fff8d1a956b8a8272",
          "body": null,
          "is_bot": false,
          "headline": "Preflight environment horizon compatibility",
          "author_name": "Fengjiao Peng",
          "author_login": "GothParrot",
          "committed_at": "2026-07-19T16:17:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7b99fc2204ac80a18380cdf42ebd0e2e122db2e",
          "body": "Accept optional `model` on create_rl_session for analytics. Accept\noptional `usage` dict (input_tokens, output_tokens, model) on rl_step\nto report per-step token consumption.",
          "is_bot": false,
          "headline": "feat: add model and usage tracking to session and step APIs",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-19T04:10:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7b63dd29ed7d23c9f2ab8be614758195cc9421f",
          "body": null,
          "is_bot": false,
          "headline": "fix: align SDK discovery with the public hub",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T18:51:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33ffebaf78c8442ac5931d5e6c84e7e7da6cadd4",
          "body": null,
          "is_bot": false,
          "headline": "feat: run environment batches with customer policies",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T18:40:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79b98368e02eec9d4651861f00b857021262155a",
          "body": null,
          "is_bot": false,
          "headline": "release: prepare version 0.17.8",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T17:51:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b12d8b5568fb72997d289061731a6242222ed21b",
          "body": null,
          "is_bot": false,
          "headline": "fix: resolve deployed environment tasks",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T17:46:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1abffab77a19cf995ae4eb973a3fe996d99c955",
          "body": null,
          "is_bot": false,
          "headline": "fix: label shared environment access roles",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T17:29:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9cff7100e0727f96b98a99bc14300de513064a1",
          "body": null,
          "is_bot": false,
          "headline": "fix: register composed environment tool bindings",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T17:23:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71181b2bca08dbc135a1686f325529dd0bdc949e",
          "body": "- Add application_tools parameter to create_environment_release so\n  tool bindings are created when deploying environments with plugins.\n- Add _resolve_tool_bindings helper to CLI deploy to auto-resolve\n  plugin slugs to tool release IDs during deployment.\n- Add 'epsilab env shared' command to list shared environments.\n- Add 'epsilab env revoke' command to revoke shared access.\n- Update grant command output to use shared access terminology.",
          "is_bot": false,
          "headline": "feat: tool bindings, shared access CLI, and deploy improvements",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T16:50:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf3ad41406a1aaf455369c6123ad92929c20e627",
          "body": "client.create_listing and update_listing now accept domain and tags.\nepsilab deploy reads domain/tags from project.json and propagates them\nto the listing on creation or update.",
          "is_bot": false,
          "headline": "feat: pass domain and tags through listing and deploy workflows",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T14:30:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6b1ad2d97ae44550b3b8ef37d6eb809af31277f",
          "body": null,
          "is_bot": false,
          "headline": "fix: include composed environment build contexts",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T09:34:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc42490f8760cc5f1f609b6c0ac1f3f2fed8d633",
          "body": null,
          "is_bot": false,
          "headline": "fix: fail one-shot runs on terminal errors",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T09:19:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c1bb76039271aaad40d1b3551b8439bbcfd4afe",
          "body": null,
          "is_bot": false,
          "headline": "fix: send idempotency key on listing updates",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T09:12:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6beab041c1e5e5c234d642ffcfc9322cebb8e3d",
          "body": null,
          "is_bot": false,
          "headline": "fix: reject invalid example rewards",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T08:49:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0401925d33d2e19ca89d15ce675658406dc5cb1e",
          "body": null,
          "is_bot": false,
          "headline": "fix: align deploy help with current behavior",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T08:39:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b35a04486d7c8e8f26ca607acfa45d262ed00f93",
          "body": null,
          "is_bot": false,
          "headline": "fix: discover environment tasks by capability",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T08:03:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56d609998a1682b64c2419b303436acf4884ff76",
          "body": null,
          "is_bot": false,
          "headline": "fix: support environment-defined CLI actions",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T07:45:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0423fa6b6ff6f7245e4bf6df2a517103e6ee75ea",
          "body": null,
          "is_bot": false,
          "headline": "feat: streamline environment author and run workflows",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T07:38:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "984a7998d2ca505c641979f846cf05ad211d5f14",
          "body": "- Extract registry digest from OCI ref instead of using content digest\n- Handle 409 conflicts gracefully for task packs, verifiers, releases\n- Pass required allowed_split and export_policy for deployments\n- Use versioned deployment aliases to avoid conflicts on redeploy",
          "is_bot": false,
          "headline": "Fix deploy CLI: 409 handling, digest extraction, deployment fields",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T01:59:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7104edbb15173c071b1f7e1295795fd953c9a61",
          "body": "Add readme, creator_display_name, and creator_verification_status to\nEnvironmentListing. Add the same plus star_count and used_by_environments\nto ApplicationTool. Update create/update client methods to accept readme.",
          "is_bot": false,
          "headline": "Add readme and creator fields to listing and tool models",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-18T00:00:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b39c82179a7e8630ef56f2aa6fb8a1d99689e3f6",
          "body": "- SDK client now auto-resolves API key from ~/.epsilab/credentials.json\n  (set by `epsilab login`) when no explicit key or env var is provided\n- Add wait_for_session() method to poll until provisioning completes\n- Fix environment_step() to pass session_token and idempotency headers\n- Update all exam\n[…]\n login` instead of manual env vars\n- Fix task ID format in examples to match actual catalog convention\n- Add multi-environment support with argparse across all example scripts\n- Bump version to 0.16.0",
          "is_bot": false,
          "headline": "Auto-load credentials from epsilab login, fix session lifecycle",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-17T18:50:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "711c3a9286534e90d00fd82698cbc2b05957a7c8",
          "body": "- Update dashboard and docs URLs to app.epsilab.com\n- Improve run_environment and grpo_training examples",
          "is_bot": false,
          "headline": "Update app URLs and improve example scripts",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-17T16:23:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc0cf238804bca44ec2a985a66984545f334f289",
          "body": "- Add domain, tags, star count, and usage stats to EnvironmentListing\n- Remove third-party company references from README and comments\n- Bump version to 0.15.2",
          "is_bot": false,
          "headline": "Update listing model with catalog fields, clean up docs",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-17T14:14:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "191208834f098e0375d27ab5867c5d657eba6f09",
          "body": "- Add examples: run_environment.py, grpo_training.py, batch_evaluation.py\n- Deprecate eval, voice, matrix, and routing SDK methods with warnings\n- Update tests for tasks.json scaffold and relaxed verify checks\n- Bump to v0.15.1",
          "is_bot": false,
          "headline": "Add post-training examples and deprecate legacy eval endpoints",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T22:26:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92657da3e0f491144c6b4500071c33948fdc3366",
          "body": "Move API reference tables and evaluation/voice/matrix docs into\ndocs/ to keep the README focused on getting started.",
          "is_bot": false,
          "headline": "Restructure docs: focused README, split API reference and evaluations",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T21:59:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0edfb64c1eb2c869fe6c154acf4321d27f01c0f1",
          "body": "- Replace client-side registry push with server-side image upload\n  via new upload_image() API method\n- Add _friendly_error() wrapper for user-facing error messages\n- Redact session tokens in CLI output and --json\n- Fix --session-token hint in session create output\n- Simplify namespace/create next-s\n[…]\nto point to deploy\n- Make verify work without manifest (deploy flow doesn't use one)\n- Add env/tool compatibility docs to README\n- Scaffold tasks.json in env init instead of manifest\n- Bump to v0.15.0",
          "is_bot": false,
          "headline": "Server-side image upload, improved error handling, and docs",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T21:21:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3de9ae183372e28389c7a424faf6a47f7b06dde3",
          "body": "- Global --verbose / -v flag enables debug logging (HTTP requests,\n  timing, retry info, connection details)\n- Client logs request method/path and response status/latency\n- rl sessions: proper table with ID, task, status, steps, reward,\n  created columns plus summary stats (completed/active/avg rewa\n[…]\nds, latency, terminal\n  flags, and observation previews\n- env session create/step/show: enriched output with timing, metadata,\n  and next-command hints\n- deploy: total elapsed time shown on completion",
          "is_bot": false,
          "headline": "Add verbose logging, request tracing, and richer session output",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T21:00:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a1977137a52cd3a01134e2421e324b511d5f039",
          "body": "- Add get_platform_config() client method (GET /v1/platform/config)\n- Deploy command now fetches registry URL from API, no user input needed\n- Fix namespace 409 recovery to also check application tools\n- Improve namespace resolution to include tools in discovery\n- Bump version to 0.14.0",
          "is_bot": false,
          "headline": "Auto-detect container registry from platform API",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T18:54:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac27311e335524cd779e11ce3e978d67ddc2d21e",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v0.13.1 for PyPI release",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T18:16:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db05975e78eec626398fcbc77011bed546df3689",
          "body": "- Single command deploys environments or application tools\n- Auto-detects project type from directory contents:\n  - Dockerfile + tasks.json = environment\n  - plugin.py + api.py + state.py = application tool\n- Auto-resolves namespace (selects existing or creates new)\n- Saves .epsilab/project.json for\n[…]\ntry, creates tasks,\n  registers task pack + verifier + release\n- Tools: builds wheel, registers tool release with plugin metadata\n- Clear error messages for empty dirs, partial projects, missing files",
          "is_bot": false,
          "headline": "Add Vercel-style `epsilab deploy` command",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T18:07:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "678f7db4998325fbe7b3a088bdda06cf411dc4fb",
          "body": null,
          "is_bot": false,
          "headline": "Bump pyproject.toml version to 0.12.0 for PyPI release",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T16:26:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeab944dc0b23b8cf23d496e1be6582818aae835",
          "body": "Align SDK with the hub-first platform model:\n- Listings default to public visibility and approved moderation\n- Releases default to qualified status (no quarantine)\n- Add shared visibility for team/collaboration access\n- Add ApplicationTool and ApplicationToolRelease models and client methods\n- Expan\n[…]\n_cleared, license_version_id)\n- Fix all API paths to use /v1/ prefix consistently\n- Remove quarantine/moderation-team messaging from CLI\n- Clean up f-string lints and unused variable warnings in tests",
          "is_bot": false,
          "headline": "Hub model: public-by-default, Application Tools, session schema updates",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T16:24:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "20e2b61c6c83eef003a303dd709733ee9c2c2d50",
          "body": "…ignment\n\n- Add automatic Idempotency-Key headers to all POST client methods\n- Fix create_review and create_purchase to match API request models\n- Fix create_environment_session missing extra_headers passthrough\n- Update CLI env review/purchase argument parsing\n- Default usage_policy to \"training\" for env push\n- Bump to 0.11.3",
          "is_bot": false,
          "headline": "Fix idempotency headers, review/purchase schemas, and CLI argument al…",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T02:13:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a1fbd309e0466d8c5e0d6524f37cbb67b3bd443",
          "body": "…ation, adapter, and moderation endpoints",
          "is_bot": false,
          "headline": "Fix missing /v1/ prefix on creator profile, review, purchase, notific…",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T01:21:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a931b8fc91f6c9d18c0a4a15b529ea213a198462",
          "body": "Confirm now shows Yes / No toggle with ←/→ arrow keys, matching the\nselect prompt pattern. Falls back to Y/n text input on non-TTY.",
          "is_bot": false,
          "headline": "Use arrow-key navigation for confirm prompts",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T01:06:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38871b35443b70e3526d655e2f8bec6ee5c8df39",
          "body": "Replace numbered input with interactive ↑/↓ arrow-key selection using\nraw terminal mode. Falls back to numbered input on non-TTY or when\ntermios is unavailable.",
          "is_bot": false,
          "headline": "Use arrow-key navigation for select prompts",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T01:05:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "098e1a6297eae2a114b08f0743d4ecdda8765e1d",
          "body": "epsilab login now offers to open the browser, where the user logs in\non epsilab.com and the API key is sent back to the CLI automatically\nvia a localhost callback server. No copy-paste needed.",
          "is_bot": false,
          "headline": "Add browser-based auto-login via localhost callback",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T01:02:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3cea37ecd02c0d97ee3d0b51043367f2d9c1b5d",
          "body": null,
          "is_bot": false,
          "headline": "Add browser-based login flow and handle KeyboardInterrupt gracefully",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-16T00:54:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e275d529beff0961470257c039e32c4d89cb7462",
          "body": "…outing\n\nNew top-level commands: run (create/list/show/cancel/export/eval),\nrl (envs/session/step/trajectory/sessions/export/stats/curriculum),\nroute. New env subcommands: session, batch, export, publish, review,\npurchase. All support interactive prompts and --json output.",
          "is_bot": false,
          "headline": "Add full CLI coverage for runs, RL, sessions, batches, exports, and r…",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T23:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e73ae0c97c43ad531d547708ea1f00a7f4a10184",
          "body": "All key commands (login, env create/push/deploy/init, namespace create,\ntask create, profile create) now prompt interactively when positional\nargs are omitted and stdin is a TTY. Non-interactive mode (CI, pipes,\nexplicit flags) is unchanged. Sync version to 0.11.2.",
          "is_bot": false,
          "headline": "Add interactive CLI prompts for step-by-step workflows",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T23:55:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "288c470c4ad4405d602a13fbd5f0dbf4697219f2",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.11.1 for PyPI release",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T22:42:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d0c008ea1e90fdae221e7f351edd7363aeead7a",
          "body": "- epsilab task create: create a single task from args or a JSON file\n  (supports both single-object and array-of-tasks via --file)\n- epsilab task list: list tasks with domain filter and pagination",
          "is_bot": false,
          "headline": "Add task create and list CLI commands",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T22:40:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e8b62bd687efac7bc6c48e333ecbc918b12ed19",
          "body": "- Add Idempotency-Key header to all marketplace mutation methods\n  (namespace, listing, task pack, verifier, environment, deployment)\n- Derive stable idempotency keys from content fields in env push\n  so repeated pushes of the same manifest reuse existing releases\n- Add extra_headers support to _request and _buffered_request_with_retry",
          "is_bot": false,
          "headline": "Make env push idempotent with deterministic idempotency keys",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T22:37:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37aa1109bb83359e2a4681f9c973ab89e5d39a0e",
          "body": "Client-side verification before push:\n- Manifest JSON and field validation (digests, semver, OCI refs)\n- File structure checks (server.py /reset /step, Dockerfile)\n- Optional Docker build with size reporting (--build)\n- Optional protocol smoke test against running container (--test)\n- CLI arg digest validation on push (sha256:<64 hex>)\n- 5 new tests covering scaffold verify, missing manifest, bad/good digests",
          "is_bot": false,
          "headline": "add epsilab env verify command for local preflight checks",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T18:12:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "012c18a922342588039cb4ca753df83efe5cfeda",
          "body": "Extend the Python SDK to support the RL Environment Hub and Marketplace.\nThis adds 65+ client methods covering the full marketplace lifecycle\n(discovery, sessions, batches, exports, disputes, quality, billing,\nreviews, creator registry, deployments, analytics, settlement, and\nprotocol adapters).\n\nNe\n[…]\ndemonstrating buyer and creator workflows\n\nVersion bumped to 0.10.0. README restructured to focus on the\nmarketplace with existing evaluation features moved to a secondary\nsection. All 321 tests pass.",
          "is_bot": false,
          "headline": "Add RL environment marketplace SDK, CLI, and named profiles",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-07-15T02:51:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d926ebc3d28430295561fabb8a26c63d0cc12cc2",
          "body": null,
          "is_bot": false,
          "headline": "add matrix coverage for apis and rl env helper functions",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-06-19T09:16:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9eea1e6f224daaf1423b52bd63927c58b62c3242",
          "body": null,
          "is_bot": false,
          "headline": "add voice evals support",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-06-19T08:20:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56c274a558de96c9f026425d4f28856f965e9925",
          "body": null,
          "is_bot": false,
          "headline": "add rl environment support",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-06-19T08:11:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a4d946d4401e156286236d871a8e3a1860e1bc",
          "body": null,
          "is_bot": false,
          "headline": "bump version for router support",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-06-07T00:57:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11e31ff7325047d0c4d01872c3a218f08120ffc0",
          "body": null,
          "is_bot": false,
          "headline": "connect to router apis",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-06-07T00:55:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a278ed96c944d59ce6ec074ef2e72214a5e8871",
          "body": null,
          "is_bot": false,
          "headline": "add refined trajectories + router & masking",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-06-04T08:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65fe67d4e939ecdd29cabe5262859c119f2ab388",
          "body": null,
          "is_bot": false,
          "headline": "add stream export + new export formats",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-05-28T07:44:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bbcf4bf70665538ebdd00914a638200bbda3e23",
          "body": null,
          "is_bot": false,
          "headline": "add progress/credits/resumed from and eval id fields",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-05-24T04:25:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a459e37c25d72944cca0caad9162547735cac6f",
          "body": null,
          "is_bot": false,
          "headline": "cleanup docs",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-05-19T22:02:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a5d34440df3f07eb75d084805d58802c072129c",
          "body": null,
          "is_bot": false,
          "headline": "change to eval lib",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2026-05-19T08:32:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c049402df98620e8f480594f519e2de658087e3a",
          "body": null,
          "is_bot": false,
          "headline": "remove script + update docs",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2025-09-10T15:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c48f15567e5f8c14cd659e034c4f4f307270257",
          "body": null,
          "is_bot": false,
          "headline": "fallback http",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2025-09-10T15:21:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46eded789f878f8aa3779dd90169e62488bb31fb",
          "body": null,
          "is_bot": false,
          "headline": "fix for 3.9",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2025-09-10T15:10:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e16131a89d0b54ef3a6b98b9fc1ad359985ed89",
          "body": null,
          "is_bot": false,
          "headline": "add workflow",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2025-09-10T14:46:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "636f5fe5745fd081f95840100a1528437b94ca78",
          "body": null,
          "is_bot": false,
          "headline": "epsilab portfolio access lib",
          "author_name": "Matthew Olsen",
          "author_login": "olsenmatthew",
          "committed_at": "2025-09-10T14:33:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 42,
      "commits_last_year": 69,
      "latest_release_at": "2026-07-21T21:54:20Z",
      "latest_release_tag": "v0.17.17",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "epsilab",
          "exists": true,
          "license": null,
          "keywords": [
            "ai",
            "evaluation",
            "fine-tuning",
            "llm",
            "marketplace",
            "rl-environments",
            "training-data",
            "Development Status :: 4 - Beta",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: Apache Software License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.9",
            "Typing :: Typed"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/epsilab/",
          "is_deprecated": false,
          "latest_version": "0.17.17",
          "repository_url": "https://github.com/EpsilabAI/epsilab-python",
          "versions_count": 41,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2706,
          "first_published_at": "2025-09-10T14:51:26.526328Z",
          "latest_published_at": "2026-07-21T21:54:44.364778Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-19",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0
      },
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "epsilab/py.typed"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 200365,
      "source_files_sampled": 19,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "requirements.txt"
      ],
      "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": "httpx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.27.0"
        },
        {
          "name": "python-dotenv",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.1"
        }
      ],
      "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": 1,
        "merged_prs": 1,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "olsenmatthew",
          "commits": 77,
          "avatar_url": "https://avatars.githubusercontent.com/u/41770708?v=4"
        },
        {
          "type": "User",
          "login": "GothParrot",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/42277977?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.975
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "workflow.yml"
      ],
      "has_docs_dir": true,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 1/29 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 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": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "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": "9dcb81e0a576d0d76ecd1043263618966918758b",
        "ran_at": "2026-07-21T22:52:34Z",
        "aggregate_score": 4.9,
        "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-21T21:54:47Z",
      "oldest_open_prs": [
        {
          "number": 1,
          "created_at": "2026-07-19T16:18:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-19T17:30:56Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/EpsilabAI/epsilab-python",
    "host": "github.com",
    "name": "epsilab-python",
    "owner": "EpsilabAI"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 50,
        "vitality": 75,
        "community": 32,
        "governance": 52,
        "engineering": 61
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "commits_last_year": 69,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "69 commits in the last year",
                "points": 16.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 69
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "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": 88,
            "inputs": {
              "releases_count": 42,
              "latest_release_tag": "v0.17.17",
              "releases_from_tags": true,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "42 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "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.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "epsilab"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 2706
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,706 downloads/month across pypi",
                "points": 45.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2706,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.975
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 98% of commits",
                "points": 0.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "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": 72,
            "inputs": {
              "merged_prs": 1,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "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": "1/1 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "EpsilabAI",
              "public_repos": 1,
              "account_age_days": 396
            },
            "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": "1 followers of EpsilabAI",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "EpsilabAI"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~1 yr old",
                "points": 4.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "epsilab"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "41 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 41
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://epsilab.com/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://epsilab.com/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "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": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "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": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 41,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.696,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "55 of 79 human commits state their intent (structured subject or explanatory body)",
                "points": 37.1,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 55,
                      "sampled": 79
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "epsilab/py.typed"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "epsilab/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "epsilab/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": "no agent-authored commits among the last 79",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 79
                    }
                  }
                ],
                "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": 70,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 200365,
              "source_files_sampled": 19,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (epsilab/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "epsilab/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/19 source files over 60KB",
                "points": 43.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 19,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? 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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:epsilab@0.17.17; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T22:52:41.012834Z",
  "schema_version": "0.25.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/EpsilabAI/epsilab-python.svg",
  "full_name": "EpsilabAI/epsilab-python",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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