Öffentliches Register
Software-GesundheitsberichtSchema 0.26.0 · Metriken 1.13.0 · 2026-07-22 05:43 UTC

RasmussenLab / vamb

Variational autoencoder for metagenomic binning

PythonMIT★ 330 Sterne⑂ 51 Forksseit Mai 2018Auf GitHub ansehen ↗

RasmussenLab/vamb erreicht einen Gesundheitsindex von 56 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Community & Adoption (68/100) ab, am schwächsten bei AI Readiness (32/100). Zuletzt vor 85 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

56
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

RasmussenLabOrganisation
87 Follower41 öffentliche Reposseit Mai 2019

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
PyPIvamb5.0.4-17vor 448 Tagen

Metriken nach Kategorie

Vitalität

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

41Gefährdet · 22 % des Gesamtindex
Wie die Bewertung erfolgt
18/36Push-Aktualität — letzter Push vor 85 Tagen
4.2/36Commit-Rhythmus — 6/52 Wochen mit Commits
10.8/18Commit-Volumen — 15 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — 1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Verwendete Eingangsdaten
commits_last_year15
human_commit_share1
days_since_last_push85
active_weeks_last_year6
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 25 Releases veröffentlicht
7.2/36Release-Aktualität — letztes Release vor 448 Tagen
19.8/27Release-Rhythmus — ein Release etwa alle 84,6 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count25
latest_release_tagv5.0.4
releases_from_tagsnein
days_since_latest_release448
mean_days_between_releases84,6

Community & Verbreitung

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

68Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
40.8/60Stars — 330 Stars
14.2/25Forks — 51 Forks
3.9/15Watcher — 6 Watcher
Verwendete Eingangsdaten
forks51
stars330
watchers6
growth_stateorganic
growth_factor_pct100
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
7.2/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templateja
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

63Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
4.5/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 80 % der Commits
13.5/13.5Breite der Beitragenden — 10 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 14 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled10
top_contributor_share0,799
Wie die Bewertung erfolgt
38.5/46.8Issue-Lösungsquote — 82 % der Issues geschlossen
35.4/38.3PR-Annahme — 175/189 entschiedene PRs gemergt
3/15OpenSSF Scorecard: Code-Review — Found 2/10 approved changesets -- score normalized to 2
Verwendete Eingangsdaten
merged_prs175
open_issues48
closed_issues224
issue_closed_ratio0,824
closed_unmerged_prs14
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
14/25Reichweite des Inhabers — 87 Follower von RasmussenLab
23.8/25Kontohistorie — 41 öffentliche Repos, Kontoalter ca. 7 Jahre
Verwendete Eingangsdaten
followers87
owner_typeOrganization
is_verified
owner_loginRasmussenLab
public_repos41
account_age_days2.629
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
14/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 448 Tagen
20/20Versionshistorie — 17 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesvamb
ecosystemspypi
any_deprecatednein
min_days_since_publish448

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

66Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 9 out of 10 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
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
0/10Wiki
Verwendete Eingangsdaten
topics
has_wikinein
homepage
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

36Gefä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 — 9 out of 10 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
1.5/7.5Code-Review — Found 2/10 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 14 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — 1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, packaging. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10.4/35Direkte Abhängigkeiten ohne bekannte Advisories — 1 betroffen: torch 2.6.0 (high 8.8)
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
32.8/40Keine offenen Advisories — 1 Paket(e) mit Advisory seit über 90 Tagen unbehandelt; ältestes vor 498 Tagen veröffentlicht
Verwendete Eingangsdaten
sourceosv
advisories24
affected_packages1
assessed_packages37
unassessed_packages0
affected_by_severityhigh 1
direct_affected_packages1
Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von pypi:vamb@5.0.4 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 37 Paketen. Erreichbarkeit wird nicht analysiert.

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.

32Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
35.2/40Lesbare Commit-Historie — 66 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,66
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
0/10Reproduzierbare Umgebung
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Python ohne Typprüfungs-Konfiguration
53.6/55Handhabbare Dateigrößen — 1/40 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes91.868
source_files_sampled40
oversized_source_files1

Eckdaten

330GitHub-Sterne
10Mitwirkende
15Commits, letzte 12 Monate
85Tage seit letztem Push
25Releases
1Bus-Faktor
48offene Issues
PyPIPaket-Ökosysteme

Weitere Details

Stern- und Fork-Verlauf 330 ★ / 51 ⇿
330Sterne
51Forks
25Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

012525037533048192018-092022-082026-07
Major 4Minor 2Patch 18

Jeder Punkt umfasst 8 Tage.

OpenSSF Scorecard 3.6 / 10
3.6Gesamtwert

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-22 05:43 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-Tests9 out of 10 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 2/10 approved changesets -- score normalized to 2
10Contributorsproject has 14 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 10
RegistryPaketVersionsvorgabeManifest
PyPIvambcore== 0.1.2pyproject.toml
PyPInumpy== 1.26.4pyproject.toml
PyPItorch== 2.6.0pyproject.toml
PyPIpycoverm== 0.6.2pyproject.toml
PyPInetworkx== 3.4.2pyproject.toml
PyPIscikit-learn== 1.6.1pyproject.toml
PyPIdadaptation== 3.2pyproject.toml
PyPIloguru== 0.7.3pyproject.toml
PyPIpyhmmer== 0.10.15pyproject.toml
PyPIpyrodigal== 3.6.3pyproject.toml
Alle Abhängigkeiten 10

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 10 direkte und 0 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
PyPIdadaptation3.2direkt
PyPIloguru0.7.3direkt
PyPInetworkx3.4.2direkt
PyPInumpy1.26.4direkt
PyPIpycoverm0.6.2direkt
PyPIpyhmmer0.10.15direkt
PyPIpyrodigal3.6.3direkt
PyPIscikit-learn1.6.1direkt
PyPItorch2.6.0direkt
PyPIvambcore0.1.2direkt
Abhängigkeits-Advisories 1

Die Installation von pypi:vamb@5.0.4 zieht 37 Pakete nach sich, direkt und transitiv: 1 tragen bekannte Advisories, davon 1 direkte Abhängigkeiten.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
torch2.6.0direkthoch242.13.0

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 17228,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Julia": 2731,
        "Shell": 701,
        "Python": 512896
      },
      "pushed_at": "2026-04-27T11:08:33Z",
      "created_at": "2018-05-08T20:30:23Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-06T12:12:24Z",
      "description": "Variational autoencoder for metagenomic binning",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://www.cpr.ku.dk/research/disease-systems-biology/rasmussen/",
      "name": "RasmussenLab",
      "type": "Organization",
      "login": "RasmussenLab",
      "company": null,
      "location": "Copenhagen",
      "followers": 87,
      "avatar_url": "https://avatars.githubusercontent.com/u/50487949?v=4",
      "created_at": "2019-05-10T12:10:33Z",
      "is_verified": null,
      "public_repos": 41,
      "account_age_days": 2629
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v5.0.4",
          "kind": "patch",
          "published_at": "2025-04-29T13:02:59Z"
        },
        {
          "tag": "v5.0.3",
          "kind": "patch",
          "published_at": "2025-04-08T11:39:25Z"
        },
        {
          "tag": "input_data",
          "kind": "other",
          "published_at": "2025-03-28T14:38:13Z"
        },
        {
          "tag": "v5.0.2",
          "kind": "patch",
          "published_at": "2025-03-28T11:20:16Z"
        },
        {
          "tag": "v5.0.1",
          "kind": "patch",
          "published_at": "2025-03-05T13:09:25Z"
        },
        {
          "tag": "v4.1.3",
          "kind": "patch",
          "published_at": "2023-06-02T11:10:21Z"
        },
        {
          "tag": "v4.1.2",
          "kind": "patch",
          "published_at": "2023-05-28T13:35:32Z"
        },
        {
          "tag": "v4.1.1",
          "kind": "patch",
          "published_at": "2023-04-28T10:41:53Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2023-04-21T09:43:49Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2023-03-30T13:13:13Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2023-03-19T15:43:51Z"
        },
        {
          "tag": "v3.0.9",
          "kind": "patch",
          "published_at": "2022-11-24T10:44:13Z"
        },
        {
          "tag": "v3.0.8",
          "kind": "patch",
          "published_at": "2022-07-05T08:21:33Z"
        },
        {
          "tag": "v3.0.7",
          "kind": "patch",
          "published_at": "2022-04-28T14:21:06Z"
        },
        {
          "tag": "v3.0.6",
          "kind": "patch",
          "published_at": "2022-04-26T08:49:54Z"
        },
        {
          "tag": "v3.0.5",
          "kind": "patch",
          "published_at": "2022-04-25T14:07:47Z"
        },
        {
          "tag": "v3.0.3",
          "kind": "patch",
          "published_at": "2021-09-12T11:11:11Z"
        },
        {
          "tag": "3.0.2",
          "kind": "patch",
          "published_at": "2020-10-27T09:47:25Z"
        },
        {
          "tag": "3.0.1",
          "kind": "patch",
          "published_at": "2020-04-07T14:53:56Z"
        },
        {
          "tag": "3.0.0",
          "kind": "major",
          "published_at": "2020-04-07T14:51:27Z"
        },
        {
          "tag": "2.1.0",
          "kind": "minor",
          "published_at": "2019-11-21T13:44:35Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2019-07-11T13:00:51Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2019-07-11T12:33:42Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2019-01-24T13:20:11Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2018-12-20T12:37:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b146fb610921aef1da8aed5d739f1ce80d21b33a",
          "body": null,
          "is_bot": false,
          "headline": "Update article link for TaxVamb in README to published article (#469)",
          "author_name": "Lasse Schnell Danielsen",
          "author_login": "Las02",
          "committed_at": "2026-04-27T11:08:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e8862a0c793803d3f9c601a5d703053fcfdb764",
          "body": "* Do not rely on Taxometer, as it appears broken and untested\n* Instead, use a Bash script\n* Recommend using MMseqs2 w. GTDB for best results",
          "is_bot": false,
          "headline": "Doc: Instructions for getting taxonomy files",
          "author_name": "Jakob Nybo Andersen",
          "author_login": "jakobnissen",
          "committed_at": "2026-02-02T09:21:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa42e12de154c04dd7dc40a10334e79d32dd4b6a",
          "body": null,
          "is_bot": false,
          "headline": "Remove unnecesary duplicate array computation",
          "author_name": "Jakob Nybo Andersen",
          "author_login": "jakobnissen",
          "committed_at": "2026-01-09T13:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef53b666b910cf44dc8bcfe10e943089f5b37dbe",
          "body": "We know the shape at compile time, but let's check it for good measure",
          "is_bot": false,
          "headline": "Check constant kernel shape",
          "author_name": "Jakob Nybo Andersen",
          "author_login": "jakobnissen",
          "committed_at": "2026-01-09T13:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd0672a119ed7f01537801a370a814bdfc8a5b3a",
          "body": null,
          "is_bot": false,
          "headline": "Add missing f-string",
          "author_name": "Jakob Nybo Andersen",
          "author_login": "jakobnissen",
          "committed_at": "2026-01-09T13:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3893df4e7686871f864a84fdc6624ac306147fb6",
          "body": null,
          "is_bot": false,
          "headline": "Improve comments",
          "author_name": "Jakob Nybo Andersen",
          "author_login": "jakobnissen",
          "committed_at": "2026-01-09T13:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5597892788a82f82cab20ff43f77019bd10704d5",
          "body": "Using contextlib, we can emulate a `with` statement for multiple files,\nsuch that there is no resource leak if an exception occurs before the files\nare closed.",
          "is_bot": false,
          "headline": "Use context for many files in parsemarkers",
          "author_name": "Jakob Nybo Andersen",
          "author_login": "jakobnissen",
          "committed_at": "2026-01-09T13:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95178a982b6cecfb3fc1abc57a7bb521566fece9",
          "body": "This cuts down on disk space by about 3x for very little cost.\nAlso fix up some type annotations. That should probably have been a different\ncommit but oh well.",
          "is_bot": false,
          "headline": "Add --compress CLI flag to compress FASTA bins (#462)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-11-13T08:24:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3c134067d0ad9174662d00b53c978e8d86596ab",
          "body": "As discussed in issue 460, split bins were accidentally written to the unsplit\nfile. Fix this bug, and also do minor refactoring around binsplitting for\nclarity and maintainability.",
          "is_bot": false,
          "headline": "Bugfix: Print split bins to right file (#461)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-11-13T07:26:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a13cf5f8af1f4a57dd3a4a9c52602f2e26a2a1a",
          "body": null,
          "is_bot": false,
          "headline": "Taxonomy benchmark (#454)",
          "author_name": "Svetlana Kutuzova (Galkina)",
          "author_login": "sgalkina",
          "committed_at": "2025-08-27T09:37:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7826426f571886e461fa8b78ff873dfe66b4fb4d",
          "body": "This PR picks up some of the remaining work from Elek's recent refactoring\nof cluster printing. It simplifies the logical flow of contig printing by\nreducing the number of functions.\n\nThe logic is more clear about when printing happens: It now separates the\ncluster writing into two functions: One cl\n[…]\npecheck\n* More thoroughly encodes the state into the type system: i.e. if arguments\n  A and B are needed together, or not at all, they are condensed in a single\n  variable of type Option[tuple[A, B]].",
          "is_bot": false,
          "headline": "Refactor cluster printing (#455)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-08-27T09:02:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0056e2daf9c9f59ced863e6de4a07dc549c8c04",
          "body": null,
          "is_bot": false,
          "headline": "Finally works for all cases",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57d46c85eebf154308dfdc5b04306fc3e919916d",
          "body": null,
          "is_bot": false,
          "headline": "Fixed error with calling recluster",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e88268c16877c3199d2acc93cf9df1cbfe6d128e",
          "body": null,
          "is_bot": false,
          "headline": "Made sure clusters_with_prefix is always defined",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4d14740c0a082cc808de3d9e12963ffe93e2476",
          "body": "…ile loop to fix printing logic",
          "is_bot": false,
          "headline": "Made minor tweaks, replaced a dictionary with an iterable, added a wh…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "189a943c180674a39eead344e5ea7d780179fdcc",
          "body": null,
          "is_bot": false,
          "headline": "Fixed some function names for clarity and reverted incorrect changes.",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4018558f9f4bee55c4501834e7691c7bb8ef20d9",
          "body": null,
          "is_bot": false,
          "headline": "Fixed reporting erros",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9aa0d9006c052782a3d4f5c81c64e30c89d9dfcb",
          "body": null,
          "is_bot": false,
          "headline": "Reformatted using ruff",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73986022317dca018256a53ea2291d4787e00c89",
          "body": "…Corrected formatting.",
          "is_bot": false,
          "headline": "Got minfasta output working and fixed minfasta without binsplitting. …",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bd374bb108aa79b99246a3029a8148730f46557",
          "body": "…n, changed the value of a variable. Formatted using ruff.",
          "is_bot": false,
          "headline": "Changed output appearance, added argument types to function definitio…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0011902b82e5303fd9f0f91304893bdabadd17f2",
          "body": "…emented a function for dealing with files, removed a redundant print line.",
          "is_bot": false,
          "headline": "Removed unnecessary return, fixed funtionality for unsplit runs, impl…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "546471af3cd03815bb631939976c709ba2119a62",
          "body": "…escriptive variables.",
          "is_bot": false,
          "headline": "Fixed incorrect output, and removed redundant variables. Added more d…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55af4ee002bba64a718a19f36727eed9dc6ecbba",
          "body": null,
          "is_bot": false,
          "headline": "Removed function attributes",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eac19a7de19c70dd53eb1942d83f02400fa323cd",
          "body": "…s aren't unneccessarily opened.",
          "is_bot": false,
          "headline": "Fixed output problem by showing percent done instead. Made it so file…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf193ff7837e0c696e291c0c196efb5002b41d51",
          "body": null,
          "is_bot": false,
          "headline": "Changed some things to follow the codebase's conventions.",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad65d01cd00ddfdc2688049722d55aa9594c5941",
          "body": "…der managing",
          "is_bot": false,
          "headline": "Fixed variable names, removed comments, and changed the method of hea…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "074c91d155298823ef84b9959801506c548c78f6",
          "body": "…s files that only had one line.",
          "is_bot": false,
          "headline": "Removed a redundant line and cleaned up some messy code. Fixed output…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6480f6c5670cf4d00ea65320d5c2e9f17334fbee",
          "body": "… deleted the unnecessary use of a dictionary and replaced it by using the direct output of a generator.",
          "is_bot": false,
          "headline": "Made it so that progress is printed to the screen while running. Also…",
          "author_name": "Elek Lamoureux",
          "author_login": null,
          "committed_at": "2025-08-11T06:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d91c33c5760aeabe18dc522fad02c059f3abbadf",
          "body": null,
          "is_bot": false,
          "headline": "Recommended Python version",
          "author_name": "Svetlana Kutuzova",
          "author_login": "sgalkina",
          "committed_at": "2025-06-27T20:56:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c53e5419392ce3f46ffc9038d2df0004b2d94569",
          "body": "Previously, the VAEVAE's batch size and epochs were used. Also, delete the -pq\noption, which was never used, even when set.",
          "is_bot": false,
          "headline": "Fix: In TaxVamb, use Taxometer CLI options for Taxometer (#444)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-29T11:16:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23dfdef95d6ae1e6026d3b6b572051a5784f56ec",
          "body": "* Print in scientific notation, to allow small losses to not round to zero\n* Print the epoch number so people know how far the network has come\n* Indent the loss lines similar to the VAE loss's log lines",
          "is_bot": false,
          "headline": "Improve printing of VAEVAE loss in log (#443)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-29T09:21:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "782c2425668f4d7dbda04ee2d82c0453b16a7a84",
          "body": "Previously, it got parsed as `[\"\"]`.",
          "is_bot": false,
          "headline": "Bugfix: Parse empty taxonomy as empty list (#441)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-25T08:42:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b5d46541cfd1b20766d90a7c47db3c7c8e7af0c",
          "body": null,
          "is_bot": false,
          "headline": "Update CI (#442)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-25T08:33:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ce46fa53c7d3015e451f248c54266120d7c64c4",
          "body": "When parsing a Taxonomy object, each seq in the input file needs to be matched\nwith the existing seq in the CompositionMetaData. However, seqs may be filtered\nfrom the latter, if they fall below the minimum length.\nSo, when we encounter a seq in the taxonomy file not present in the composition,\nhow \n[…]\nthe composition, but then check that the\n   taxonomy contained all the sequences in the composition.\n   Thus, do less validation than would be optimal, but no breakage\n\nThis commit goes with option 3.",
          "is_bot": false,
          "headline": "Allow taxonomy to contain filtered contigs (#439)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-08T11:35:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f27691adc4bd2afd8a64f384fbb73efef557d02c",
          "body": null,
          "is_bot": false,
          "headline": "Docs: Add how to run on example data (#436)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-07T11:56:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fa0a675113705a2552cecf7fe00e6cf0373e7ee",
          "body": "Users have often installed old versions of Vamb (see e.g. results presented in\nHan, Wang & Zhu, Nat Commun 16, 2025)\nThis is unfortunate, and may be due to Conda having old versions.\nMaybe this doc change can convince some users to upgrade, and can be used as\na reference to persuade people in the future.",
          "is_bot": false,
          "headline": "Add figure comparing Vamb versions (#432)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-04-01T07:33:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8687abd494a58a788516319a63bcf6f8493d6acb",
          "body": "This was left out from db35c11 by accident",
          "is_bot": false,
          "headline": "Remove Cython from pyproject (#431)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-30T18:20:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db35c116519982c9fe1347dda215dfc5425e093d",
          "body": "Remove the Cython backend _vambtools in favor of a separately installable Rust\npackage.\nThis is a reversible change, since it does not alter Vamb's API. If things go\nhorribly wrong, we can switch it back to the Cython version.\n\nThe advantages of the new backend are:\n* Hopefully, the inevitable insta\n[…]\n  Vamb are not really in the Python parts anyway.\n\n* Python scripts like the ones in src/ can depend on vambcore instead of the\n  whole of Vamb, and will therefore load faster and consume less memory.",
          "is_bot": false,
          "headline": "Switch Cython backend to vambcore package (#423)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-17T10:12:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79ae2facc7aa7488b0e6596209b15c40282d741c",
          "body": "Fix a bug in TaxVamb where a typo caused an error when instantiating a new DataLoader during a batch step. Also test this code path in the CLI args.",
          "is_bot": false,
          "headline": "Bugfix: Batchsteps for TaxVamb (#427)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-17T07:41:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b1e34fae658cef8196e64f6f5d30aa54d7fc716",
          "body": "Some models in Vamb used dataloaders with `drop_last=True`. One rationale for\nthis is that the last mini batch, having fewer elements, is likely to give\ninflated gradients, which will disrupt training.\nHowever, since Vamb uses rather large batch sizes, this can easily result in a\nsituation where the\n[…]\nons is smaller than the batch size,\nwhich will result in an error, as no samples can be loaded from the dataset.\n\nHere, we only set `drop_last` if there are more observations than one mini\nbatch size.",
          "is_bot": false,
          "headline": "Only drop_last with enough elements in data loaders (#425)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-15T11:16:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2a05d68f528abf49003d0fd78d6b8fe49ffa3d3",
          "body": "* Do not allow hash comments in FASTA files, which do not support this normally\n* Remove dead code\n* Clean up help strings in argument parser\n* Simplify FASTA parser and hopefully make it more robust",
          "is_bot": false,
          "headline": "Misc cleanup (#421)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-12T09:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7f225f3c771f95ffcb2069aaff3a4929874ffe6",
          "body": "Missed a check for invalidly formatted input files.",
          "is_bot": false,
          "headline": "merge_aemb.py: Check duplicate headers (#420)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-12T09:32:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27f8df9430da1ff9b5c423d8e72fad53092409ac",
          "body": "The try-statement was meant to catch an iterator of non-bytes, as it's a common\nmistake to pass iterators of strings into the FASTA iterator.\nInstead, just check if the iterated object is an instance of `bytes`.",
          "is_bot": false,
          "headline": "Remove dubious use of try/catch in byte_iterfasta (#419)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-11T09:23:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0bd0df2524869c86a6e73ecb2a922dcf86af4a0a",
          "body": null,
          "is_bot": false,
          "headline": "Bump Ruff linting CI",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-07T12:27:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25b2f503ecde9c4936f52cef6913ac8a3deba92f",
          "body": "To improve user friendliness of Vamb, it's important to be clear about the format\nof all input files, and to provide clear error messages to users when they\nviolate the assumed formats.",
          "is_bot": false,
          "headline": "Various improvements to parser error messages",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-07T12:27:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adc76f7f641deaa75d2edce9fd44f91dabdac229",
          "body": "* Use paths instead of strings\n* Check for invalid sample names",
          "is_bot": false,
          "headline": "Improve src/merge_aemb.py",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-07T12:27:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c06e8485527cd5d00a5dd6d994bef691e95ad63",
          "body": "I'm generally wary of adding scripts, because they are hard to test.\nHowever, I'm making an exception here, because:\n1. Creating the input abundance TSV file from --aemb inputs is the recommended\n   way of creating abundances in Vamb, and it's important that it's easy\n2. This script does not depend on Vamb and will not break when Vamb changes.\n   In fact, it uses only numpy and stdlibs, and only reads and produces dirt\n   simple, well-specified files making breakage unlikely.",
          "is_bot": false,
          "headline": "Add src/merge_aemb.py script to merge AEMB to abundance TSV",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-06T09:06:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e135a3b10ac9eeecf8597bfb2f0676c1425837b",
          "body": "Based on a discussion with Lasse, I've reorganized the documentation to be more\ncomprehensive, and hopefully also easier to follow.\nRemove most of the information from the README in order to direct users to the\ndocumentation instead.",
          "is_bot": false,
          "headline": "Re-organise documentation and trim down README",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-05T12:41:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3a58cd88eb823555a1720dabd7c00090e9eba52",
          "body": "Mostly just formatting changes",
          "is_bot": false,
          "headline": "Small touchups to documentation and README",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-05T11:29:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb5c7d879beb6657fa3ab6ffd023ae53b564c2cb",
          "body": "Add slightly more content in the how to run section.",
          "is_bot": false,
          "headline": "Expand on how to run",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-05T10:31:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dae4cdf5066ff1f5ee8394e3e4b956713d64b07d",
          "body": "* Add automatic help, which is more robust\n* Normalize path before checking parent to address edge cases like \"a/\"\n* Correctly close file handles on exception",
          "is_bot": false,
          "headline": "Slightly clean up concatenate script",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-05T09:51:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26df8cda5bfae05476a1bc48b012d593d0d1ca33",
          "body": "Prevents some annoying compat issues with NumPy v2.",
          "is_bot": false,
          "headline": "Bump deps, limit NumPy to v1",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-03T15:50:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33aae5ab1c1aeb377adc747708f6d57eb1eb076c",
          "body": "The medoid cache stores at least 4 * n_contigs bytes per entry, and often much\nmore. Without a limit, it may quickly consume multiple gigabytes of memory.\nHere, restrict the size to 64, which is approximately 3 times the size of the\nlatent space.\nThat might be too generous a size, but it should solve the problem experienced\nby our users at the moment.",
          "is_bot": false,
          "headline": "Limit medoid cache size to 64",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-03-03T15:48:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f028bdd6119c48693b297d2218084923fdd8719d",
          "body": "Don't mention the outdated Taxometer branch in installation instructions.",
          "is_bot": false,
          "headline": "Fixup README",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-02-28T11:45:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03be8b1b84aa692e2e51f010e2d01eb7850a2d9e",
          "body": "Commit d35788c introduced a bug, where sample_medoid was being called repeatedly\non the currently best medoid, instead of the different medoid candidates.\nThis effectively disables medoid wandering, therefore degrading clustering.\nFix this.",
          "is_bot": false,
          "headline": "Fix: Don't re-sample sample medoid candidate repeatedly",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-02-14T12:55:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fa8bf72feef26d021aa847845f9b343881826c3",
          "body": "Several parts of TaxVamb's and Taxometer's handling of taxonomies have some\nimplicit assumptions which are not checked. Perhaps the restrictions could be\nlifted, but for now, let's check it when we parse the input files.\nIn particular, taxons are referred to by their name in the code, which means\nth\n[…]\non with a given name must always appear on the same rank\n* A taxon with a given name must always have a parent with the same name\nI believe this should be sufficient to ensure the tree is well-formed.",
          "is_bot": false,
          "headline": "Enforce well-behaved taxonomy annotations on tax construction",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-02-14T11:27:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc43b4550e37445c4f7d4bb868724e21e5b6634e",
          "body": null,
          "is_bot": false,
          "headline": "Bump ruff format",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-02-11T09:21:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38803bc527e645602f9944a3341324062eaba108",
          "body": "We keep getting CI failures where the split fails because there is not enough\nfields. I can't debug why as it only fails in CI.\nMaybe a better error message will help me track it down",
          "is_bot": false,
          "headline": "Improve error on tax file splitting",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-02-11T09:21:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02a9a6ec16e7db7bca4812f6f5b074e25f5aa444",
          "body": "Mask short contigs when loading TSV abundance\r\n\r\nPreviously, the TSV file was expected to only contain the retained contigs.\r\nThis is confusing for users, since they natually assume the TSV file should\r\ncontain the same contigs as the composition or the FASTA file.\r\nSo, also mask the TSV file with the composition metadata mask when loading it.",
          "is_bot": false,
          "headline": "Mask short contigs when loading TSV abundance (#389)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-01-22T11:11:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fa32805d7267e50446b0220c7f0288480d8393e",
          "body": "This is generally useful, and in particular helps with a current CI issue where\r\nthe wrong file is seemingly loaded in CI",
          "is_bot": false,
          "headline": "Log the file taxonomy is loaded from (#386)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-01-09T12:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0c1a2afebe13431a54b0e4d69420ca2bd1cd004",
          "body": null,
          "is_bot": false,
          "headline": "Bump dependencies and support Python 3.13 (#385)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-01-09T08:57:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfc17ae9b47be851398dadf1aa8a243d0274af8d",
          "body": "In commit 905115, the bin files were renamed by adding a prefix in order to\r\nresolve a file name conflict between the Z and Y space clusters.\r\nHowever, this meant that the bin/cluster names now did not correspond to the\r\nfile names of the bins.\r\nInstead, in this commit, rename the bins themselves.",
          "is_bot": false,
          "headline": "Also add bin prefix to AAE cluster names (#384)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-01-08T14:08:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3fe7e03bc042dbc458a1feb99aa4baaff22aac9",
          "body": "For some reason the old one didn't work, and didn't alert us to the fact that\r\nit didn't.",
          "is_bot": false,
          "headline": "Fix Ruff linting CI (#383)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-01-08T07:58:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "905115c5ce5d1e39562daf95532acf26dda326b6",
          "body": "The AVAMB ensemble model produces bins from the Z space, the Y space and the\r\nordinary VAE model. When the FASTA bins are written with the --minfasta flag,\r\nthe bins derived from the three models would erroneously  overwrite each other.\r\n\r\nNow, the written bins may be given an optional prefix to avo\n[…]\nng bins from the AAE Z and Y spaces - the\r\nVAE and VAEVAE models use no prefix.\r\n\r\nSo, now the bins created using the --minfasta flag with the AAE model will be\r\ncalled e.g. `z_S5C9` or `y_S12C51402`.",
          "is_bot": false,
          "headline": "Resolve bin name clashes between Z and Y space in AAE (#382)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2025-01-08T07:47:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "77e1cba32a3ad869b76b13844e5b35c70667f469",
          "body": "Previously, TaxVamb incorrectly used the inert splitter instead of the one\r\nspecified on command-line, when loading its composition.\r\nSince the binsplitter is properly initialized in `calc_tnf`, such that it will\r\nnot attempt to binsplit on 'C' if this separator is not present, the use of an\r\ninert splitter skipped this initialization.\r\nThis caused a bug where the lack of a separator was not detected until the data\r\nwas clustered, far too late.",
          "is_bot": false,
          "headline": "Use the correct binsplitter in TaxVamb (#377)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-12-10T16:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95f11550068c66ce7a735334984fcbaa4ffc3fa1",
          "body": null,
          "is_bot": false,
          "headline": "Some documentation updates (#375)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-12-04T12:58:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "589194e5491a743a2b0de143859f37f5061405a2",
          "body": "More consistently differentiate between unrefined and refined taxonomy.\r\n* Taxometer requires an unrefined, and errors on a refined one\r\n* Recluster DBScan can take either, but will warn if passed a refined one, and\r\n  not `--no_predictor`. If refinement is needed and the requisite comp and ab\r\n  ar\n[…]\nb, since this is always required for TaxVamb.\r\n\r\nAlso minor fixes in logging\r\nAlso some changes to the DBScan algorithm - the old algo has not yet been\r\nvalidated, so this is not a high-impact change.",
          "is_bot": false,
          "headline": "Make taxonomy more consistently used (#374)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-12-03T11:46:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c97ece140c806ffb2a425301a9588d146d26d29",
          "body": "Packing the indices of a ClusterGenerator shifts the meaning of the integers\r\nin its cache, invalidating it.\r\nI suppose they could be updated in the cache, but that'd be a complex piece of\r\ncode a clustering implementation which is already too complex for its own good.\r\nInstead, clear the cache when packing.\r\n\r\nThis should happen a neglible amount of times compared to how often we already\r\nclear the cache.",
          "is_bot": false,
          "headline": "Clear invalidated medoid cache on packing (#373)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-11-28T09:13:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21bdcdd7f607c67781ce26691b2275b42cb66b05",
          "body": null,
          "is_bot": false,
          "headline": "Fix small formatting issues in log file (#371)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-11-19T10:28:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "003735d5f6d2ff1876b8e30a86c4a71d5f2f7960",
          "body": "It's often useful to know which medoid was used to generate a cluster.\r\nRemarkably, we didn't think to output it earlier.",
          "is_bot": false,
          "headline": "Write medoid to cluster metadata file (#369)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-11-18T15:48:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3828e3dcc41181c8147a1fb235adf5d76aff47bb",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md (#367)",
          "author_name": "Ben J Woodcroft",
          "author_login": "wwood",
          "committed_at": "2024-11-11T09:42:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11272380f5016192f3e16354c4a96fa5a9162d08",
          "body": "This large commit is a rewrite of reclustering, along with a variety of related \r\nfixes and changes:\r\n\r\n* Add a new `taxonomy` module which includes the `ContigTaxonomy` previously\r\n  stored in vambtools. Also include new types `PredictedTaxonomy` and `Taxonomy`\r\n  to more clearly encapsulate the di\n[…]\nproperly tested. That is\r\nbecause following this commit, we will do a more thorough performance testing\r\nof Vamb before release v5, and I expect that this process will cause a series\r\nof fixes anyway.",
          "is_bot": false,
          "headline": "Rewrite reclustering (#340)",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-11-11T09:41:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f273967877d959158132e7171f6f520366b911f3",
          "body": "Update the README.md with new TaxVamb link, and fill in the TaxVamb \"how to run\" section.",
          "is_bot": false,
          "headline": "chore: TaxVAMB README (#366)",
          "author_name": "Svetlana Kutuzova (Galkina)",
          "author_login": "sgalkina",
          "committed_at": "2024-10-30T09:35:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5090eccc97ca0d93a6293386456179781504bc67",
          "body": null,
          "is_bot": false,
          "headline": "fix: cuda utilization",
          "author_name": "Svetlana Kutuzova",
          "author_login": "sgalkina",
          "committed_at": "2024-09-23T09:20:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdd14d12855081dbe0ab0c42c3cd7d948f997943",
          "body": "The previous defaults were conflicting, since the default number of epochs\nwas smaller than the last steps.\nPrevious runs have indicated that no steps is a good option, though I believe\nwe have never done any optimization on this.",
          "is_bot": false,
          "headline": "Set default taxometer batch steps to no steps",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-09-10T06:31:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9810ef047ef41f986b7ddcfdd3dc06947ee0ab6c",
          "body": "In issue 355, a user requested to bring back the --jgi option, suc that users\ncan pass in precomputed abundances. That's completely reasonable, and it's not\ngreat that the currently recommended way is to use the internal Python types\nto create an Abundance object.\n\nInstead of bringing back the JGI p\n[…]\nmade a more generic TSV parser.\nTSV is a simple, straightforward format also used elsewhere in Vamb. Also, since\nit's easy to convert the output from --aemb to TSV format, I removed the --aemb\noption.",
          "is_bot": false,
          "headline": "Replace AEMB parser with generic TSV parser",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-09-04T08:36:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb2388dadad8c3736da75ff0c3533477278c7069",
          "body": "The dependency pyhmmer is compiled with -funsafe-math-optimizations. Loading a\nlib compiled with that flag will set some flags in the CPU for the whole\nprocess, which changes float subnormal behaviour.\nThis is detected when loading NumPy, raising a warning.\nI believe this is not an issue for Vamb, so I just silence the warning for now.\nI'm not too happy with this \"solution\".",
          "is_bot": false,
          "headline": "Silence NumPy warning about float subnormals",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-09-04T08:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9233476543254e2f685f519f0a4b92e7637bf04",
          "body": "I didn't use this script, do not want to maintain it, and generally don't trust\nthat it provides reliable answers.",
          "is_bot": false,
          "headline": "Remove abundance.py script",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-22T12:30:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e8ce14741f0f878823ebd91be67c2475c100f3b",
          "body": null,
          "is_bot": false,
          "headline": "Minor tweaks to CLI args",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-19T13:20:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06b21362a2f273e85834153cfdfa10bd7cf753cc",
          "body": "Most of the changes are internal, i.e. show no changed behaviour. Instead, the\ncode should be  more robust and maintainable. This is achieved by:\n\n* Choosing composition over inheiritance\n* Leaning even further into static typing, with the different combinations of\n  options being encoded in a sum t\n[…]\nposed to the user, such that only the\n  flags actually used by each command is exposed.\n* Changed the grouping of command-line flags to be more sensible\n* Added the `--version` flag to all subcommands",
          "is_bot": false,
          "headline": "Refactor __main__.py",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-19T10:49:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7612296536053326c259eab11b7d306bb761fcac",
          "body": "Also mask lower bits of VAE's latent, to save disk space.",
          "is_bot": false,
          "headline": "Save VAEVAE latent as compressed npz",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-18T08:55:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8401be0cecae4150606ca169744e77465a800ec8",
          "body": "In 62baa358, I added `@logger.catch` to `run` in order for Loguru to catch and\nlog any errors emitted by Vamb.\nHowever, I did not notice that this will cause any caught errors to exit Vamb\nwith a return code of zero.\nThis broke CI and undoubtedly will break snakemake pipelines relying on Vamb.",
          "is_bot": false,
          "headline": "Do not ingore errors caught by Loguru",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-18T07:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bdc15cfe3c16838344732c465c93064a720e43e",
          "body": "* RPKM is more obscure, technical terminology\n* It's technically wrong, since we don't require the abundance to be expressed\n  in terms of reads per kilobase per million mapped reads.\n* We call the output file `abundance.npz`\n* \"Abundance\" is the standard terminology for this feature in the literature",
          "is_bot": false,
          "headline": "More consistently rename RPKM to abundance",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-18T06:57:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c049fbd01783e784e1476c052bd4c07e7cdec010",
          "body": "Previously, the taxonomy format input to TaxVamb was poorly defined, and did not\ncorrespond to the format output by Taxometer.\nThis had a couple of bad consequences:\n1. It made it more difficult to specify what format the user should format the\n   supplied taxonomy with\n2. The taxonomy format was to\n[…]\nhese changes, we have:\n* Three command-line arguments removed\n* __main__.py no longer depends on Pandas, it is also thoroughly statically\n  analyzable\n* More robust parsing with better error messages.",
          "is_bot": false,
          "headline": "Make TaxVamb taxonomy output format well-defined",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-17T05:36:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "34b91bd97e33ca91f7e01ccd5fc9a9309637bbfe",
          "body": "Add the ability of Vamb to detect marker genes. This is done using pyrodigal\nto predict genes in the contigs, and pyhmmer to find marker genes in the\npredicted genes.\n\nThe marker genes are currently not used in Vamb, so future commits need to add\nthe ability of Vamb to enhance binning based on these marker genes.",
          "is_bot": false,
          "headline": "Add marker gene detection",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-15T08:57:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a33b1b8bd9442e49762b7cb57a121350ef4b10b3",
          "body": "Let's be real, what are the chances a Vamb user is going to experiment with tweaking\nalpha or the latent space size?\nIt's nice to have these flags when testing, but we don't need to display them\nin the help menu. All they do is confuse users and drown out the actually\nimportant parameters users need to set.",
          "is_bot": false,
          "headline": "Hide several less-used CLI options",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-12T14:22:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12cea2ec3f92d200ee684aa8432f1fc2f9515fe1",
          "body": null,
          "is_bot": false,
          "headline": "Remove link to deleted tutorial in README",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-12T14:04:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43144d0968d0648e5b46e8bfffdd043dc9dbb381",
          "body": "We decided not to support these for users, since they are hard to maintain.",
          "is_bot": false,
          "headline": "Delete TaxVamb-related workflows",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-12T13:57:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dc2f98cd5f63025d44b91be4b4aea3eb325538b",
          "body": "Remove tutorial - Vamb's Python interface has been internal since v4, and I\nreally don't want to keep it up to date. That takes too much time.\nAdd new sections in Documentation, and move some material from the README to\nthese doc pages.\nSmall tweaks to the documentation.\n\nThe docs are not done yet, grep for \"TODO\" before v5 launch, including:\n* No link to TaxVamb preview in README\n* No description of how to run AVAMB and TaxVamb\n* No description of the Taxonomy input to TaxVamb or Taxometer",
          "is_bot": false,
          "headline": "Initial docs update before v5",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-11T10:19:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adeb157d3d16b77e240819b86e810f733d600b28",
          "body": "Since around the D-adaptation commit, the avamb tests have begun failing.\nIt looks like the AAE doesn't really work with D-adaptation.\nInstead of digging into this, I've decided to just revert the D-adaptation\nfor the AAE in particular.",
          "is_bot": false,
          "headline": "Disable D-adaptation for AVAMB",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-05T11:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40b19af03cebaea3fddc205df02c480a0d9de56c",
          "body": "These files are redundant w.r.t. composition.npz. Although it takes more memory\nto load the latter, it's unlikely that storing the composition briefly is going\nto be a problem, since if it was, Vamb would cause OOM elsewhere anyway.",
          "is_bot": false,
          "headline": "Do not make files lengths.npz and contignames",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-04T12:57:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e5121b96c6f61908bb351151dcbde9243054e3c",
          "body": "* Add `Abundance.from_aemb` function\n* Add `--aemb` flag on command line, similar to `--bamdir`\n* Update README and elsewhere that we recommend using strobealign --aemb",
          "is_bot": false,
          "headline": "Switch to strobealign --aemb as default abundance estimator",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-04T11:22:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "640c37f619be051de0b47e9c3a8fa9a73a4726a6",
          "body": "This lets us use the same tool for both linting and formatting, simplifying\nthings. Also, Ruff is faster, and installs with no dependencies.",
          "is_bot": false,
          "headline": "Switch Black formatter to Ruff",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-07-04T08:37:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5dea001f61bcbfc4b6e8b5d51a9c5c4f936ee2d2",
          "body": null,
          "is_bot": false,
          "headline": "Add Sphinx documentation",
          "author_name": "Henry",
          "author_login": null,
          "committed_at": "2024-07-02T13:48:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fedefbcb2f4c5c057402e7b924a61021b35f3308",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog and fix a missing f-string",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-06-26T11:49:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b75f79df425a6d6f2a3e5aba678ca6fdece6eec3",
          "body": "This optimizer is more efficient, and makes the learning rate obsolete, which\nis nice from a UI standpoint.",
          "is_bot": false,
          "headline": "Use Dadaptation for all DL models",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-06-26T08:41:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7510909f0f807ec835688d51e1efed5c1188bf70",
          "body": "For now, it's quite basic. It could go into stuff like unit testing, but it's\nhard not to write this kind of thing without it turning into a course in research\nsoftware engineering.",
          "is_bot": false,
          "headline": "Add CONTRIBUTING.md and issue template",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-06-26T07:50:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d35788c910f08c4618f2ca370a1f4cd89e5b6917",
          "body": "This commit adds a cache to the sampling of the medoid in clustering. This allows\nthe clusterer to fetch the results from a dict, if it's been previously computed.\nThis will get merged only if benchmarks have verified that clustering actually\nruns faster - it's probable that so few medoids are sampled multiple times that\nthe cache wastes more time in overhead than it saves in computation.",
          "is_bot": false,
          "headline": "Cache sampling of medoid",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-06-26T07:38:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15597b68628b456e7d3442b9074b0fcb7f05a265",
          "body": "Float32 has 23 bits of precision, which is more than necessary for Vamb.\nWe can mask out the lower bits, probably with no loss of performance.\nThis helps reducing the disk space usage of Vamb's output",
          "is_bot": false,
          "headline": "Mask out low bits of input float arrays",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-06-26T06:32:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ebd8f530631d82c1954b2ea81014d12e9e59fdc",
          "body": "The function init_encoder_and_training was never called by accident.\nAlso clean up the display of the AAE log a little more.",
          "is_bot": false,
          "headline": "Initialize AAE parameters",
          "author_name": "Jakob Nybo Nissen",
          "author_login": "jakobnissen",
          "committed_at": "2024-06-25T12:34:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 25,
      "commits_last_year": 15,
      "latest_release_at": "2025-04-29T13:02:59Z",
      "latest_release_tag": "v5.0.4",
      "releases_from_tags": false,
      "days_since_last_push": 85,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 448,
      "mean_days_between_releases": 84.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": true,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "vamb",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "pypi",
          "matches_repo": null,
          "registry_url": "https://pypi.org/project/vamb/",
          "is_deprecated": false,
          "latest_version": "5.0.4",
          "repository_url": null,
          "versions_count": 17,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2020-10-27T14:37:15.246782Z",
          "latest_published_at": "2025-04-29T12:58:38.917979Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 448
        }
      ]
    },
    "popularity": {
      "forks": 51,
      "stars": 330,
      "watchers": 6,
      "fork_history": {
        "days": [
          {
            "date": "2018-12-12",
            "count": 1
          },
          {
            "date": "2018-12-29",
            "count": 1
          },
          {
            "date": "2018-12-30",
            "count": 1
          },
          {
            "date": "2019-02-19",
            "count": 1
          },
          {
            "date": "2019-03-11",
            "count": 1
          },
          {
            "date": "2019-11-27",
            "count": 1
          },
          {
            "date": "2020-09-09",
            "count": 1
          },
          {
            "date": "2021-01-05",
            "count": 1
          },
          {
            "date": "2021-01-06",
            "count": 1
          },
          {
            "date": "2021-01-07",
            "count": 1
          },
          {
            "date": "2021-01-19",
            "count": 1
          },
          {
            "date": "2021-01-27",
            "count": 1
          },
          {
            "date": "2021-02-02",
            "count": 1
          },
          {
            "date": "2021-03-01",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 2
          },
          {
            "date": "2021-03-08",
            "count": 1
          },
          {
            "date": "2021-03-12",
            "count": 1
          },
          {
            "date": "2021-04-10",
            "count": 1
          },
          {
            "date": "2021-04-14",
            "count": 1
          },
          {
            "date": "2021-10-04",
            "count": 1
          },
          {
            "date": "2021-12-04",
            "count": 1
          },
          {
            "date": "2022-01-05",
            "count": 1
          },
          {
            "date": "2022-04-07",
            "count": 2
          },
          {
            "date": "2022-04-29",
            "count": 1
          },
          {
            "date": "2022-10-30",
            "count": 1
          },
          {
            "date": "2022-11-03",
            "count": 1
          },
          {
            "date": "2022-12-23",
            "count": 1
          },
          {
            "date": "2023-01-23",
            "count": 1
          },
          {
            "date": "2023-04-08",
            "count": 1
          },
          {
            "date": "2023-04-12",
            "count": 1
          },
          {
            "date": "2023-09-11",
            "count": 1
          },
          {
            "date": "2023-09-21",
            "count": 1
          },
          {
            "date": "2023-11-27",
            "count": 1
          },
          {
            "date": "2023-12-19",
            "count": 1
          },
          {
            "date": "2024-01-16",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 1
          },
          {
            "date": "2024-07-23",
            "count": 1
          },
          {
            "date": "2024-07-30",
            "count": 1
          },
          {
            "date": "2024-09-29",
            "count": 1
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2024-11-18",
            "count": 1
          },
          {
            "date": "2025-05-12",
            "count": 1
          },
          {
            "date": "2025-06-24",
            "count": 1
          },
          {
            "date": "2025-09-07",
            "count": 1
          },
          {
            "date": "2026-01-29",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 48,
        "total_forks": 51
      },
      "star_history": {
        "days": [
          {
            "date": "2018-09-21",
            "count": 1
          },
          {
            "date": "2018-12-02",
            "count": 1
          },
          {
            "date": "2018-12-10",
            "count": 2
          },
          {
            "date": "2018-12-11",
            "count": 6
          },
          {
            "date": "2018-12-12",
            "count": 2
          },
          {
            "date": "2018-12-13",
            "count": 1
          },
          {
            "date": "2018-12-19",
            "count": 3
          },
          {
            "date": "2018-12-30",
            "count": 1
          },
          {
            "date": "2019-01-21",
            "count": 1
          },
          {
            "date": "2019-02-07",
            "count": 1
          },
          {
            "date": "2019-02-11",
            "count": 1
          },
          {
            "date": "2019-03-27",
            "count": 1
          },
          {
            "date": "2019-04-01",
            "count": 1
          },
          {
            "date": "2019-05-07",
            "count": 1
          },
          {
            "date": "2019-06-22",
            "count": 1
          },
          {
            "date": "2019-06-30",
            "count": 1
          },
          {
            "date": "2019-08-03",
            "count": 1
          },
          {
            "date": "2019-08-04",
            "count": 1
          },
          {
            "date": "2019-08-28",
            "count": 1
          },
          {
            "date": "2019-10-13",
            "count": 1
          },
          {
            "date": "2019-10-16",
            "count": 1
          },
          {
            "date": "2020-01-20",
            "count": 1
          },
          {
            "date": "2020-02-11",
            "count": 1
          },
          {
            "date": "2020-04-07",
            "count": 1
          },
          {
            "date": "2020-04-15",
            "count": 1
          },
          {
            "date": "2020-06-03",
            "count": 1
          },
          {
            "date": "2020-07-15",
            "count": 1
          },
          {
            "date": "2020-07-17",
            "count": 1
          },
          {
            "date": "2020-07-22",
            "count": 1
          },
          {
            "date": "2020-08-14",
            "count": 1
          },
          {
            "date": "2020-10-28",
            "count": 1
          },
          {
            "date": "2020-12-01",
            "count": 1
          },
          {
            "date": "2020-12-07",
            "count": 1
          },
          {
            "date": "2021-01-02",
            "count": 1
          },
          {
            "date": "2021-01-04",
            "count": 2
          },
          {
            "date": "2021-01-05",
            "count": 8
          },
          {
            "date": "2021-01-06",
            "count": 3
          },
          {
            "date": "2021-01-07",
            "count": 5
          },
          {
            "date": "2021-01-08",
            "count": 3
          },
          {
            "date": "2021-01-09",
            "count": 4
          },
          {
            "date": "2021-01-10",
            "count": 3
          },
          {
            "date": "2021-01-11",
            "count": 2
          },
          {
            "date": "2021-01-13",
            "count": 1
          },
          {
            "date": "2021-01-14",
            "count": 2
          },
          {
            "date": "2021-01-15",
            "count": 1
          },
          {
            "date": "2021-01-17",
            "count": 1
          },
          {
            "date": "2021-01-18",
            "count": 1
          },
          {
            "date": "2021-01-30",
            "count": 1
          },
          {
            "date": "2021-02-01",
            "count": 1
          },
          {
            "date": "2021-02-02",
            "count": 1
          },
          {
            "date": "2021-02-03",
            "count": 1
          },
          {
            "date": "2021-02-05",
            "count": 1
          },
          {
            "date": "2021-02-10",
            "count": 1
          },
          {
            "date": "2021-02-23",
            "count": 1
          },
          {
            "date": "2021-02-24",
            "count": 1
          },
          {
            "date": "2021-02-25",
            "count": 1
          },
          {
            "date": "2021-03-16",
            "count": 1
          },
          {
            "date": "2021-03-18",
            "count": 1
          },
          {
            "date": "2021-03-25",
            "count": 1
          },
          {
            "date": "2021-04-07",
            "count": 1
          },
          {
            "date": "2021-04-20",
            "count": 2
          },
          {
            "date": "2021-04-22",
            "count": 1
          },
          {
            "date": "2021-05-13",
            "count": 1
          },
          {
            "date": "2021-05-28",
            "count": 1
          },
          {
            "date": "2021-05-31",
            "count": 1
          },
          {
            "date": "2021-06-09",
            "count": 1
          },
          {
            "date": "2021-06-15",
            "count": 1
          },
          {
            "date": "2021-07-05",
            "count": 1
          },
          {
            "date": "2021-07-15",
            "count": 1
          },
          {
            "date": "2021-07-26",
            "count": 1
          },
          {
            "date": "2021-07-29",
            "count": 1
          },
          {
            "date": "2021-08-12",
            "count": 1
          },
          {
            "date": "2021-09-01",
            "count": 1
          },
          {
            "date": "2021-09-13",
            "count": 1
          },
          {
            "date": "2021-09-14",
            "count": 1
          },
          {
            "date": "2021-10-05",
            "count": 1
          },
          {
            "date": "2021-10-07",
            "count": 1
          },
          {
            "date": "2021-10-10",
            "count": 1
          },
          {
            "date": "2021-10-15",
            "count": 1
          },
          {
            "date": "2021-10-20",
            "count": 1
          },
          {
            "date": "2021-10-29",
            "count": 1
          },
          {
            "date": "2021-11-02",
            "count": 1
          },
          {
            "date": "2021-11-10",
            "count": 1
          },
          {
            "date": "2021-11-14",
            "count": 1
          },
          {
            "date": "2021-11-19",
            "count": 2
          },
          {
            "date": "2021-12-20",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 1
          },
          {
            "date": "2022-01-04",
            "count": 1
          },
          {
            "date": "2022-01-26",
            "count": 1
          },
          {
            "date": "2022-01-31",
            "count": 1
          },
          {
            "date": "2022-02-08",
            "count": 1
          },
          {
            "date": "2022-02-19",
            "count": 1
          },
          {
            "date": "2022-02-20",
            "count": 1
          },
          {
            "date": "2022-02-22",
            "count": 1
          },
          {
            "date": "2022-03-26",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-04-01",
            "count": 1
          },
          {
            "date": "2022-04-02",
            "count": 1
          },
          {
            "date": "2022-04-05",
            "count": 1
          },
          {
            "date": "2022-04-13",
            "count": 1
          },
          {
            "date": "2022-04-20",
            "count": 1
          },
          {
            "date": "2022-04-27",
            "count": 1
          },
          {
            "date": "2022-05-11",
            "count": 1
          },
          {
            "date": "2022-05-17",
            "count": 1
          },
          {
            "date": "2022-05-20",
            "count": 1
          },
          {
            "date": "2022-05-23",
            "count": 1
          },
          {
            "date": "2022-05-27",
            "count": 1
          },
          {
            "date": "2022-06-05",
            "count": 1
          },
          {
            "date": "2022-07-04",
            "count": 1
          },
          {
            "date": "2022-07-05",
            "count": 1
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-19",
            "count": 1
          },
          {
            "date": "2022-08-25",
            "count": 1
          },
          {
            "date": "2022-09-04",
            "count": 1
          },
          {
            "date": "2022-09-07",
            "count": 1
          },
          {
            "date": "2022-09-12",
            "count": 1
          },
          {
            "date": "2022-10-02",
            "count": 1
          },
          {
            "date": "2022-10-07",
            "count": 1
          },
          {
            "date": "2022-10-10",
            "count": 1
          },
          {
            "date": "2022-10-12",
            "count": 1
          },
          {
            "date": "2022-10-26",
            "count": 1
          },
          {
            "date": "2022-10-30",
            "count": 1
          },
          {
            "date": "2022-11-02",
            "count": 1
          },
          {
            "date": "2022-11-03",
            "count": 1
          },
          {
            "date": "2022-11-04",
            "count": 1
          },
          {
            "date": "2022-12-09",
            "count": 1
          },
          {
            "date": "2023-02-13",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-02-27",
            "count": 1
          },
          {
            "date": "2023-02-28",
            "count": 1
          },
          {
            "date": "2023-03-02",
            "count": 1
          },
          {
            "date": "2023-03-04",
            "count": 1
          },
          {
            "date": "2023-03-14",
            "count": 1
          },
          {
            "date": "2023-03-26",
            "count": 1
          },
          {
            "date": "2023-03-30",
            "count": 1
          },
          {
            "date": "2023-03-31",
            "count": 2
          },
          {
            "date": "2023-04-03",
            "count": 1
          },
          {
            "date": "2023-04-27",
            "count": 1
          },
          {
            "date": "2023-05-06",
            "count": 1
          },
          {
            "date": "2023-05-08",
            "count": 1
          },
          {
            "date": "2023-05-23",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-05-30",
            "count": 1
          },
          {
            "date": "2023-06-24",
            "count": 1
          },
          {
            "date": "2023-06-27",
            "count": 1
          },
          {
            "date": "2023-07-05",
            "count": 1
          },
          {
            "date": "2023-07-18",
            "count": 1
          },
          {
            "date": "2023-07-19",
            "count": 1
          },
          {
            "date": "2023-07-23",
            "count": 1
          },
          {
            "date": "2023-08-09",
            "count": 2
          },
          {
            "date": "2023-08-10",
            "count": 1
          },
          {
            "date": "2023-08-14",
            "count": 1
          },
          {
            "date": "2023-08-29",
            "count": 1
          },
          {
            "date": "2023-10-09",
            "count": 1
          },
          {
            "date": "2023-10-21",
            "count": 1
          },
          {
            "date": "2023-10-24",
            "count": 1
          },
          {
            "date": "2023-10-30",
            "count": 1
          },
          {
            "date": "2023-11-01",
            "count": 2
          },
          {
            "date": "2023-11-06",
            "count": 1
          },
          {
            "date": "2023-11-26",
            "count": 1
          },
          {
            "date": "2023-12-07",
            "count": 1
          },
          {
            "date": "2023-12-14",
            "count": 1
          },
          {
            "date": "2023-12-19",
            "count": 1
          },
          {
            "date": "2023-12-30",
            "count": 1
          },
          {
            "date": "2024-01-08",
            "count": 2
          },
          {
            "date": "2024-01-11",
            "count": 1
          },
          {
            "date": "2024-01-19",
            "count": 1
          },
          {
            "date": "2024-01-22",
            "count": 1
          },
          {
            "date": "2024-01-23",
            "count": 1
          },
          {
            "date": "2024-01-25",
            "count": 3
          },
          {
            "date": "2024-01-26",
            "count": 2
          },
          {
            "date": "2024-01-30",
            "count": 2
          },
          {
            "date": "2024-02-10",
            "count": 1
          },
          {
            "date": "2024-02-12",
            "count": 1
          },
          {
            "date": "2024-03-02",
            "count": 1
          },
          {
            "date": "2024-03-06",
            "count": 1
          },
          {
            "date": "2024-03-21",
            "count": 1
          },
          {
            "date": "2024-05-09",
            "count": 1
          },
          {
            "date": "2024-05-13",
            "count": 1
          },
          {
            "date": "2024-05-21",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-14",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 1
          },
          {
            "date": "2024-06-26",
            "count": 2
          },
          {
            "date": "2024-07-10",
            "count": 1
          },
          {
            "date": "2024-07-11",
            "count": 1
          },
          {
            "date": "2024-07-14",
            "count": 1
          },
          {
            "date": "2024-07-17",
            "count": 1
          },
          {
            "date": "2024-07-23",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 1
          },
          {
            "date": "2024-08-20",
            "count": 1
          },
          {
            "date": "2024-09-04",
            "count": 1
          },
          {
            "date": "2024-09-16",
            "count": 1
          },
          {
            "date": "2024-09-18",
            "count": 1
          },
          {
            "date": "2024-09-30",
            "count": 1
          },
          {
            "date": "2024-10-02",
            "count": 1
          },
          {
            "date": "2024-10-09",
            "count": 1
          },
          {
            "date": "2024-10-11",
            "count": 1
          },
          {
            "date": "2024-10-21",
            "count": 1
          },
          {
            "date": "2024-10-25",
            "count": 1
          },
          {
            "date": "2024-10-28",
            "count": 1
          },
          {
            "date": "2024-10-30",
            "count": 2
          },
          {
            "date": "2024-10-31",
            "count": 1
          },
          {
            "date": "2024-11-01",
            "count": 1
          },
          {
            "date": "2024-11-07",
            "count": 1
          },
          {
            "date": "2024-11-11",
            "count": 1
          },
          {
            "date": "2024-11-14",
            "count": 3
          },
          {
            "date": "2024-11-18",
            "count": 1
          },
          {
            "date": "2024-11-21",
            "count": 1
          },
          {
            "date": "2024-11-23",
            "count": 1
          },
          {
            "date": "2024-11-27",
            "count": 1
          },
          {
            "date": "2024-11-28",
            "count": 1
          },
          {
            "date": "2024-12-07",
            "count": 1
          },
          {
            "date": "2024-12-17",
            "count": 1
          },
          {
            "date": "2025-01-02",
            "count": 1
          },
          {
            "date": "2025-01-08",
            "count": 2
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-13",
            "count": 1
          },
          {
            "date": "2025-01-18",
            "count": 1
          },
          {
            "date": "2025-02-13",
            "count": 1
          },
          {
            "date": "2025-02-14",
            "count": 1
          },
          {
            "date": "2025-02-20",
            "count": 1
          },
          {
            "date": "2025-03-01",
            "count": 1
          },
          {
            "date": "2025-03-02",
            "count": 1
          },
          {
            "date": "2025-03-04",
            "count": 1
          },
          {
            "date": "2025-03-06",
            "count": 1
          },
          {
            "date": "2025-03-10",
            "count": 1
          },
          {
            "date": "2025-03-11",
            "count": 2
          },
          {
            "date": "2025-03-13",
            "count": 1
          },
          {
            "date": "2025-04-01",
            "count": 1
          },
          {
            "date": "2025-04-09",
            "count": 1
          },
          {
            "date": "2025-04-11",
            "count": 1
          },
          {
            "date": "2025-05-06",
            "count": 1
          },
          {
            "date": "2025-05-27",
            "count": 3
          },
          {
            "date": "2025-05-28",
            "count": 1
          },
          {
            "date": "2025-05-31",
            "count": 1
          },
          {
            "date": "2025-06-02",
            "count": 1
          },
          {
            "date": "2025-06-08",
            "count": 1
          },
          {
            "date": "2025-06-24",
            "count": 1
          },
          {
            "date": "2025-06-30",
            "count": 1
          },
          {
            "date": "2025-07-24",
            "count": 2
          },
          {
            "date": "2025-08-01",
            "count": 1
          },
          {
            "date": "2025-08-13",
            "count": 1
          },
          {
            "date": "2025-08-14",
            "count": 1
          },
          {
            "date": "2025-08-17",
            "count": 1
          },
          {
            "date": "2025-08-30",
            "count": 1
          },
          {
            "date": "2025-08-31",
            "count": 1
          },
          {
            "date": "2025-09-02",
            "count": 1
          },
          {
            "date": "2025-09-10",
            "count": 1
          },
          {
            "date": "2025-09-23",
            "count": 1
          },
          {
            "date": "2025-09-27",
            "count": 1
          },
          {
            "date": "2025-10-16",
            "count": 1
          },
          {
            "date": "2025-10-20",
            "count": 1
          },
          {
            "date": "2025-11-19",
            "count": 1
          },
          {
            "date": "2025-12-04",
            "count": 1
          },
          {
            "date": "2025-12-24",
            "count": 1
          },
          {
            "date": "2025-12-28",
            "count": 1
          },
          {
            "date": "2025-12-30",
            "count": 1
          },
          {
            "date": "2026-01-06",
            "count": 1
          },
          {
            "date": "2026-01-11",
            "count": 1
          },
          {
            "date": "2026-01-12",
            "count": 2
          },
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-01-29",
            "count": 1
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-13",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-04-11",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 3
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 1
          },
          {
            "date": "2026-07-06",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 330,
        "total_stars": 330
      },
      "open_issues_and_prs": 55
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 91868,
      "source_files_sampled": 40,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "setup.cfg"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "torch",
            "direct": true,
            "version": "2.6.0",
            "severity": "high",
            "ecosystem": "pypi",
            "cvss_score": 8.8,
            "advisory_ids": [
              "GHSA-3749-ghw9-m3mg",
              "GHSA-887c-mr87-cxwp",
              "GHSA-c678-jfcj-6jmf",
              "GHSA-f4hp-rmr7-r7v8",
              "GHSA-qfhq-4f3w-5fph",
              "GHSA-rrmf-rvhw-rf47",
              "GHSA-vgrw-7cvw-pwgx",
              "GHSA-x3gm-94wq-g975",
              "PYSEC-2025-191",
              "PYSEC-2025-198"
            ],
            "fixed_version": "2.13.0",
            "advisory_count": 24,
            "oldest_advisory_days": 498
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1
        },
        "advisory_count": 24,
        "affected_count": 1,
        "assessed_count": 37,
        "malicious_count": 0,
        "assessed_package": "pypi:vamb@5.0.4",
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "vambcore",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 0.1.2"
        },
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 1.26.4"
        },
        {
          "name": "torch",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 2.6.0"
        },
        {
          "name": "pycoverm",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 0.6.2"
        },
        {
          "name": "networkx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 3.4.2"
        },
        {
          "name": "scikit-learn",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 1.6.1"
        },
        {
          "name": "dadaptation",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 3.2"
        },
        {
          "name": "loguru",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 0.7.3"
        },
        {
          "name": "pyhmmer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 0.10.15"
        },
        {
          "name": "pyrodigal",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "== 3.6.3"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "dadaptation",
            "direct": true,
            "version": "3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "loguru",
            "direct": true,
            "version": "0.7.3",
            "ecosystem": "pypi"
          },
          {
            "name": "networkx",
            "direct": true,
            "version": "3.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": "1.26.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pycoverm",
            "direct": true,
            "version": "0.6.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyhmmer",
            "direct": true,
            "version": "0.10.15",
            "ecosystem": "pypi"
          },
          {
            "name": "pyrodigal",
            "direct": true,
            "version": "3.6.3",
            "ecosystem": "pypi"
          },
          {
            "name": "scikit-learn",
            "direct": true,
            "version": "1.6.1",
            "ecosystem": "pypi"
          },
          {
            "name": "torch",
            "direct": true,
            "version": "2.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "vambcore",
            "direct": true,
            "version": "0.1.2",
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 10,
        "direct_count": 10,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 7,
        "merged_prs": 175,
        "open_issues": 48,
        "closed_ratio": 0.824,
        "closed_issues": 224,
        "closed_unmerged_prs": 14
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "jakobnissen",
          "commits": 526,
          "avatar_url": "https://avatars.githubusercontent.com/u/23193950?v=4"
        },
        {
          "type": "User",
          "login": "simonrasmu",
          "commits": 66,
          "avatar_url": "https://avatars.githubusercontent.com/u/58809976?v=4"
        },
        {
          "type": "User",
          "login": "sgalkina",
          "commits": 40,
          "avatar_url": "https://avatars.githubusercontent.com/u/4077686?v=4"
        },
        {
          "type": "User",
          "login": "ctb",
          "commits": 12,
          "avatar_url": "https://avatars.githubusercontent.com/u/51016?v=4"
        },
        {
          "type": "User",
          "login": "Paupiera",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/38884866?v=4"
        },
        {
          "type": "User",
          "login": "wwood",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/15348?v=4"
        },
        {
          "type": "User",
          "login": "Las02",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/97394529?v=4"
        },
        {
          "type": "User",
          "login": "SilasK",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/7523034?v=4"
        },
        {
          "type": "User",
          "login": "vinisalazar",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/17276653?v=4"
        },
        {
          "type": "User",
          "login": "icemduru",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/38720399?v=4"
        }
      ],
      "contributors_sampled": 10,
      "top_contributor_share": 0.799
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "cli_vamb.yml",
        "lint.yml",
        "snakemake_avamb.yml",
        "unittest.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": "9 out of 10 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": 2,
            "reason": "Found 2/10 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 14 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b146fb610921aef1da8aed5d739f1ce80d21b33a",
        "ran_at": "2026-07-22T05:43:39Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T01:35:50Z",
      "oldest_open_prs": [
        {
          "number": 180,
          "created_at": "2023-06-02T11:14:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 292,
          "created_at": "2024-02-15T11:13:43Z",
          "last_comment_at": "2024-02-15T11:14:22Z",
          "last_comment_author": "jakobnissen"
        },
        {
          "number": 329,
          "created_at": "2024-06-27T13:39:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 422,
          "created_at": "2025-03-12T10:01:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 452,
          "created_at": "2025-07-06T21:24:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 463,
          "created_at": "2025-11-13T08:25:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 467,
          "created_at": "2026-01-10T09:18:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-04-27T11:08:33Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2018-12-17T20:48:59Z",
          "last_comment_at": "2025-02-12T14:43:41Z",
          "last_comment_author": "maxibor"
        },
        {
          "number": 27,
          "created_at": "2019-12-13T09:01:42Z",
          "last_comment_at": "2023-04-17T07:20:54Z",
          "last_comment_author": "jakobnissen"
        },
        {
          "number": 45,
          "created_at": "2021-01-14T03:05:32Z",
          "last_comment_at": "2021-09-22T12:21:34Z",
          "last_comment_author": "simonrasmu"
        },
        {
          "number": 48,
          "created_at": "2021-01-14T09:19:34Z",
          "last_comment_at": "2021-08-05T07:08:10Z",
          "last_comment_author": "simonrasmu"
        },
        {
          "number": 54,
          "created_at": "2021-01-21T15:04:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 73,
          "created_at": "2021-06-03T23:07:24Z",
          "last_comment_at": "2021-06-08T15:16:34Z",
          "last_comment_author": "jolespin"
        },
        {
          "number": 83,
          "created_at": "2021-09-09T23:36:50Z",
          "last_comment_at": "2021-09-21T06:54:21Z",
          "last_comment_author": "aistBMRG"
        },
        {
          "number": 104,
          "created_at": "2022-04-05T18:07:25Z",
          "last_comment_at": "2023-02-22T17:49:15Z",
          "last_comment_author": "TomasaSbaffi"
        },
        {
          "number": 114,
          "created_at": "2022-04-29T19:04:03Z",
          "last_comment_at": "2022-04-29T21:06:18Z",
          "last_comment_author": "B-1991-ing"
        },
        {
          "number": 115,
          "created_at": "2022-05-15T09:42:54Z",
          "last_comment_at": "2024-04-10T04:23:34Z",
          "last_comment_author": "Andyargueasae"
        },
        {
          "number": 132,
          "created_at": "2022-08-16T22:35:05Z",
          "last_comment_at": "2022-12-19T22:14:29Z",
          "last_comment_author": "echoduan"
        },
        {
          "number": 136,
          "created_at": "2022-09-12T13:32:56Z",
          "last_comment_at": "2022-09-29T09:05:29Z",
          "last_comment_author": "jakobnissen"
        },
        {
          "number": 143,
          "created_at": "2023-02-24T14:57:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 144,
          "created_at": "2023-03-02T22:19:28Z",
          "last_comment_at": "2023-03-10T09:48:05Z",
          "last_comment_author": "jakobnissen"
        },
        {
          "number": 147,
          "created_at": "2023-03-23T21:54:39Z",
          "last_comment_at": "2023-03-24T16:19:55Z",
          "last_comment_author": "u-xixi"
        },
        {
          "number": 153,
          "created_at": "2023-04-10T19:50:29Z",
          "last_comment_at": "2023-04-11T20:51:37Z",
          "last_comment_author": null
        },
        {
          "number": 170,
          "created_at": "2023-05-03T15:16:05Z",
          "last_comment_at": "2023-05-08T13:23:56Z",
          "last_comment_author": "microbiomix"
        },
        {
          "number": 219,
          "created_at": "2023-10-09T06:51:03Z",
          "last_comment_at": "2023-10-12T12:32:08Z",
          "last_comment_author": "ChaoXianSen"
        },
        {
          "number": 232,
          "created_at": "2023-10-24T15:36:38Z",
          "last_comment_at": "2024-06-07T23:33:05Z",
          "last_comment_author": "ShriramHPatel"
        },
        {
          "number": 258,
          "created_at": "2023-11-10T09:42:44Z",
          "last_comment_at": "2024-07-04T13:06:16Z",
          "last_comment_author": "jakobnissen"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/RasmussenLab/vamb",
    "host": "github.com",
    "name": "vamb",
    "owner": "RasmussenLab"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 42,
        "vitality": 41,
        "community": 68,
        "governance": 63,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 41,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "commits_last_year": 15,
              "human_commit_share": 1,
              "days_since_last_push": 85,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 85 days ago",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 85
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "15 commits in the last year",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "releases_count": 25,
              "latest_release_tag": "v5.0.4",
              "releases_from_tags": false,
              "days_since_latest_release": 448,
              "mean_days_between_releases": 84.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "25 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 448 days ago",
                "points": 7.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 448
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~84.6 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 84.6
                    }
                  }
                ],
                "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": 85,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 85 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 85
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 68,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "forks": 51,
              "stars": 330,
              "watchers": 6,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "330 stars",
                "points": 40.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 330
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "51 forks",
                "points": 14.2,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "6 watchers",
                "points": 3.9,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": true,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 7.2,
                "status": "met",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 63,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 10,
              "top_contributor_share": 0.799
            },
            "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 80% of commits",
                "points": 4.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 80
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "10 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 14 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "merged_prs": 175,
              "open_issues": 48,
              "closed_issues": 224,
              "issue_closed_ratio": 0.824,
              "closed_unmerged_prs": 14
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "82% of issues closed",
                "points": 38.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 82
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "175/189 decided PRs merged",
                "points": 35.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 175,
                      "decided": 189
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/10 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "followers": 87,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "RasmussenLab",
              "public_repos": 41,
              "account_age_days": 2629
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "87 followers of RasmussenLab",
                "points": 14,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 87,
                      "login": "RasmussenLab"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "41 public repos, account ~7 yr old",
                "points": 23.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 41
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "packages": [
                "vamb"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 448
            },
            "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 448 days ago",
                "points": 14,
                "status": "partial",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 448
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "17 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 66,
        "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": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "9 out of 10 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.6
            },
            "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": "9 out of 10 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 2/10 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 14 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "moderate",
            "name": "Dependency advisories",
            "note": "Matched the pypi:vamb@5.0.4 runtime dependency closure — what installing the published package pulls in — 37 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:vamb@5.0.4",
                  "assessed": 37
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "source": "osv",
              "advisories": 24,
              "affected_packages": 1,
              "assessed_packages": 37,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: torch 2.6.0 (high 8.8)",
                "points": 10.4,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "torch 2.6.0 (high 8.8)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "1 advisory-carrying package(s) unaddressed past 90 days; oldest published 498 days ago",
                "points": 32.8,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_stale",
                    "params": {
                      "days": 90,
                      "count": 1,
                      "oldest": 498
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 37,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 13
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 32,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.66,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "66 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 35.2,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 66,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "critical",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 22,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 91868,
              "source_files_sampled": 40,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/40 source files over 60KB",
                "points": 53.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [],
  "report_type": "repository",
  "generated_at": "2026-07-22T05:43:59.063234Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/RasmussenLab/vamb.svg",
  "full_name": "RasmussenLab/vamb",
  "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.26.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.