Звіт у форматі 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"
}