公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 05:43 UTC

RasmussenLab / vamb

Variational autoencoder for metagenomic binning

PythonMIT★ 330 星标⑂ 51 复刻始于 2018年5月在 GitHub 上查看 ↗

RasmussenLab/vamb 的健康指数为 100 分中的 56 分,处于「中等」区间。 其得分最高的类别是Community & Adoption(68/100),最低的是AI Readiness(32/100)。 最近一次更新在 85 天前。 近期的大部分工作由 1 位贡献者完成。

56
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

56
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

87 关注者41 个公开仓库始于 2019年5月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
PyPIvamb5.0.4-17448 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

41存在风险 · 占总体的 22%

开发活跃度

33存在风险
评分方式
18/36推送新近度 — 最近一次推送于 85 天前
4.2/36提交节奏 — 52 周中有 6 周有提交
10.8/18提交量 — 最近一年 15 次提交
0/10OpenSSF Scorecard:Maintained — 1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
所用输入
commits_last_year15
human_commit_share1
days_since_last_push85
active_weeks_last_year6

发布纪律

54中等
评分方式
27/27有发布版本 — 已发布 25 个发布版本
7.2/36发布时效 — 最近一次发布版本于 448 天前
19.8/27发布节奏 — 约每 84.6 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count25
latest_release_tagv5.0.4
releases_from_tags
days_since_latest_release448
mean_days_between_releases84.6

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

68中等 · 占总体的 18%
评分方式
40.8/60星标 — 330 个星标
14.2/25复刻 — 51 个复刻
3.9/15关注者 — 6 位关注者
所用输入
forks51
stars330
watchers6
growth_stateorganic
growth_factor_pct100

社区健康

78良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
7.2/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

63中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
4.5/22.5提交分布 — 头号贡献者编写了 80% 的提交
13.5/13.5贡献者广度 — 10 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 14 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled10
top_contributor_share0.799
评分方式
38.5/46.8议题解决 — 82% 的议题已关闭
35.4/38.3PR 接受 — 已裁定的 PR 中 175/189 已合并
3/15OpenSSF Scorecard:Code-Review — Found 2/10 approved changesets -- score normalized to 2
所用输入
merged_prs175
open_issues48
closed_issues224
issue_closed_ratio0.824
closed_unmerged_prs14
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
14/25所有者影响力 — RasmussenLab 有 87 位关注者
23.8/25既往记录 — 41 个公开仓库,账户约 7 年
所用输入
followers87
owner_typeOrganization
is_verified
owner_loginRasmussenLab
public_repos41
account_age_days2,629
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
14/35发布时效 — 最近一次发布于 448 天前
20/20版本历史 — 17 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesvamb
ecosystemspypi
any_deprecated
min_days_since_publish448

工程质量

基础的工程与文档实践是否到位?

66中等 · 占总体的 20%

工程实践

66中等
评分方式
24/24CI 工作流 — 4 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
18/20OpenSSF Scorecard:CI-Tests — 9 out of 10 merged PRs checked by a CI test -- score normalized to 9
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

65中等
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

42存在风险 · 占总体的 16%

安全态势

36存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
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.5许可证 — 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 — 无数据
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
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3.6
已排除计分(无数据或不适用):branch_protection, packaging。 其余权重已重新归一化。
评分方式
10.4/35直接依赖不含已知公告 — 1 个受影响:torch 2.6.0 (high 8.8)
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
32.8/40没有长期未处理的公告 — 1 个携带公告的软件包超过 90 天未处理;最早一条发布于 498 天前
所用输入
sourceosv
advisories24
affected_packages1
assessed_packages37
unassessed_packages0
affected_by_severityhigh 1
direct_affected_packages1
比对的是 pypi:vamb@5.0.4 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 37 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

32存在风险 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
35.2/40可读的提交历史 — 100 次人类提交中有 66 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.66
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
53.6/55可控的文件大小 — 采样的 40 个源文件中有 1 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes91,868
source_files_sampled40
oversized_source_files1

关键数据

330GitHub 星标
10贡献者
15最近 12 个月提交数
85距最近推送天数
25发布版本数
1巴士系数(bus factor)
48开放议题
PyPI软件包生态系统数

更多细节

Star 与 Fork 历史 330 ★ / 51 ⇿
330Star
51Fork
25发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

012525037533048192018-092022-082026-07
主版本 4次版本 2修订 18

每个点涵盖 8 天。

OpenSSF Scorecard 3.6 / 10
3.6综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 05:43 UTC

10Binary-Artifactsno binaries found in the repo
不适用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
不适用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
直接依赖 10
注册表软件包版本约束清单文件
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
全部依赖 10

来自 GitHub 依赖图的完整解析依赖集合:10 个直接依赖与 0 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
PyPIdadaptation3.2直接
PyPIloguru0.7.3直接
PyPInetworkx3.4.2直接
PyPInumpy1.26.4直接
PyPIpycoverm0.6.2直接
PyPIpyhmmer0.10.15直接
PyPIpyrodigal3.6.3直接
PyPIscikit-learn1.6.1直接
PyPItorch2.6.0直接
PyPIvambcore0.1.2直接
依赖安全公告 1

安装 pypi:vamb@5.0.4 会引入 37 个包(直接与传递):其中 1 个存在已知公告,1 个为直接依赖。

软件包版本关系严重程度公告数修复版本
torch2.6.0直接242.13.0

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.26.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计PyPI.