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

N283T / zsasa

High-performance SASA (Solvent Accessible Surface Area) calculation in Zig with Python bindings

Zig · PythonMIT★ 9 estrellas⑂ 0 forksdesde ene 2026Ver en GitHub ↗

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

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

63
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

N283TCuenta personal
22 seguidores44 repositorios públicosdesde nov 2023

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
PyPIzsasa0.9.1-23hace 0 días

Métricas por categoría

Vitalidad

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

82Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
12.5/36Cadencia de commits — 18/52 semanas con commits
18/18Volumen de commits — 896 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year896
human_commit_share1
days_since_last_push0
active_weeks_last_year18
Cómo se puntúa
27/27Publica versiones — 24 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~8 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count24
latest_release_tagv0.9.1
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases8

Comunidad y Adopción

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

51Moderado · 18% del índice global
Cómo se puntúa
14.6/60Estrellas — 9 estrellas
0/25Forks — 0 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks0
stars9
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template

Sostenibilidad y Gobernanza

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

55Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
44.7/46.8Resolución de issues — 96% de issues cerradas
37.6/38.3Aceptación de PR — 376/382 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs376
open_issues1
closed_issues22
issue_closed_ratio0,957
closed_unmerged_prs6
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
9.8/25Alcance del propietario — 22 seguidores de N283T
17.5/25Trayectoria — 44 repos públicos, cuenta de ~2 años
Datos de entrada utilizados
followers22
owner_typeUser
is_verified
owner_loginN283T
public_repos44
account_age_days995
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 23 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageszsasa
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

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

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://n283t.github.io/zsasa/
10/10Descripción del repositorio
10/10Topics — 5 topics
10/10Wiki
Datos de entrada utilizados
topicsbioinformatics, python, sasa, structural-biology, zig
has_wiki
homepagehttps://n283t.github.io/zsasa/
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?

42En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
2.2/2.5CI-Tests — 27 out of 28 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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 6 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 43 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,2
Excluidos de la puntuación (sin datos o no aplicable): branch_protection. 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.

69Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes6650
Cómo se puntúa
18/18Arranque con un solo comando — benchmarks/external/freesasa_batch/Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — website/tsconfig.json
10/10Entorno reproducible — Dockerfile, Nix, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Datos de entrada utilizados
has_nix
has_tests
lockfilespackage-lock.json, uv.lock
has_dockerfile
typed_languageno
bootstrap_filesbenchmarks/external/freesasa_batch/Makefile
has_devcontainerno
has_linter_configno
typecheck_configswebsite/tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — Zig con configuración de verificación de tipos (website/tsconfig.json)
55/55Tamaños de archivo manejables — 0/70 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageZig
largest_source_bytes37.433
source_files_sampled70
oversized_source_files0
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

9estrellas de GitHub
1contribuidores
896commits en los últimos 12 meses
0días desde el último push
24versiones publicadas
1factor bus
1issues abiertas
npm, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 4.2 / 10
4.2agregado

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

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
9CI-Tests27 out of 28 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities43 existing vulnerabilities detected
Dependencias directas 7
RegistroPaqueteRestricción de versiónManifiesto
PyPInumpy>=1.24python/pyproject.toml
PyPIcffi>=1.15python/pyproject.toml
npm@docusaurus/core^3.7website/package.json
npm@docusaurus/preset-classic^3.7website/package.json
npmprism-react-renderer^2.4website/package.json
npmreact^19.0website/package.json
npmreact-dom^19.0website/package.json
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": [
        "bioinformatics",
        "python",
        "sasa",
        "structural-biology",
        "zig"
      ],
      "is_fork": false,
      "size_kb": 51835,
      "has_wiki": true,
      "homepage": "https://n283t.github.io/zsasa/",
      "languages": {
        "CSS": 2466,
        "MDX": 25142,
        "Nix": 2620,
        "Zig": 1624109,
        "Shell": 11856,
        "Python": 763338,
        "Dockerfile": 621,
        "TypeScript": 10866
      },
      "pushed_at": "2026-07-28T03:26:22Z",
      "created_at": "2026-01-23T06:36:31Z",
      "owner_type": "User",
      "updated_at": "2026-07-28T03:26:21Z",
      "description": "High-performance SASA (Solvent Accessible Surface Area) calculation in Zig with Python bindings",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Zig",
      "significant_languages": [
        "Zig",
        "Python"
      ]
    },
    "owner": {
      "blog": "https://www.n283t.dev/",
      "name": "N283T",
      "type": "User",
      "login": "N283T",
      "company": null,
      "location": null,
      "followers": 22,
      "avatar_url": "https://avatars.githubusercontent.com/u/149930123?v=4",
      "created_at": "2023-11-05T07:55:09Z",
      "is_verified": null,
      "public_repos": 44,
      "account_age_days": 995
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-28T03:29:53Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-15T05:57:36Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-01T12:36:23Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-06-30T13:03:17Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-28T14:31:33Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-05-21T04:41:12Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-05-20T13:16:32Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-19T07:37:47Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-05-17T09:06:03Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-05-17T08:10:11Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-17T04:26:14Z"
        },
        {
          "tag": "v0.2.11",
          "kind": "patch",
          "published_at": "2026-04-26T12:46:21Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-04-13T12:59:57Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-04-12T14:07:32Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-03-22T05:10:12Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-03-22T04:39:34Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-03-11T04:36:49Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-03-10T10:15:29Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-03-10T06:46:45Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-25T14:10:46Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-25T12:54:16Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-02-25T06:11:12Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-22T13:35:15Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-22T05:46:24Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "613c41642970ccaedba03c014c39b6f7eddcee76",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.9.1",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-28T03:26:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09f2e0cffb90c199fe09c92a6b639db01386539d",
          "body": null,
          "is_bot": false,
          "headline": "feat: add per-file chain maps to batch workflows (#406)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-28T01:21:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4c7ac6290c6bbc23dbcd8d6b39b3efd51554cc1",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.9.0",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-15T05:53:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db6afe382e03cd095b6f8005613ae798fd7b91d5",
          "body": null,
          "is_bot": false,
          "headline": "docs: update logo asset names (#403)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-15T05:37:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8145777e82d3bfdfc945457403447c6ea006c554",
          "body": null,
          "is_bot": false,
          "headline": "fix: use updated white-background logo (#402)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-15T05:21:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c16f3bc9411cd2d81b432c1aa33c45af579d9416",
          "body": null,
          "is_bot": false,
          "headline": "fix: use black-background logo (#401)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-15T05:04:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "914c43304a2aff87b4d31e681d00bf988e7b175a",
          "body": null,
          "is_bot": false,
          "headline": "docs: add preprint and refresh branding (#400)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-15T04:54:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "824fc00d91a00c942db2508199c35f803d3c1f9a",
          "body": "* feat: add batch AF model fast parser\n\n* perf: align AF model parser scan with Lahuta\n\n* feat: harden AF batch input path",
          "is_bot": false,
          "headline": "feat: add safe AlphaFold batch fast path (#399)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-15T04:10:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de2d39d3a3b712f702692fb77585345f06d339fe",
          "body": null,
          "is_bot": false,
          "headline": "chore: add zsasa release tooling",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-02T04:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e1f40b08228a240750d4cfaefc20d801ec9ab83",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.8.0",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-01T12:33:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e09d3a4f55d9fc23632a81614248683152134945",
          "body": null,
          "is_bot": false,
          "headline": "feat: add workflow JSONL output controls (#396)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-01T11:48:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5fd9bed23a50822e8c8372ff1534a49ac509931",
          "body": "* chore: ignore local worktrees\n\n* feat: improve batch JSONL output",
          "is_bot": false,
          "headline": "feat: improve batch JSONL output (#395)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-01T08:21:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46c2d213066964f75bfaa84d651893d9ad14af7b",
          "body": null,
          "is_bot": false,
          "headline": "feat: add altloc parsing modes (#394)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-01T07:39:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4315d2a124365803885b9ec946e14ea0846433be",
          "body": null,
          "is_bot": false,
          "headline": "perf: reduce mmCIF atom_site parse overhead (#393)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-01T07:11:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcd23ce3a0d7303c0132d414fa3e0c066561259f",
          "body": "* fix: gate inline CCD parsing\n\n* fix: use inline CCD in batch CCD classification\n\n* fix: skip CCD resources for non-CCD batch classifiers",
          "is_bot": false,
          "headline": "fix: gate inline CCD parsing (#392)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-07-01T01:55:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02f402e44b9af840fe51dd66d8967c0e1bb5a21f",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'fix/rsa-format-overflow-warning'",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-29T11:16:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea09fcfd056e2af11ae2767e3f44f828a2ded16e",
          "body": null,
          "is_bot": false,
          "headline": "fix: warn on RSA fixed-width overflow",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-29T11:16:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80d5f0c5f2ff102627d8f94fcc41882dc51dab7b",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.7.0 (#390)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-28T14:27:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec749dfc1d9c408859427949e1b6e2c9fcade2da",
          "body": "* docs: add review hardening implementation plan\n\n* ci: harden release and docs validation\n\n* fix: harden python sasa reliability\n\n* fix: harden structure parser semantics\n\n* fix: harden Zig SASA input validation\n\n* fix: address review hardening gaps\n\n* fix: preserve per-chain overflow warning",
          "is_bot": false,
          "headline": "fix: harden review backlog (#389)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-28T13:11:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "635e89dcdda9ac457add7b66494aae9534f0e83a",
          "body": null,
          "is_bot": false,
          "headline": "feat: add BSA workflow analysis (#388)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-28T12:20:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1996821467b00d6a448ec79b879a3e886e1a4917",
          "body": null,
          "is_bot": false,
          "headline": "feat: add trajectory bitmask LUT modes (#387)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-28T08:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f29f56557e1411f4fe580fcd79a2af08ad21e91",
          "body": null,
          "is_bot": false,
          "headline": "feat: add bitmask bias correction (#386)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-28T07:23:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c849cce3ead527b451a2b96b9e9da7bf33c60a0",
          "body": "* fix: optimize multichain workflow parsing\n\n* fix: preserve exact workflow chain ids",
          "is_bot": false,
          "headline": "fix: optimize multichain workflow parsing (#385)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-28T03:42:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ad106ec50392e55871c6dcbf602096c02e5037d",
          "body": "* docs: plan batch chunked io experiments\n\n* feat: add experimental batch chunk flags\n\n* feat: validate batch chunk options\n\n* feat: add chunked batch range scheduler\n\n* feat: buffer batch jsonl writes by chunk\n\n* docs: document experimental batch chunk options\n\n* fix: harden batch chunk range arith\n[…]\nro shards\n\n* docs: document experimental batch shard option\n\n* feat: add batch macro-batch experiments\n\n* refactor: narrow batch io experiment scope\n\n* fix: join spawned batch workers on spawn failure",
          "is_bot": false,
          "headline": "feat: allow batch thread overcommit (#384)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-27T13:10:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9bf017a11f4b29c282a811ef6b704deef9fcb71",
          "body": null,
          "is_bot": false,
          "headline": "feat: add FreeSASA-compatible calc outputs (#382)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-26T04:40:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5699b642a9df66ceb394e8a704151b2a04c081e",
          "body": "* docs: design paper benchmark website refresh\n\n* docs: plan paper benchmark website refresh\n\n* docs: refresh benchmark website from paper results\n\n* docs: improve benchmark figures and navigation\n\n* docs: restore benchmark-script figures\n\n* docs: use clickable benchmark figure grids\n\n* docs: expand\n[…]\nand validation\n\n* docs: keep validation scatter grids collapsed\n\n* docs: add representative validation scatters\n\n* docs: clarify validation interpretation\n\n* docs: lead benchmark sections with figures",
          "is_bot": false,
          "headline": "docs: refresh benchmark website (#381)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-06-18T23:51:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94fdc1ee0ba27063d7cfe69e915e8425474316e1",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.6.0 (#380)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-21T04:28:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2714633e1e793813ce3d5456a3367b3e3e1c6198",
          "body": null,
          "is_bot": false,
          "headline": "docs: recommend pyztraj for Python trajectory I/O (#379)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-21T04:07:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "010c92585c9a0e99965dadc4fcbc7599edf050e8",
          "body": null,
          "is_bot": false,
          "headline": "feat: add ztraj trajectory formats (#378)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-21T03:56:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89fcfb85ef9593a7005c4e97885b6bc947971121",
          "body": null,
          "is_bot": false,
          "headline": "chore: use ztraj for trajectory readers (#377)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-21T03:40:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "775c2a424a6ad13174695b3c0326f5d1805d6ad1",
          "body": null,
          "is_bot": false,
          "headline": "test: cover batch jsonl and ffi concurrency (#376)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-21T03:19:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fba0dea7f4beb5b14dfb8f59bdbd045d69e68c14",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.0 (#375)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-20T13:12:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b4c57dd0fd27a71832e1bb69bd4655c75d09653",
          "body": "* docs: design file-first workflow batch\n\n* docs: plan file-first workflow batch\n\n* test: add workflow chain selection helper\n\n* refactor: reuse prepared batch SASA calculation\n\n* feat: process workflow batch files once\n\n* fix: preserve workflow auth-chain fallback\n\n* fix: honor workflow thread coun\n[…]\nkflow file-first outputs\n\n* test: exercise workflow file-first output layout\n\n* docs: note workflow job reuse\n\n* docs: clarify workflow reuse eligibility\n\n* fix: preserve long chain workflow filtering",
          "is_bot": false,
          "headline": "feat: reuse parsed inputs across workflow jobs (#374)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-20T08:58:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0dc630cec25c2cd76dbe4c541f8828485fc66f9f",
          "body": null,
          "is_bot": false,
          "headline": "fix: use inline CCD from BinaryCIF (#373)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-20T05:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cd84f4e892138d243e5053790e60c5cc4a0e255",
          "body": "* docs: design binary cif input support\n\n* docs: plan binary cif implementation\n\n* feat: add binary cif messagepack reader\n\n* test: discover binary cif parser tests\n\n* feat: decode binary cif columns\n\n* fix: harden binary cif decoder errors\n\n* feat: parse binary cif atom site\n\n* fix: align binary ci\n[…]\n\n\n* feat: route binary cif inputs\n\n* test: add binary cif smoke coverage\n\n* docs: document binary cif input support\n\n* fix: handle masked binary cif columns\n\n* test: suppress workflow validation noise",
          "is_bot": false,
          "headline": "Add BinaryCIF input support (#372)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-20T03:36:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b90640690e9175ecbeb4788468a9f82e8d34408c",
          "body": "* feat: add adaptive bitmask batch mode\n\n* docs: document adaptive bitmask batch mode",
          "is_bot": false,
          "headline": "feat: add adaptive bitmask batch mode (#371)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-19T13:33:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cf3a522a29776ca87d4ad7e4777c8107c97a719",
          "body": null,
          "is_bot": false,
          "headline": "docs: restructure website docs (#370)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-19T08:24:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1392162f99341cb83072c3d95090457794615277",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.4.0 (#369)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-19T07:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "232f273baa9c502949aa9580f65e433e90b744ce",
          "body": null,
          "is_bot": false,
          "headline": "ci: ignore gitignore-only changes (#368)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-19T04:38:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22849ed4cd9f95b8c852ecd7c00b1c4581f30cc0",
          "body": null,
          "is_bot": false,
          "headline": "chore: add agent instructions and ignore local docs (#367)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-19T04:34:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4db520ff8e762ac98d64805479c5c820fd77214e",
          "body": "* docs: design workflow manifest\n\n* docs: plan workflow manifest implementation\n\n* feat: add workflow manifest parser\n\n* fix: reject duplicate workflow manifest keys\n\n* fix: detect empty duplicate workflow sections\n\n* feat: require TOML custom classifiers\n\n* fix: tighten legacy classifier config rej\n[…]\nkflow classifier docs\n\n* fix: include workflow manifest read errors\n\n* test: add workflow smoke fixtures\n\n* fix: create calc workflow output directories\n\n* fix: honor calc classifier workflow override",
          "is_bot": false,
          "headline": "[codex] add workflow manifest support (#366)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-19T04:19:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d993452d811e4cf3ff2ccd1cb279756b3375aa1",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.3.2 (#365)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-17T09:02:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffe30856e58e2fb708be7edaa4b0d877ab3c4bea",
          "body": "* docs: specify batch JSONL residue map\n\n* feat: add JSONL residue map serialization\n\n* feat: parse batch residue map option\n\n* feat: validate residue map JSONL format\n\n* feat: stream residue map JSONL rows\n\n* feat: build residue maps for batch results\n\n* docs: document batch residue map output\n\n* refactor: rename batch JSONL row helper",
          "is_bot": false,
          "headline": "[codex] Add batch JSONL residue map output (#364)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-17T08:53:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed4fc5ca069c103c97b458b9d1f100c36ccf1ac3",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.3.1 (#362)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-17T08:05:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d9f8b2cf2aed92f64bdf64e2b40631040702492",
          "body": "* docs: design batch manifest\n\n* docs: plan batch manifest implementation\n\n* feat: parse manifest TOML values\n\n* fix: clean up TOML parser allocations\n\n* fix: clean up inline TOML values\n\n* feat: parse batch manifests\n\n* feat: parse batch manifest options\n\n* feat: filter batch inputs by chain\n\n* feat: run batch manifests\n\n* fix: validate batch manifest numeric options\n\n* fix: preserve CLI auth-chain override\n\n* docs: document batch manifests\n\n* docs: clarify batch manifest usage",
          "is_bot": false,
          "headline": "[codex] add batch TOML manifests (#361)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-17T07:53:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36f3d9e8ed76cfa72470497820f4a8f56b796ac3",
          "body": "## [0.3.0] - 2026-05-17\n\n### Added\n\n- **Zstandard decompression for structure inputs**: `.json.zst`, `.pdb.zst`, `.cif.zst`, `.mmcif.zst`, `.ent.zst`, `.sdf.zst`, and `.mol.zst` are now detected and transparently decompressed via native `std.compress.zstd`. (#357)\n\n### Changed\n\n- **CLI progress bars\n[…]\n` and `traj`, reducing custom rendering logic while preserving progress reporting. (#358)\n- **Project branding documentation**: add the project logo to README and refresh logo SVG assets. (#355, #356)",
          "is_bot": false,
          "headline": "release: v0.3.0",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-17T04:23:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a947f151361fa3286a3cc402ab6ef47a7badb4d",
          "body": "* docs: add CLI progress bars design\n\n* feat: use std progress for CLI progress bars\n\n* fix: let quiet mode override progress display",
          "is_bot": false,
          "headline": "[codex] use std progress for CLI progress bars (#358)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-15T10:42:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a85e52fc2f9e36182fa5fca352e1ad9bd922cd56",
          "body": "* feat: add zstd compressed input support\n\n* fix: allow exact decompression size limit",
          "is_bot": false,
          "headline": "[codex] add zstd compressed input support (#357)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-15T10:10:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a08dc7db27005faef3579e68ce3f004f9594174a",
          "body": "docs: update logo SVG assets",
          "is_bot": false,
          "headline": "Merge pull request #356 from N283T/codex/update-logo-svg",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-04T15:43:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05d825025c3d296217f5f7b6887c036868d178fc",
          "body": null,
          "is_bot": false,
          "headline": "docs: update logo svg assets",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-04T15:43:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ec53d9efeabfffb5894970d079cb426e4ed4472",
          "body": "docs: add project logo",
          "is_bot": false,
          "headline": "Merge pull request #355 from N283T/codex/add-logo-readme",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-04T15:29:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "317db7cd5464b19c9d29d8ac87ea11a196bbdacb",
          "body": null,
          "is_bot": false,
          "headline": "docs: add project logo",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-05-04T15:29:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63a9241e965e3f0a9f79519cc9b10a8e431a5eaf",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.11 (#354)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T12:43:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02b8cd68cc7d3bbb4ef42c0eb596d235f36d1a3",
          "body": "The Build & Publish workflow has been silently broken since v0.2.9 because\nPR1 missed several Zig version pins outside build.zig.zon / flake.nix /\n.github/workflows/. v0.2.10's wheel/Docker publish surfaced these plus\ntwo follow-on issues.\n\nChanges:\n\n- **Bump Zig 0.15.2 → 0.16.0 in 9 files** missed \n[…]\neamTooLong errors on benign reads (broke\n  the Windows wheel test for examples/1ubq.cif). For trusted local input\n  files .unlimited is acceptable; mmapFile callers already trust the path.\n\nRefs: #342",
          "is_bot": false,
          "headline": "fix: clean up Zig 0.15.2 pins and Windows mmap reader regression (#353)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T12:36:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01a96229a483c444e3f005aec25a46f1d4e5ab85",
          "body": "- Bump version in build.zig, build.zig.zon, python/pyproject.toml, python/uv.lock\n- Bump flake.nix derivation version from 0.2.4 → 0.2.10 (catches up the stale Nix derivation field that previous releases missed)\n- CHANGELOG entry for the gzip → native std.compress.flate revert (#351)\n\nRefs: #342",
          "is_bot": false,
          "headline": "release: v0.2.10 (#352)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T12:17:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3691a63be747ada9d816816e8803fce10f4a3725",
          "body": "* fix: revert gzip to native std.compress.flate\n\nThe upstream panic (ziglang/zig#25035) that prompted #320's C-zlib workaround\nis fixed in Zig 0.16. Restore the native flate decompressor while preserving\nthe 4 GB decompression-bomb cap and the public API (readGzip / readGzipLimited\n/ DEFAULT_MAX_SIZ\n[…]\ns without\n.link_libc; on Linux the explicit flag is mandatory and removing it\nbroke the Linux jobs in CI for #351.\n\nThe CLI executable does not need libc — it uses GeneralPurposeAllocator.\n\nRefs: #342",
          "is_bot": false,
          "headline": "fix: revert gzip to native std.compress.flate (#351)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T12:06:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c323fd4a82fb379d981f73bd365a7518eb1c5290",
          "body": "Implementation plan for reverting the C-zlib gzip workaround introduced\nin #320 back to native std.compress.flate. Covers the 3-commit sequence\nfrom the migration spec (rewrite gzip.zig, drop zlib from build.zig,\ndrop zlib from build.zig.zon) plus full verification matrix including\nthe 2oxd.cif.gz headline check.\n\nRefs: #342",
          "is_bot": false,
          "headline": "docs: add Zig 0.16 migration PR2 plan (#350)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T11:26:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aaa726c6f5dfce4e27823ae6c0b0c27154bd86f5",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.9 (#349)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T11:04:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bb95928ac4d27f9564b8fa25c7e3a7c71f22038",
          "body": "* chore: bump toolchain to Zig 0.16.0\n\n* refactor: introduce Io.Threaded in main and thread io through subcommands\n\nConstruct one std.Io.Threaded (.init_single_threaded) in main() and\nthread std.Io through to calc.run, batch.run, traj.run, and\ncompile_dict.run. Subcommand handlers accept io as a stu\n[…]\nexpand wrapper comment to explain why zlib_wrapper.h exists\n  (addTranslateC requires b.path(), not a dependency lazy path)\n- src/c/zlib_wrapper.h: add one-line rationale comment referencing build.zig",
          "is_bot": false,
          "headline": "chore: migrate to Zig 0.16 (#345)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T10:53:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27729b29732ec5b4dd4f714330f3d663d61df617",
          "body": "* docs: add Zig 0.16 migration design spec\n\nTwo-PR plan to migrate zsasa from Zig 0.15.2 to 0.16.0 (issue #342):\n- PR1: toolchain bump + 0.16 API migration\n- PR2: revert gzip C-zlib workaround to native std.compress.flate\n\nEach PR ships independently as a patch release.\n\n* docs: add Zig 0.16 migrati\n[…]\nontainer conversion, @cImport relocation, float-to-int audit,\nand verification (build/test/smoke matrix/python bindings).\n\nRefs #342, spec docs/superpowers/specs/2026-04-26-zig-016-migration-design.md",
          "is_bot": false,
          "headline": "docs: add Zig 0.16 migration spec and PR1 plan (#344)",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-26T06:11:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e52d97019d39f4c888d34a28b7e8882b97ad077",
          "body": "fix: bump python/pyproject.toml to 0.2.8",
          "is_bot": false,
          "headline": "Merge pull request #341 from N283T/fix/release-version-sync",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T12:58:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db0f334e19827abb877e26d38e2fb9bcba5a2053",
          "body": "Was missed in the v0.2.8 release, causing PyPI publish to fail\n(wheels were built as 0.2.7, which already exists on PyPI).",
          "is_bot": false,
          "headline": "fix: bump python/pyproject.toml version to 0.2.8",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T12:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebe977d31458eef1dc6d29ac8b0f99d295dd98da",
          "body": "release: v0.2.8",
          "is_bot": false,
          "headline": "Merge pull request #340 from N283T/release/v0.2.8",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T05:28:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac84e00aeb1284204d6f5f788f94214cced16828",
          "body": "- SDF/MOL file support (V2000/V3000)\n- --sdf option for CCD-unregistered compounds\n- --mol option for molecule selection\n- Batch SDF expansion (per-molecule SASA)\n- ProtOr as CCD alias, Python CCD default\n- Memory safety fixes",
          "is_bot": false,
          "headline": "release: v0.2.8",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T04:59:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d23483be880239efbe98fc32e125088df16a3459",
          "body": "fix: process SDF molecules independently",
          "is_bot": false,
          "headline": "Merge pull request #339 from N283T/fix/sdf-per-molecule",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T04:54:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9588f651a82ebb089e4fc1dfac9bde1cad0cc95e",
          "body": "- C1: Log warnings on SDF read/parse failures in buildWorkItems\n- I1+I2: Log warnings for toStoredComponent and dict allocation failures\n  in processOneSdfMolecule instead of silently discarding errors\n- I3: Initialize result slot on double alloc failure in parallelWorker\n- I4: Free display_name str\n[…]\nlecules in selectMolecule\n- M3: Move doc comment to correct function (runBatchSequential)\n- M4: Warn when display name fallback to filename occurs\n- M5: Mention 1-based indexing in --mol error message",
          "is_bot": false,
          "headline": "fix: address review issues for SDF per-molecule processing",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T04:44:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2edf1c32fd9063be95bf081a61a0d14d65cb44c",
          "body": "Multi-molecule SDF files previously combined all molecules into a single\nAtomInput (as chains A, B, C...), causing inter-molecule SASA interference.\n\ncalc: add --mol=NAME|N option to select a specific molecule; default to\nfirst molecule with a warning when multiple exist.\n\nbatch: expand each SDF fil\n[…]\n every molecule\ngets its own independent SASA calculation. Output files use stem_molname\nformat (e.g., two_molecules_water.json).\n\nsdf_parser: add test for single-molecule slice usage via toAtomInput.",
          "is_bot": false,
          "headline": "fix: process SDF molecules independently instead of as one structure",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T04:28:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b1d6ba44144f7750b93e72e1a4ae593545a31a5",
          "body": "feat: add SDF/MOL file support",
          "is_bot": false,
          "headline": "Merge pull request #338 from N283T/feature/sdf-support",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T04:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b23a55467f5b76da73dbddb566a5afaf006a5825",
          "body": "PR #337 changed the default classifier from NACCESS to CCD in\nPython bindings, but tests were not updated. Fix:\n- Update expected radii to CCD values (ALA:O 1.42, not 1.40)\n- Add explicit NACCESS classifier to NACCESS-specific tests\n- Add CCD-specific test for unknown residue behavior (returns None)",
          "is_bot": false,
          "headline": "fix: update Python classifier tests for CCD default",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T03:59:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11d53880291291a721a146960d05315a5977b1b9",
          "body": "- C1: Fix toAtomInput over-allocation when >26 molecules by computing\n  max_chains before the first-pass atom count\n- C2: Free StoredComponent on components.put failure in all locations\n- C3: Check for duplicate molecule names before inserting to avoid\n  silent replacement and StoredComponent leak\n-\n[…]\nting double-free bug in parseSingleMolecule V3000 error\n  path (errdefer freed name that parseV3000Body already owns)\n- Add tests: >26 molecules chain limit, V3000 bad bond index, bond\n  order mapping",
          "is_bot": false,
          "headline": "fix: address critical and important issues from SDF PR review",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T03:52:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b077f976930c0009d3084356029cd27969203405",
          "body": null,
          "is_bot": false,
          "headline": "docs: add SDF/MOL to supported input formats in README",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:40:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63bc9b270d14b3548aa3c154098158f50e958a29",
          "body": "…traj\n\nAdd .sdf case to readInputFile in calc.zig and batch.zig, enabling\ndirect SDF file input with auto-format detection. Add --sdf=PATH CLI\noption to all three subcommands for loading external SDF bond topology\ninto the CCD classifier. SDF components from input files are\nauto-registered as CCD components (Task 9). The --sdf option can be\nspecified multiple times (up to 16 paths) and takes priority order:\nexplicit --sdf > auto-detected SDF > inline mmCIF > external CCD.",
          "is_bot": false,
          "headline": "feat: add SDF input support and --sdf CLI option to calc, batch, and …",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6fc27254eded38ecdb02c94de2153aacb7ce9b7",
          "body": "Add SDF and MOL file extensions to format detection so the system\ncan recognize .sdf, .sdf.gz, .mol, .mol.gz files (and uppercase\nvariants) and map them to the new `sdf` InputFormat variant.",
          "is_bot": false,
          "headline": "feat: add SDF/MOL format detection",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:27:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16d66e8da766133ead440746d98b2bb3d653ca37",
          "body": "Add two conversion functions to bridge SDF molecules with the CCD\nclassifier and SASA calculation pipeline:\n\n- toStoredComponent: converts SdfMolecule bond topology into a\n  StoredComponent that the CCD classifier can use for hybridization\n  analysis. Generates atom names as element+counter (C1, C2,\n[…]\nO1...).\n\n- toAtomInput: converts SDF molecules into AtomInput for SASA\n  calculation. Each molecule maps to a separate chain (A-Z), with\n  element VdW radii as defaults and optional hydrogen skipping.",
          "is_bot": false,
          "headline": "feat: add toStoredComponent and toAtomInput for SDF parser",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:25:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9072e04c8ec3241cfc499a76ca39981346c854d2",
          "body": "Replace the V3000 stub with a working parser that handles\nM V30 CTAB blocks including COUNTS, ATOM, and BOND sections.\nBond indices are converted from 1-based to 0-based with validation.",
          "is_bot": false,
          "headline": "feat: add SDF V3000 parser support",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:22:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eb3203a1f18b13d68ebbe742c378de4f0f112f2",
          "body": "- Free name allocation on premature EOF return-null paths to prevent leaks\n- Separate toOwnedSlice calls with errdefer to prevent atoms leak if bonds fail\n- Use idiomatic try+orelse instead of catch-return for parseSingleMolecule\n- Extract sdfBondOrder helper for reuse in future V3000 parser",
          "is_bot": false,
          "headline": "fix: resolve memory safety issues in SDF parser",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:19:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53070e608ba5a5e204706c73629c92525ada89b2",
          "body": "Implements core SDF parser (sdf_parser.zig) with:\n- V2000 atom block parsing (coordinates + element symbols)\n- V2000 bond block parsing (1-based to 0-based index conversion)\n- Multi-molecule SDF support (separated by $$$$)\n- MOL file compatibility (single molecule without $$$$)\n- CRLF line ending handling\n- V3000 detection stub (returns error.InvalidV3000)\n- Comprehensive error handling and 7 embedded tests",
          "is_bot": false,
          "headline": "feat: add SDF/MOL parser with V2000 support",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:13:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "beff839dbd074a0d0c1c0ace526299bb042a9e08",
          "body": "…rmats",
          "is_bot": false,
          "headline": "test: add SDF test data files for V2000, V3000, and multi-molecule fo…",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:13:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bbd6993f1fc1c8c5479a76ea86c0b57b64c80b1",
          "body": "11-task plan covering:\n- SDF V2000/V3000 parser\n- Format detection\n- calc/batch/traj --sdf option\n- Auto CCD component registration for SDF input\n- Integration tests",
          "is_bot": false,
          "headline": "docs: add SDF support implementation plan",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T02:06:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c576e2df933922a93e152483d553aa9f03d211c6",
          "body": "Design for two use cases:\n1. SDF as direct input file for SASA calculation\n2. --sdf option to provide bond topology for CCD-unregistered compounds",
          "is_bot": false,
          "headline": "docs: add SDF file support design spec",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:57:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afd056a77780cbbff933adeaa504f4cca8446599",
          "body": "feat: warn when --include-hydrogens used with CCD classifier",
          "is_bot": false,
          "headline": "Merge pull request #337 from N283T/feature/ccd-skip-hydrogens",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:39:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9cdb555f84b22aa658becd20b6bcdcae39e7c7e",
          "body": "MD trajectories typically contain explicit hydrogen atoms. CCD/ProtOr\nuse united-atom radii (implicit H), which causes double-counting with\nexplicit H. NACCESS handles explicit H via element fallback (H=1.10A).\n\n- Change traj default classifier from null to NACCESS\n- Update traj help text to explain the default\n- Update docs: Quick Recommendation shows per-command defaults\n- Simplify united-atom radii warning to recommend zsasa traj for MD",
          "is_bot": false,
          "headline": "feat: default traj classifier to NACCESS for MD trajectories",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:37:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcdc1d518cf2c7dab57ff3eea67ce386107d7281",
          "body": "CCD uses united-atom radii where heavy atom radii already account for\nimplicit hydrogens. Including explicit H atoms causes double-counting.\n\n- Add warning in calc.zig, batch.zig, traj.zig when CCD/ProtOr +\n  --include-hydrogens is detected\n- Add docs warning about united-atom radii and explicit hydrogens\n- Document workarounds for MD trajectories with explicit H",
          "is_bot": false,
          "headline": "feat: warn when --include-hydrogens used with CCD classifier",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:34:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "621db008a8a835ca6f0e68cb63407cdb1c74fbc0",
          "body": "docs: update classifier docs for ProtOr-CCD alias",
          "is_bot": false,
          "headline": "Merge pull request #336 from N283T/docs/protor-ccd-alias-update",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:34:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51b81e13b7fa7cdc9d8915c971a34ba92d79fd1a",
          "body": "- CCD is now documented as default (not ProtOr)\n- ProtOr listed as alias for backward compatibility\n- Merge ProtOr/CCD Key Differences columns into single \"CCD (= ProtOr)\"\n- Update all code examples to use ClassifierType.CCD\n- Simplify CCD section intro (no longer contrasts with ProtOr)",
          "is_bot": false,
          "headline": "docs: update classifier docs to reflect ProtOr-CCD alias",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b03d9e376d5593b9fd6f7b23e729c1826e8ab43",
          "body": "refactor: make ProtOr an alias for CCD classifier",
          "is_bot": false,
          "headline": "Merge pull request #335 from N283T/refactor/protor-ccd-alias",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:25:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c648ddabe53b55ac0eeb54b24e85dec154b4a64b",
          "body": "- Fix traj.zig parseClassifierType to use ClassifierType.fromString()\n  (was hand-rolled parser that didn't accept \"ccd\")\n- Unify Python defaults to CCD across all modules:\n  batch.py, biotite.py, biopython.py, gemmi.py\n- Fix calc.zig error message classifier ordering\n- Update c_api.zig constant comments (PROTOR = alias, CCD = default)",
          "is_bot": false,
          "headline": "fix: address review findings — traj parser, defaults, comments",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:24:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4ea2fa4d513a94881f3aba39377c99232efd941",
          "body": "ProtOr and CCD use identical radii for standard residues. CCD is a\nstrict superset that additionally handles non-standard residues via\nbond topology analysis. This removes the redundant classifier_protor.zig\nand routes all ProtOr lookups through CcdClassifier.\n\nChanges:\n- Delete src/classifier_proto\n[…]\nfrom protor to ccd\n- Update Python bindings default from NACCESS to CCD\n- HETATM auto-include remains ccd-only (no behavior change for protor users)\n- Update CLI help text and classifier documentation",
          "is_bot": false,
          "headline": "refactor: make ProtOr an alias for CCD classifier",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:17:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6460ee260163cbeee27c4baa0dd85bcef36c2d1c",
          "body": "docs: rewrite CCD classifier section with accurate architecture",
          "is_bot": false,
          "headline": "Merge pull request #334 from N283T/docs/ccd-classifier-details",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:08:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34f9f2c6f680709e2835d6fe200f0794dd2e5000",
          "body": "\"most comprehensive\" → \"unique to zsasa\" to convey that the CCD\nclassifier is an original feature not found in other SASA tools.",
          "is_bot": false,
          "headline": "docs: clarify CCD classifier as unique to zsasa",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:08:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e401d98ba5d554080961122365bd162ae927f1c8",
          "body": "- Fix \"zsasa's original classifier\" → \"most comprehensive\" (CCD is newest)\n- Fix residue count 37 → 45 with accurate grouping (selenoamino acids,\n  PTMs, modified nucleotide PSU)\n- Split OONS C sp2 row: carbonyl (1.55, polar) vs aromatic (1.75, apolar)\n- Fix hybridization examples to match actual de\n[…]\nr uses element fallback for non-standard residues, CCD does not)\n- Add per-classifier residue support breakdown\n- Add PSU to nucleic acids section\n- Add rationale for CCD recommended vs ProtOr default",
          "is_bot": false,
          "headline": "docs: fix review findings — radii table, residue count, examples",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T01:05:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fba5fe2d4be665348fc17cf3322cd62a7eb71f97",
          "body": "- Fix misleading \"NACCESS: compatible with FreeSASA\" — FreeSASA defaults\n  to ProtOr, not NACCESS\n- Fix code examples showing NACCESS as recommended/default\n- Replace simple radii table with detailed hybridization-based reference\n  table covering C (sp2/sp3), N, O (sp2/sp3), S, Se, P\n- Merge ProtOr/CCD columns since they produce identical radii for\n  standard residues\n- Add info box explaining ProtOr/CCD equivalence\n- Expand polarity warning to include Se and P (not just S)",
          "is_bot": false,
          "headline": "docs: fix NACCESS description, expand radii reference table",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T00:56:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c167aa9d7688392d84ed45f7135e4eff1a331202",
          "body": "- Fix incorrect \"Inline CCD\" description (was \"~35,000 components embedded\n  in the binary at compile time\", should be \"_chem_comp_atom/_chem_comp_bond\n  loops from mmCIF files\")\n- Correct 4-level to 3-level lookup (hardcoded table → runtime CCD\n  analysis → element fallback)\n- Add \"Why Use CCD?\" mo\n[…]\n)\n- Add PDB + external CCD usage examples\n- Document hybridization analysis process\n- Add RCSB Ligand Expo download links for component CIFs\n- Expand supported residues list with all hardcoded entries",
          "is_bot": false,
          "headline": "docs: rewrite CCD classifier section with accurate architecture details",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-13T00:46:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1879fc0c03e4633049b5ed13889d63ee7f278a99",
          "body": "chore: release v0.2.7",
          "is_bot": false,
          "headline": "Merge pull request #333 from N283T/release/v0.2.7",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T14:04:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7ec71277b9484c3033956c7a34412e3673efdd4",
          "body": null,
          "is_bot": false,
          "headline": "chore: add python/uv.lock to .gitignore",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T14:02:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e35f8bcd30098a3351909b089f2920357d82118d",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.2.7",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T14:01:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4745e7150070d3d12c7b01ff2b29b25a34fdc367",
          "body": "refactor: split Python core.py into focused modules",
          "is_bot": false,
          "headline": "Merge pull request #332 from N283T/refactor/split-python-core",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T13:58:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b61da6581a1619b95c89c6779ab7f7ea88baaad",
          "body": "Split the monolithic core.py (1284 lines) into 5 smaller modules:\n- _ffi.py: FFI loading, C constants, CDEF\n- sasa.py: SASA calculation (single + batch)\n- classifier.py: atom classification and radius lookup\n- rsa.py: RSA calculation\n- batch.py: directory batch processing\n\nPublic API unchanged via __init__.py re-exports.",
          "is_bot": false,
          "headline": "refactor: split Python core.py into focused modules",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T13:56:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34686faded814a4d526753bde477d9b8fe79d493",
          "body": "docs: add CCD classifier documentation",
          "is_bot": false,
          "headline": "Merge pull request #331 from N283T/docs/ccd-classifier",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T13:44:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a779519827934537534f65858170a134b323a30",
          "body": null,
          "is_bot": false,
          "headline": "docs: add CCD classifier documentation to CHANGELOG, README, and website",
          "author_name": "N283T",
          "author_login": "N283T",
          "committed_at": "2026-04-12T13:43:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 24,
      "commits_last_year": 896,
      "latest_release_at": "2026-07-28T03:29:53Z",
      "latest_release_tag": "v0.9.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 18,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "zsasa",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "Development Status :: 3 - Alpha",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: MIT License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Topic :: Scientific/Engineering :: Bio-Informatics",
            "Topic :: Scientific/Engineering :: Chemistry"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/zsasa/",
          "is_deprecated": false,
          "latest_version": "0.9.1",
          "repository_url": "https://github.com/N283T/zsasa",
          "versions_count": 23,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-02-22T05:45:54.971730Z",
          "latest_published_at": "2026-07-28T03:33:30.440671Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 9,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "benchmarks/external/freesasa_batch/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "website/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 37433,
      "source_files_sampled": 70,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 6650
    },
    "dependencies": {
      "manifests": [
        "python/pyproject.toml",
        "website/package.json"
      ],
      "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": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "numpy",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.24"
        },
        {
          "name": "cffi",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.15"
        },
        {
          "name": "@docusaurus/core",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.7"
        },
        {
          "name": "@docusaurus/preset-classic",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.7"
        },
        {
          "name": "prism-react-renderer",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.4"
        },
        {
          "name": "react",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0"
        },
        {
          "name": "react-dom",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0"
        }
      ],
      "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": 0,
        "merged_prs": 376,
        "open_issues": 1,
        "closed_ratio": 0.957,
        "closed_issues": 22,
        "closed_unmerged_prs": 6
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "N283T",
          "commits": 898,
          "avatar_url": "https://avatars.githubusercontent.com/u/149930123?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "docs.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json",
        "uv.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "27 out of 28 merged PRs checked by a CI test -- score normalized to 9",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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 6 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": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "43 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "613c41642970ccaedba03c014c39b6f7eddcee76",
        "ran_at": "2026-07-28T03:35:10Z",
        "aggregate_score": 4.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T03:33:34Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-28T03:26:16Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 405,
          "created_at": "2026-07-16T08:31:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/N283T/zsasa",
    "host": "github.com",
    "name": "zsasa",
    "owner": "N283T"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 63,
      "inputs": {
        "security": 42,
        "vitality": 82,
        "community": 51,
        "governance": 55,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 82,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 896,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 18
            },
            "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": "18/52 weeks with commits",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 18
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "896 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 896
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 6 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": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 24,
              "latest_release_tag": "v0.9.1",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "24 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "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 ~8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 51,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "forks": 0,
              "stars": 9,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "9 stars",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "merged_prs": 376,
              "open_issues": 1,
              "closed_issues": 22,
              "issue_closed_ratio": 0.957,
              "closed_unmerged_prs": 6
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "96% of issues closed",
                "points": 44.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "376/382 decided PRs merged",
                "points": 37.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 376,
                      "decided": 382
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "followers": 22,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "N283T",
              "public_repos": 44,
              "account_age_days": 995
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "22 followers of N283T",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 22,
                      "login": "N283T"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "44 public repos, account ~2 yr old",
                "points": 17.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 44
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "zsasa"
              ],
              "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": "23 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 66,
            "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "27 out of 28 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "bioinformatics",
                "python",
                "sasa",
                "structural-biology",
                "zig"
              ],
              "has_wiki": true,
              "homepage": "https://n283t.github.io/zsasa/",
              "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://n283t.github.io/zsasa/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 42,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 42,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "27 out of 28 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 6 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 2",
                "points": 1,
                "status": "partial",
                "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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "43 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 69,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 6650
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "has_nix": true,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json",
                "uv.lock"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [
                "benchmarks/external/freesasa_batch/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "website/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "benchmarks/external/freesasa_batch/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "benchmarks/external/freesasa_batch/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "website/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "website/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Zig",
              "largest_source_bytes": 37433,
              "source_files_sampled": 70,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Zig with type-check config (website/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "website/tsconfig.json",
                      "language": "Zig"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/70 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 70,
                      "oversized": 0
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:zsasa@0.9.1; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T03:35:26.781985Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/N283T/zsasa.svg",
  "full_name": "N283T/zsasa",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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