Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 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 Sterne⑂ 0 Forksseit Jan. 2026Auf GitHub ansehen ↗

N283T/zsasa erreicht einen Gesundheitsindex von 63 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (82/100) ab, am schwächsten bei Security (42/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

63
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

63
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

N283TPersönliches Konto
22 Follower44 öffentliche Reposseit Nov. 2023

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
PyPIzsasa0.9.1-23vor 0 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

82Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
12.5/36Commit-Rhythmus — 18/52 Wochen mit Commits
18/18Commit-Volumen — 896 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year896
human_commit_share1
days_since_last_push0
active_weeks_last_year18
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 24 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 8 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count24
latest_release_tagv0.9.1
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases8

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

51Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
14.6/60Stars — 9 Stars
0/25Forks — 0 Forks
0/15Watcher — 1 Watcher
Verwendete Eingangsdaten
forks0
stars9
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductja
has_pull_request_templateja

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

55Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
44.7/46.8Issue-Lösungsquote — 96 % der Issues geschlossen
37.6/38.3PR-Annahme — 376/382 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs376
open_issues1
closed_issues22
issue_closed_ratio0,957
closed_unmerged_prs6
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
9.8/25Reichweite des Inhabers — 22 Follower von N283T
17.5/25Kontohistorie — 44 öffentliche Repos, Kontoalter ca. 2 Jahre
Verwendete Eingangsdaten
followers22
owner_typeUser
is_verified
owner_loginN283T
public_repos44
account_age_days995
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 23 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packageszsasa
ecosystemspypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

80Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 27 out of 28 merged PRs checked by a CI test -- score normalized to 9
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

100Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://n283t.github.io/zsasa/
10/10Repository-Beschreibung
10/10Topics — 5 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsbioinformatics, python, sasa, structural-biology, zig
has_wikija
homepagehttps://n283t.github.io/zsasa/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

42Gefährdet · 16 % des Gesamtindex

Sicherheitslage

42Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
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.5Lizenz — 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
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,2
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

69Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes6.650
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — benchmarks/external/freesasa_batch/Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — website/tsconfig.json
10/10Reproduzierbare Umgebung — Dockerfile, Nix, lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Verwendete Eingangsdaten
has_nixja
has_testsja
lockfilespackage-lock.json, uv.lock
has_dockerfileja
typed_languagenein
bootstrap_filesbenchmarks/external/freesasa_batch/Makefile
has_devcontainernein
has_linter_confignein
typecheck_configswebsite/tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Zig mit Typprüfungs-Konfiguration (website/tsconfig.json)
55/55Handhabbare Dateigrößen — 0/70 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageZig
largest_source_bytes37.433
source_files_sampled70
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

9GitHub-Sterne
1Mitwirkende
896Commits, letzte 12 Monate
0Tage seit letztem Push
24Releases
1Bus-Faktor
1offene Issues
npm, PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 4.2 / 10
4.2Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-28 03:35 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-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
Direkte Abhängigkeiten 7
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.