Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-29 11:54 UTC

astra-toolbox / astra-toolbox

ASTRA Tomography Toolbox

C++ · CudaGPL-3.0★ 611 stars⑂ 234 forkssince Dec 2014View on GitHub ↗

astra-toolbox/astra-toolbox holds a health index of 59 out of 100, placing it in the Moderate band. It scores highest on Vitality (87/100) and lowest on Engineering Quality (30/100). It was last updated today. A single contributor accounts for most of its recent work.

59
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

59
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

astra-toolboxOrganization
26 followers4 public repossince Oct 2014

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
PyPIastra-toolbox2.5.06,849842 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

87Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
26.3/36Commit cadence — 38/52 weeks with commits
18/18Commit volume — 177 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year177
human_commit_share1
days_since_last_push0
active_weeks_last_year38
How it's scored
27/27Ships releases — 17 releases published
36/36Release recency — latest release 42 days ago
19.8/27Release cadence — a release every ~118.3 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count17
latest_release_tagv2.5.0
releases_from_tagsno
days_since_latest_release42
mean_days_between_releases118.3

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

75Good · 18% of overall
How it's scored
45.2/60Stars — 611 stars
19.7/25Forks — 234 forks
8.7/15Watchers — 37 watchers
Inputs used
forks234
stars611
watchers37
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

85Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (GPL-3.0)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateno
How it's scored
51.1/80Monthly downloads — 6,849 downloads/month across pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesastra-toolbox
dependents
ecosystemspypi
total_downloads
monthly_downloads6,849
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

62Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
3.9/22.5Commit distribution — top contributor authored 83% of commits
13.5/13.5Contributor breadth — 24 contributors
10/10OpenSSF Scorecard: Contributors — project has 7 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled24
top_contributor_share0.827
How it's scored
42.3/46.8Issue resolution — 90% of issues closed
24.8/38.3PR acceptance — 90/139 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 1/24 approved changesets -- score normalized to 0
Inputs used
merged_prs90
open_issues36
closed_issues344
issue_closed_ratio0.905
closed_unmerged_prs49
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
10.3/25Owner reach — 26 followers of astra-toolbox
17.1/25Track record — 4 public repos, account ~11 yr old
Inputs used
followers26
owner_typeOrganization
is_verified
owner_loginastra-toolbox
public_repos4
account_age_days4,290
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 42 days ago
20/20Version history — 8 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesastra-toolbox
ecosystemspypi
any_deprecatedno
min_days_since_publish42

Engineering Quality

Are baseline engineering and documentation practices in place?

30At risk · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 2 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

40At risk
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
0/10Wiki
Inputs used
topics
has_wikino
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

33At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/24 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 7 contributing companies or organizations
0/10Dangerous-Workflow — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — no data
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3.3
Excluded from scoring (no data or not applicable): dangerous_workflow, packaging, token_permissions. Remaining weights renormalized.

AI Readiness

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.

37At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
8.5/40Legible commit history — 16 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.16
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — C++ (statically typed)
0/10Reproducible environment
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — C++ (statically typed)
54.7/55Manageable file sizes — 2/429 source files over 60KB
Inputs used
primary_languageC++
largest_source_bytes118,345
source_files_sampled429
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples, samples
Inputs used
example_dirsexamples, samples
has_mcp_signalno
api_schema_files

Key facts

611GitHub stars
24contributors
177commits, last 12 months
0days since last push
17releases
1bus factor
36open issues
PyPIpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

More detail

Star and fork history 0 ★ / 234 ⇿
0Stars
234Forks
17Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0408012016020024022642014-122020-092026-07
Major 1Minor 5Patch 4

Each point covers 11 days.

OpenSSF Scorecard 3.3 / 10
3.3aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-29 11:54 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/24 approved changesets -- score normalized to 0
10Contributorsproject has 7 contributing companies or organizations
n/aDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
n/aToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
All dependencies 1

Full resolved dependency set from the GitHub dependency graph: 0 direct and 1 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
PyPIcythonindirect
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies carried a version and a supported ecosystem

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 5196,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C": 21525,
        "M4": 19437,
        "C++": 1635192,
        "Cuda": 311099,
        "Shell": 109629,
        "Cython": 105211,
        "MATLAB": 276878,
        "Python": 272662,
        "Makefile": 22212,
        "Batchfile": 5717,
        "PowerShell": 4649
      },
      "pushed_at": "2026-07-29T08:32:50Z",
      "created_at": "2014-12-12T11:12:10Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-29T08:35:15Z",
      "description": "ASTRA Tomography Toolbox",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "master",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "C++",
      "significant_languages": [
        "C++",
        "Cuda"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "astra-toolbox",
      "company": null,
      "location": null,
      "followers": 26,
      "avatar_url": "https://avatars.githubusercontent.com/u/9461713?v=4",
      "created_at": "2014-10-30T11:13:40Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 4290
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-3.0",
      "raw_spdx": "GPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2026-06-17T05:44:27Z"
        },
        {
          "tag": "v2.4.1",
          "kind": "patch",
          "published_at": "2025-12-16T13:53:13Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2025-08-04T08:38:04Z"
        },
        {
          "tag": "v2.3.1",
          "kind": "patch",
          "published_at": "2025-04-18T08:49:13Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2025-02-22T14:38:41Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2024-07-12T12:43:59Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2022-02-02T09:27:43Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2021-11-11T12:02:14Z"
        },
        {
          "tag": "v1.9.0.dev11",
          "kind": "other",
          "published_at": "2023-07-18T08:53:46Z"
        },
        {
          "tag": "v1.8.3",
          "kind": "patch",
          "published_at": "2023-07-18T08:33:11Z"
        },
        {
          "tag": "v1.8",
          "kind": "other",
          "published_at": "2023-07-18T08:32:30Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2023-07-18T08:31:31Z"
        },
        {
          "tag": "v1.7",
          "kind": "other",
          "published_at": "2023-07-18T08:31:02Z"
        },
        {
          "tag": "v1.6",
          "kind": "other",
          "published_at": "2023-07-18T08:29:55Z"
        },
        {
          "tag": "v1.5",
          "kind": "other",
          "published_at": "2023-07-18T08:28:28Z"
        },
        {
          "tag": "v1.4",
          "kind": "other",
          "published_at": "2023-07-18T08:27:38Z"
        },
        {
          "tag": "v1.3",
          "kind": "other",
          "published_at": "2023-07-18T08:22:49Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "0182d87ca4e3e36987699656752f40f5c3a0bbca",
          "body": "Calling LinearOperator.__init__() ensures ndim and _xp are initialized.",
          "is_bot": false,
          "headline": "Fix OpTomo compatibility with scipy 1.18",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-07-29T08:30:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6394c9aea595ac2b8a6b8b428444821367fc3e5",
          "body": "pytest.mark.parametrize started treating strings with a trailing comma\nas tuples in https://github.com/pytest-dev/pytest/issues/719",
          "is_bot": false,
          "headline": "Fix compatibility with pytest 9.1",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-07-29T07:53:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b62d265a09b9d3a82ea16a9ea20784532d45271e",
          "body": null,
          "is_bot": false,
          "headline": "Allow logical type in Matlab config structs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-07-27T17:55:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e29e2ad609c62de07a80510e965ec2675a56a027",
          "body": "This prevents inlined methods accessing the mutex of CAstraIndexManager\nand CAstraObjectManager, which could potentially be an issue in Windows\nwhen this crosses a DLL boundary.",
          "is_bot": false,
          "headline": "Remove inlined object manager methods",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-06-18T08:37:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd7d88e844ea120f9112a2157f023f4e25a735e8",
          "body": null,
          "is_bot": false,
          "headline": "Bump up development version",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-17T08:21:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "934920a46781142c2b8f0177007c395eae601783",
          "body": null,
          "is_bot": false,
          "headline": "Version 2.5.0",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-17T05:12:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b29039e96772a50e5f00c1c35fc0df6f4232317",
          "body": "Apparently, sumsq is a part of Deep Learning toolbox at the moment.",
          "is_bot": false,
          "headline": "Fix sample requiring an additional toolbox",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T12:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d911e192f03a804199bafe4e3078c685e30468bb",
          "body": null,
          "is_bot": false,
          "headline": "Add tomlib to the build env for Python < 3.11",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T12:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04aee2f26ace2cffdc6d653ced061c38bf0c7ece",
          "body": null,
          "is_bot": false,
          "headline": "Return to the script directory in build scripts",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T11:20:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cdc47a6c8fc06909be0f7a01c9fb5f8316efdfb",
          "body": null,
          "is_bot": false,
          "headline": "Add windows PyPI wheels build script",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T11:20:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5ba4f5ee8a7f51949fae29a9650de8ba86c69da",
          "body": null,
          "is_bot": false,
          "headline": "Update project files",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T09:55:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa83a17e8ca7e20da1603c98c275c06aa5330289",
          "body": "The crash comes from incompatibility in the msvcp140.dll shipped by Matlab, see: https://nl.mathworks.com/matlabcentral/answers/2147499-why-does-matlab-r2024a-crash-when-running-a-mex-file-compiled-with-the-microsoft-visual-studio-2022",
          "is_bot": false,
          "headline": "Fix crash in Matlab",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T09:54:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31527ca9356ef93345082243bfbc16e563cdbf61",
          "body": null,
          "is_bot": false,
          "headline": "Remove CUDA includes from MEX project files",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-06-15T09:54:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf7110eafeaa696f6204a75be171ca1be657c5b5",
          "body": "In the case where SIRT_CUDA was used with a reconstruction mask but\nwithout a sinogram mask, this would overwrite the projection data.",
          "is_bot": false,
          "headline": "Fix SIRT_CUDA buffer usage",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-06-01T16:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a42aba60a14736fd5ba74f6130aed805f12a4bb5",
          "body": null,
          "is_bot": false,
          "headline": "Add CUDA 13.3 to build envs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-06-01T08:59:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14515fa883d89ce2d77e1644ec21fdf69ab686e0",
          "body": "On Windows, we can't use dllexport and thread_local together.\nDisable freethreading support there until we work around that.",
          "is_bot": false,
          "headline": "Disable Python freethreading support on Windows",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-28T13:52:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f3fa0e0dd9c39d51a8c22460fe6b8f5d2e632d5",
          "body": null,
          "is_bot": false,
          "headline": "Build pypi package for cp314t",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-27T11:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "144988f8215952f8d4db5bb9c8f1ab510e2bc8a5",
          "body": null,
          "is_bot": false,
          "headline": "Update manylinux platform",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-27T11:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e7e45b0607e86f815c8fc11d246a825a2c707d5",
          "body": "Scipy/numpy wheels are no longer supporting older versions.",
          "is_bot": false,
          "headline": "Update manylinux build container to 2.28",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-27T11:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af49de12fc224c911c59f582830b8fe71abd7d44",
          "body": null,
          "is_bot": false,
          "headline": "Build cuda13 conda packages with cuda 13.2",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-27T11:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71bb77d25739157acbafcd66df6074a69a4a15c0",
          "body": null,
          "is_bot": false,
          "headline": "Create build envs by major cuda version",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-27T09:40:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f65bfcc19858df571f9139667f90e5d43cd0f7b",
          "body": null,
          "is_bot": false,
          "headline": "Add new CUDA point-releases to build envs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-26T12:46:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9d264720228def23aafc2faef543f312888f064",
          "body": "This old check was too strict, requiring numpy specifically. This is\nnow being handled by the dlpack checks.",
          "is_bot": false,
          "headline": "Remove outdated check in data2d.link",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-26T11:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c338cc9bf9806e29d557e513923311f18459d45",
          "body": "Fix macOS build",
          "is_bot": false,
          "headline": "Merge pull request #626 from askorikov/fix_macos_build",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-20T18:13:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c70413297a2f94c0db244a676153b66e7daeb4e",
          "body": null,
          "is_bot": false,
          "headline": "Update installation instructions for macos",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-20T15:49:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb6ad09bf792e973f6139e0c23bc889559019e5e",
          "body": "Set the library id to @rpath/$SONAME so that the\nrelative path is correctly embedded in modules by\nthe linker without having to patch it afterwards.",
          "is_bot": false,
          "headline": "Fix runtime linking against shared lib on macos",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-20T15:49:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98a2422b2d2e1977d1669709f139a260ace5ee79",
          "body": null,
          "is_bot": false,
          "headline": "Fix RPATH setting on macos",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-18T20:12:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd34ed613b98e8a33ceb7be415216e5c8b3d758d",
          "body": null,
          "is_bot": false,
          "headline": "Fix shared lib not bundled with the wheel on macos",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-18T20:12:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb80a6cadc8d2ef72adc5ab3de710a0525a85a10",
          "body": null,
          "is_bot": false,
          "headline": "Add MEX suffix for macos-aarch64",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-17T10:25:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1770b36859247860ddc59664bccb34b2b5c41323",
          "body": null,
          "is_bot": false,
          "headline": "Fix thread_local not supported on old macos",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-16T13:32:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58da582b2113d6145a58d7650146523b54604063",
          "body": "libc++ is distributed with the clang toolchain by default.",
          "is_bot": false,
          "headline": "Switch to libc++ on macos",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-05-16T13:31:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b278346648b7d5bdd2e1c926448124029a08170",
          "body": null,
          "is_bot": false,
          "headline": "Add missing dir to 'make clean'",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-13T11:00:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c3ea4a02ebeb5b7d57ffc50839f304122834443",
          "body": "This silences false positives.",
          "is_bot": false,
          "headline": "Resolve warnings",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-11T14:42:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c5c3e7f0169680d11fce6f0617cffb9bbd38dbb",
          "body": "Support python freethreading",
          "is_bot": false,
          "headline": "Merge pull request #588 from wjp/freethreading",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-05-11T12:22:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae4def1284d6a8f177ca3775796f36dff7cd55a1",
          "body": null,
          "is_bot": false,
          "headline": "Let worker threads report last error back to main thread",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32a43013a7a987048680e60584be20e47706cf1a",
          "body": null,
          "is_bot": false,
          "headline": "Make LastErrMsg thread-local",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d389baafc3364acc0f7e0be27129baf6bac5b7c",
          "body": null,
          "is_bot": false,
          "headline": "Make global GPU param access thread-safe",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13510caaaa54dcf26eebcbc3e554afd9c485a3da",
          "body": "Specifically, this no longer sets a single GPU index as global state in\nCompositeGeometryManager.",
          "is_bot": false,
          "headline": "Make set_gpu_index behave like cudaSetDevice in multi-threaded contexts",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89137a633a6051ad45ca82711f700781bdfd883e",
          "body": null,
          "is_bot": false,
          "headline": "Add freethreading_compatible Cython directive",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ad14ef2accd5d1db3d009e6d7258702d054e827",
          "body": null,
          "is_bot": false,
          "headline": "Add check for Cython >= 3.1",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "163ae41e32316a08b7953c724a6de97569db2a5f",
          "body": null,
          "is_bot": false,
          "headline": "Accept multiple GPU indices in 3D CUDA algorithms that support it",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4231debb7466c34b3633b88bd0671acf0002e760",
          "body": null,
          "is_bot": false,
          "headline": "Add allowScalar option to getOptionIntArray",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7ba87b19f7572edf7d635f4dc355f9c4671e2d9",
          "body": "These require Python 3.13. We add wrapper functions for Python < 3.13\nwhich duplicate the functionality but are not thread-safe. Since\nfreethreading was only introduced in Python 3.13, this is not an issue.",
          "is_bot": false,
          "headline": "Use strong reference variants of PyDict_Get* for thread-safety",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae3c9de98749466d564fba92c073d325dca2d143",
          "body": null,
          "is_bot": false,
          "headline": "Add cp313t/cp314t envs to manylinux container",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T10:33:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c71b34acc344e198c8d77f494af0b10a18e1007f",
          "body": "Add direct_FP/BP functions",
          "is_bot": false,
          "headline": "Merge pull request #624 from wjp/direct",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T09:25:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2154714468e2ae4011beeaf09bb4d3815b00265",
          "body": null,
          "is_bot": false,
          "headline": "Add tests for astra.projector3d.direct_FP/BP",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T08:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e7fe761a4965a4391ec6f2ed7096cdd48acbdf6",
          "body": null,
          "is_bot": false,
          "headline": "Add tests for astra.projector.direct_FP/BP",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T08:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5083918f0165226a5461d3cab985deaf7347d50",
          "body": null,
          "is_bot": false,
          "headline": "Add astra.projector3d.direct_FP/BP",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T08:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3ac92fd945acafaa29f3ba093aaaec1eec257d7",
          "body": null,
          "is_bot": false,
          "headline": "Add astra.projector.direct_FP/BP",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-30T08:53:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1a10842d45e263b6a359f842d10a9139949cb23",
          "body": "This case should be unreachable in theory.",
          "is_bot": false,
          "headline": "Fix memory leak in error case",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-28T09:05:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00ee25674f6cd907c28ceb006c942fe622e1e3e7",
          "body": null,
          "is_bot": false,
          "headline": "Add extra filter config check to FDK_CUDA",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-28T09:05:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39063c03a8865714b5148bacde6ab7593cbb423a",
          "body": null,
          "is_bot": false,
          "headline": "Remove minor dead code",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-28T08:57:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a198f981688577f6fa4e3faa91593ee4e7f9a46",
          "body": null,
          "is_bot": false,
          "headline": "Add data type checks to Shepp-Logan generator",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-28T08:55:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "294879e03d2225f2beceb40a4cb3fffda090b485",
          "body": null,
          "is_bot": false,
          "headline": "Add conda-forge info",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-04-23T18:06:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fbedea66c9fff159317b330879d88e09260ca2d",
          "body": null,
          "is_bot": false,
          "headline": "Remove development packages info",
          "author_name": "Alexander Skorikov",
          "author_login": "askorikov",
          "committed_at": "2026-04-23T18:06:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ab6b24469d054731c34fe17b9362df42244fad6",
          "body": null,
          "is_bot": false,
          "headline": "Log any direct_FP2D/BP2D alg init errors",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-22T09:11:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27a032d8b2feda0394667467eb62cd968dde7079",
          "body": null,
          "is_bot": false,
          "headline": "Enable fixed ART/SART tests",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-21T09:14:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b99da9c3beca3f6a0c1eb7e4871de9720e55657e",
          "body": null,
          "is_bot": false,
          "headline": "Fix handling of missing RayOrderList in ART",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-21T09:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac3eb9175ae4ece56400f53a05d8206762a692d8",
          "body": null,
          "is_bot": false,
          "headline": "Fix config int array options",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-21T09:13:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8efa8081d8cf437efb2aedacbaa59a546268dc3",
          "body": null,
          "is_bot": false,
          "headline": "Add ASTRA_CUDA guards for consistency",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-17T12:40:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adff76a5d7ede541b896671213cc0061f3cb66f0",
          "body": "Add support for 2D GPU dlpack tensors",
          "is_bot": false,
          "headline": "Merge pull request #620 from wjp/gpudata",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-17T12:21:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07fa1896b333caeb827c87f45eed3cbf6302f5c3",
          "body": null,
          "is_bot": false,
          "headline": "Add direct_FP2D/BP2D tests",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:53:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "840f720e255aafe121e123f162dca7ec622cd419",
          "body": null,
          "is_bot": false,
          "headline": "Remove some globals",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00cd2876c154982a3d63e8721db12152ffbf359d",
          "body": null,
          "is_bot": false,
          "headline": "Add data checks to 2D algs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c2dc22f72dbbb53c685149322c2e4a1e00c0a7d",
          "body": null,
          "is_bot": false,
          "headline": "Add data checks to 3D algs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a64e7be08759c0ea548c29805b709621cc2002a9",
          "body": null,
          "is_bot": false,
          "headline": "Add extra pitch asserts",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88da7341e940b542d77da1657e30010bfaaf7626",
          "body": null,
          "is_bot": false,
          "headline": "Add 2D dlpack tests",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d329af1ce8ff3ee899f18ad1d642a3531194a86",
          "body": null,
          "is_bot": false,
          "headline": "Add direct_FP2D/BP2D",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7404fed1838f123675c84c7e251343e4275927dd",
          "body": null,
          "is_bot": false,
          "headline": "Enable 2D gpu tensor linking",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1e5aa52fb525dd420c37f4437c2c6f7e7d1493d",
          "body": null,
          "is_bot": false,
          "headline": "Accept GPU tensors in 2D CUDA algs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d303b992872855f9681a293300c884712cbe23fd",
          "body": null,
          "is_bot": false,
          "headline": "Add CUDA 13.2.1 to build envs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T11:50:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a953486d96fcd9a285fef1530cab4bdf3aee8fe",
          "body": null,
          "is_bot": false,
          "headline": "Fix BP_CUDA memory initialization",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-16T08:59:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96409b933d5f1aa04ef20e44b0f3f907ea3df787",
          "body": null,
          "is_bot": false,
          "headline": "Reset error state after failing cudaGetDeviceProperties",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-08T16:53:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c07e72e32d999568dbb1c23627ca4e783a5371e8",
          "body": null,
          "is_bot": false,
          "headline": "Skip multi-gpu test on single-gpu system",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-08T16:49:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1757c3b3743636088583890f9c55fbad2673193b",
          "body": null,
          "is_bot": false,
          "headline": "Add (experimental) rocm/hip dlpack tensor support",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-08T14:30:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27dda5f607d80d419367539ed64e93370f652683",
          "body": null,
          "is_bot": false,
          "headline": "Add error checks to dotProduct2D",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-08T09:18:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ab0892dd9714fa1f917585b116de37c3b23aa0f",
          "body": null,
          "is_bot": false,
          "headline": "Add more tests for get_res_norm",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-08T09:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "653900a5e7d48f7fe08f5a6014443efb3260e959",
          "body": null,
          "is_bot": false,
          "headline": "Fix EM::getResidualNorm",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-08T08:40:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "551ac858193d4e3e6a42a5e3af1046d532ea6f15",
          "body": "Refactor internal CUDA interface",
          "is_bot": false,
          "headline": "Merge pull request #617 from wjp/gpudata",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T14:26:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de7de7e4d4c5fa3f43c5e8571cd629228355449b",
          "body": null,
          "is_bot": false,
          "headline": "Remove unused VolumeGeometry3D utility functions",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8efd44019727e280fa11cf6cb1351781cfa3ee7e",
          "body": null,
          "is_bot": false,
          "headline": "Make some double-to-float casts explicit",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94f7640fbeb3f8dc3b151f3f4971c9fe9c5499a0",
          "body": null,
          "is_bot": false,
          "headline": "Remove unused define",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a5f0ebc17527fb056ec95791e56760cf23d1644",
          "body": null,
          "is_bot": false,
          "headline": "Remove unused variable",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4adfd0768253fab1c5b746f2b61ef0d916eff47e",
          "body": null,
          "is_bot": false,
          "headline": "Suppress deprecated GPU target warning on Windows",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f02529c9189db8565b37557f1034477ff592e0d7",
          "body": "MSVC docs suggest removing dllexport from full classes, and only adding\nit to specific member functions to be exported.",
          "is_bot": false,
          "headline": "Suppress MSVC warnings related to dllexport",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a8445afc1a5a718531207e9c14f553ad0f4847",
          "body": null,
          "is_bot": false,
          "headline": "Remove duplicate init",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a919171d919cf58a7b39cbd91ca4dfe76d79199a",
          "body": null,
          "is_bot": false,
          "headline": "Fix signedness mismatch",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1abbc2557acbc234797f907a27bddcfb466765d0",
          "body": null,
          "is_bot": false,
          "headline": "Suppress some sign comparison warnings",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c4e7d8bbf56684f99613011fe42cf80029ba37f",
          "body": null,
          "is_bot": false,
          "headline": "Re-enable some warnings",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "394c0a596c3410c500c519c51f95243d60c95def",
          "body": null,
          "is_bot": false,
          "headline": "Handle more 3D cuda errors",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b987d92f5ef1730a9e4a05c5a1294c6fd15c7f20",
          "body": null,
          "is_bot": false,
          "headline": "Remove duplicate setGPUIndex function",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b88b627782745d4f3dacb264162d8bb4888433a7",
          "body": null,
          "is_bot": false,
          "headline": "Handle more 2D cuda errors",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "347db7dfd25191d4bac6cc788cc1cd5b6b6babf0",
          "body": "logCuda is intended to signal errors are non-fatal (typically in cleanup\nor error-handling code paths).",
          "is_bot": false,
          "headline": "Mark checkCuda as [[nodiscard]] and add logCuda alias",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1200adae4ccaf567b85894d21c1472809030f990",
          "body": null,
          "is_bot": false,
          "headline": "Resolve unused variable warnings",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95068aff79596631bb51d1261aced4a1ccaa306a",
          "body": null,
          "is_bot": false,
          "headline": "Use std::abs",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a485b90e2e71ec76eb6001beea4bd627e1e674fa",
          "body": null,
          "is_bot": false,
          "headline": "Convert 2D CUDA code to new CData2D-based interface",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-04-07T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1b95b7de7f371be42af887ea435489c3cda41fc",
          "body": null,
          "is_bot": false,
          "headline": "Use new functions to clean up allocations",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-03-23T14:46:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2e255444c9ecb4c508c87e4f89bbcba103fb169",
          "body": null,
          "is_bot": false,
          "headline": "Add convenience functions to allocate GPU memory",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-03-23T14:46:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe52c0e1206400e9c7d52601ade86af7890579d",
          "body": null,
          "is_bot": false,
          "headline": "Remove unused include",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-03-23T14:46:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7b9553e59ef764efd907cf0df82de7cc4d97057",
          "body": null,
          "is_bot": false,
          "headline": "Introduce Geometry2DParameters, matching 3D",
          "author_name": "Willem Jan Palenstijn",
          "author_login": "wjp",
          "committed_at": "2026-03-23T14:46:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 17,
      "commits_last_year": 177,
      "latest_release_at": "2026-06-17T05:44:27Z",
      "latest_release_tag": "v2.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 38,
      "days_since_latest_release": 42,
      "mean_days_between_releases": 118.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "astra-toolbox",
          "exists": true,
          "license": "GPLv3",
          "keywords": [],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/astra-toolbox/",
          "is_deprecated": false,
          "latest_version": "2.5.0",
          "repository_url": "https://github.com/astra-toolbox/astra-toolbox",
          "versions_count": 8,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 6849,
          "first_published_at": "2016-05-09T16:07:41.162696Z",
          "latest_published_at": "2026-06-17T05:22:35.860247Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 42
        }
      ]
    },
    "popularity": {
      "forks": 234,
      "stars": 611,
      "watchers": 37,
      "fork_history": {
        "days": [
          {
            "date": "2014-12-12",
            "count": 1
          },
          {
            "date": "2014-12-18",
            "count": 1
          },
          {
            "date": "2015-03-28",
            "count": 1
          },
          {
            "date": "2015-04-13",
            "count": 1
          },
          {
            "date": "2015-05-13",
            "count": 1
          },
          {
            "date": "2015-05-26",
            "count": 1
          },
          {
            "date": "2015-06-23",
            "count": 1
          },
          {
            "date": "2015-07-06",
            "count": 1
          },
          {
            "date": "2015-07-16",
            "count": 1
          },
          {
            "date": "2015-08-28",
            "count": 1
          },
          {
            "date": "2015-10-30",
            "count": 1
          },
          {
            "date": "2015-12-04",
            "count": 1
          },
          {
            "date": "2015-12-08",
            "count": 1
          },
          {
            "date": "2016-01-09",
            "count": 1
          },
          {
            "date": "2016-03-09",
            "count": 1
          },
          {
            "date": "2016-04-19",
            "count": 1
          },
          {
            "date": "2016-05-04",
            "count": 1
          },
          {
            "date": "2016-05-15",
            "count": 1
          },
          {
            "date": "2016-05-18",
            "count": 1
          },
          {
            "date": "2016-07-04",
            "count": 1
          },
          {
            "date": "2016-07-06",
            "count": 1
          },
          {
            "date": "2016-08-19",
            "count": 1
          },
          {
            "date": "2016-09-15",
            "count": 1
          },
          {
            "date": "2016-10-04",
            "count": 1
          },
          {
            "date": "2016-10-29",
            "count": 1
          },
          {
            "date": "2016-11-21",
            "count": 1
          },
          {
            "date": "2016-11-24",
            "count": 1
          },
          {
            "date": "2016-12-12",
            "count": 1
          },
          {
            "date": "2016-12-13",
            "count": 1
          },
          {
            "date": "2017-01-09",
            "count": 1
          },
          {
            "date": "2017-01-23",
            "count": 1
          },
          {
            "date": "2017-02-21",
            "count": 1
          },
          {
            "date": "2017-03-10",
            "count": 1
          },
          {
            "date": "2017-03-16",
            "count": 1
          },
          {
            "date": "2017-04-03",
            "count": 1
          },
          {
            "date": "2017-04-23",
            "count": 1
          },
          {
            "date": "2017-07-18",
            "count": 1
          },
          {
            "date": "2017-08-23",
            "count": 1
          },
          {
            "date": "2017-09-22",
            "count": 1
          },
          {
            "date": "2017-09-30",
            "count": 1
          },
          {
            "date": "2017-10-05",
            "count": 1
          },
          {
            "date": "2017-10-08",
            "count": 1
          },
          {
            "date": "2017-10-11",
            "count": 1
          },
          {
            "date": "2017-10-24",
            "count": 1
          },
          {
            "date": "2017-11-15",
            "count": 1
          },
          {
            "date": "2017-11-29",
            "count": 1
          },
          {
            "date": "2017-12-28",
            "count": 1
          },
          {
            "date": "2018-01-29",
            "count": 1
          },
          {
            "date": "2018-01-30",
            "count": 1
          },
          {
            "date": "2018-02-07",
            "count": 1
          },
          {
            "date": "2018-02-19",
            "count": 1
          },
          {
            "date": "2018-02-24",
            "count": 1
          },
          {
            "date": "2018-03-20",
            "count": 1
          },
          {
            "date": "2018-04-20",
            "count": 1
          },
          {
            "date": "2018-05-22",
            "count": 1
          },
          {
            "date": "2018-05-30",
            "count": 1
          },
          {
            "date": "2018-06-06",
            "count": 1
          },
          {
            "date": "2018-06-20",
            "count": 1
          },
          {
            "date": "2018-06-28",
            "count": 1
          },
          {
            "date": "2018-06-29",
            "count": 2
          },
          {
            "date": "2018-08-03",
            "count": 1
          },
          {
            "date": "2018-08-07",
            "count": 1
          },
          {
            "date": "2018-09-17",
            "count": 1
          },
          {
            "date": "2018-10-01",
            "count": 1
          },
          {
            "date": "2018-10-12",
            "count": 1
          },
          {
            "date": "2018-11-16",
            "count": 1
          },
          {
            "date": "2018-11-29",
            "count": 1
          },
          {
            "date": "2018-12-05",
            "count": 1
          },
          {
            "date": "2018-12-20",
            "count": 1
          },
          {
            "date": "2019-01-15",
            "count": 1
          },
          {
            "date": "2019-01-22",
            "count": 1
          },
          {
            "date": "2019-04-08",
            "count": 1
          },
          {
            "date": "2019-04-15",
            "count": 1
          },
          {
            "date": "2019-05-22",
            "count": 1
          },
          {
            "date": "2019-06-19",
            "count": 2
          },
          {
            "date": "2019-07-09",
            "count": 1
          },
          {
            "date": "2019-07-25",
            "count": 1
          },
          {
            "date": "2019-07-31",
            "count": 1
          },
          {
            "date": "2019-08-01",
            "count": 1
          },
          {
            "date": "2019-08-02",
            "count": 1
          },
          {
            "date": "2019-08-05",
            "count": 1
          },
          {
            "date": "2019-08-06",
            "count": 1
          },
          {
            "date": "2019-09-09",
            "count": 2
          },
          {
            "date": "2019-10-02",
            "count": 1
          },
          {
            "date": "2019-10-26",
            "count": 1
          },
          {
            "date": "2019-11-12",
            "count": 1
          },
          {
            "date": "2019-12-01",
            "count": 2
          },
          {
            "date": "2019-12-04",
            "count": 1
          },
          {
            "date": "2019-12-16",
            "count": 1
          },
          {
            "date": "2020-02-01",
            "count": 1
          },
          {
            "date": "2020-02-19",
            "count": 1
          },
          {
            "date": "2020-03-03",
            "count": 1
          },
          {
            "date": "2020-03-09",
            "count": 1
          },
          {
            "date": "2020-03-25",
            "count": 1
          },
          {
            "date": "2020-04-07",
            "count": 1
          },
          {
            "date": "2020-05-14",
            "count": 1
          },
          {
            "date": "2020-05-17",
            "count": 1
          },
          {
            "date": "2020-05-26",
            "count": 1
          },
          {
            "date": "2020-06-05",
            "count": 1
          },
          {
            "date": "2020-06-15",
            "count": 1
          },
          {
            "date": "2020-07-03",
            "count": 1
          },
          {
            "date": "2020-07-07",
            "count": 1
          },
          {
            "date": "2020-07-15",
            "count": 1
          },
          {
            "date": "2020-07-29",
            "count": 3
          },
          {
            "date": "2020-08-13",
            "count": 1
          },
          {
            "date": "2020-08-14",
            "count": 1
          },
          {
            "date": "2020-08-30",
            "count": 1
          },
          {
            "date": "2020-09-11",
            "count": 1
          },
          {
            "date": "2020-09-24",
            "count": 1
          },
          {
            "date": "2020-10-02",
            "count": 1
          },
          {
            "date": "2020-10-23",
            "count": 1
          },
          {
            "date": "2020-10-25",
            "count": 1
          },
          {
            "date": "2020-12-03",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 1
          },
          {
            "date": "2021-01-05",
            "count": 1
          },
          {
            "date": "2021-01-21",
            "count": 1
          },
          {
            "date": "2021-03-10",
            "count": 1
          },
          {
            "date": "2021-03-24",
            "count": 1
          },
          {
            "date": "2021-05-14",
            "count": 1
          },
          {
            "date": "2021-06-01",
            "count": 1
          },
          {
            "date": "2021-06-20",
            "count": 1
          },
          {
            "date": "2021-06-28",
            "count": 1
          },
          {
            "date": "2021-07-31",
            "count": 1
          },
          {
            "date": "2021-10-02",
            "count": 1
          },
          {
            "date": "2021-10-18",
            "count": 1
          },
          {
            "date": "2021-10-27",
            "count": 1
          },
          {
            "date": "2021-11-09",
            "count": 1
          },
          {
            "date": "2021-12-02",
            "count": 1
          },
          {
            "date": "2021-12-08",
            "count": 1
          },
          {
            "date": "2022-01-06",
            "count": 1
          },
          {
            "date": "2022-01-09",
            "count": 1
          },
          {
            "date": "2022-02-08",
            "count": 1
          },
          {
            "date": "2022-02-12",
            "count": 1
          },
          {
            "date": "2022-02-23",
            "count": 1
          },
          {
            "date": "2022-03-22",
            "count": 1
          },
          {
            "date": "2022-04-19",
            "count": 1
          },
          {
            "date": "2022-04-21",
            "count": 1
          },
          {
            "date": "2022-04-30",
            "count": 1
          },
          {
            "date": "2022-05-07",
            "count": 1
          },
          {
            "date": "2022-07-07",
            "count": 1
          },
          {
            "date": "2022-07-11",
            "count": 1
          },
          {
            "date": "2022-07-13",
            "count": 1
          },
          {
            "date": "2022-07-23",
            "count": 1
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-26",
            "count": 1
          },
          {
            "date": "2022-09-27",
            "count": 1
          },
          {
            "date": "2022-10-21",
            "count": 1
          },
          {
            "date": "2023-02-14",
            "count": 1
          },
          {
            "date": "2023-03-13",
            "count": 2
          },
          {
            "date": "2023-03-20",
            "count": 1
          },
          {
            "date": "2023-03-26",
            "count": 1
          },
          {
            "date": "2023-04-17",
            "count": 1
          },
          {
            "date": "2023-07-04",
            "count": 1
          },
          {
            "date": "2023-07-17",
            "count": 1
          },
          {
            "date": "2023-07-25",
            "count": 1
          },
          {
            "date": "2023-08-01",
            "count": 1
          },
          {
            "date": "2023-08-10",
            "count": 1
          },
          {
            "date": "2023-08-20",
            "count": 1
          },
          {
            "date": "2023-09-10",
            "count": 1
          },
          {
            "date": "2023-09-20",
            "count": 1
          },
          {
            "date": "2023-09-21",
            "count": 1
          },
          {
            "date": "2023-10-09",
            "count": 1
          },
          {
            "date": "2023-10-18",
            "count": 1
          },
          {
            "date": "2023-10-20",
            "count": 1
          },
          {
            "date": "2023-10-30",
            "count": 1
          },
          {
            "date": "2023-12-25",
            "count": 1
          },
          {
            "date": "2024-01-02",
            "count": 1
          },
          {
            "date": "2024-01-03",
            "count": 1
          },
          {
            "date": "2024-01-30",
            "count": 1
          },
          {
            "date": "2024-02-15",
            "count": 1
          },
          {
            "date": "2024-02-20",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-02-22",
            "count": 1
          },
          {
            "date": "2024-02-24",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-04-11",
            "count": 1
          },
          {
            "date": "2024-06-05",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 1
          },
          {
            "date": "2024-07-02",
            "count": 1
          },
          {
            "date": "2024-07-10",
            "count": 1
          },
          {
            "date": "2024-07-25",
            "count": 1
          },
          {
            "date": "2024-08-30",
            "count": 1
          },
          {
            "date": "2024-09-22",
            "count": 1
          },
          {
            "date": "2024-09-24",
            "count": 1
          },
          {
            "date": "2024-09-29",
            "count": 1
          },
          {
            "date": "2024-10-14",
            "count": 1
          },
          {
            "date": "2024-11-04",
            "count": 1
          },
          {
            "date": "2024-12-06",
            "count": 1
          },
          {
            "date": "2025-02-11",
            "count": 1
          },
          {
            "date": "2025-02-26",
            "count": 1
          },
          {
            "date": "2025-03-10",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-05-05",
            "count": 1
          },
          {
            "date": "2025-06-13",
            "count": 1
          },
          {
            "date": "2025-06-22",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 1
          },
          {
            "date": "2025-08-28",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 1
          },
          {
            "date": "2025-11-02",
            "count": 1
          },
          {
            "date": "2025-11-04",
            "count": 2
          },
          {
            "date": "2025-11-24",
            "count": 1
          },
          {
            "date": "2025-12-02",
            "count": 1
          },
          {
            "date": "2025-12-24",
            "count": 1
          },
          {
            "date": "2026-02-05",
            "count": 2
          },
          {
            "date": "2026-02-24",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-20",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 2
          },
          {
            "date": "2026-07-23",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 226,
        "total_forks": 234
      },
      "star_history": null,
      "open_issues_and_prs": 44
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "samples"
      ],
      "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": 118345,
      "source_files_sampled": 429,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "python/pyproject.toml",
        "python/setup.py"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 1,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "cython",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 1,
        "direct_count": 0,
        "indirect_count": 1
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 8,
        "merged_prs": 90,
        "open_issues": 36,
        "closed_ratio": 0.905,
        "closed_issues": 344,
        "closed_unmerged_prs": 49
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "wjp",
          "commits": 1210,
          "avatar_url": "https://avatars.githubusercontent.com/u/327756?v=4"
        },
        {
          "type": "User",
          "login": "askorikov",
          "commits": 110,
          "avatar_url": "https://avatars.githubusercontent.com/u/31259212?v=4"
        },
        {
          "type": "User",
          "login": "dmpelt",
          "commits": 81,
          "avatar_url": "https://avatars.githubusercontent.com/u/3531031?v=4"
        },
        {
          "type": "User",
          "login": "wvaarle",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/462652?v=4"
        },
        {
          "type": "User",
          "login": "Obi-Wan",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/106832?v=4"
        },
        {
          "type": "User",
          "login": "lxop",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/7370817?v=4"
        },
        {
          "type": "User",
          "login": "valeriysokolov",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/305199?v=4"
        },
        {
          "type": "User",
          "login": "joergkappes",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/2162091?v=4"
        },
        {
          "type": "User",
          "login": "moritz-h",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/7849248?v=4"
        },
        {
          "type": "User",
          "login": "eureka3",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/11042659?v=4"
        }
      ],
      "contributors_sampled": 24,
      "top_contributor_share": 0.827
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 1/24 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 7 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 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": null,
            "reason": "No tokens found",
            "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": "0182d87ca4e3e36987699656752f40f5c3a0bbca",
        "ran_at": "2026-07-29T11:54:40Z",
        "aggregate_score": 3.3,
        "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": null,
      "oldest_open_prs": [
        {
          "number": 80,
          "created_at": "2016-11-24T14:08:40Z",
          "last_comment_at": "2016-11-28T18:48:35Z",
          "last_comment_author": "wjp"
        },
        {
          "number": 94,
          "created_at": "2017-01-31T17:49:28Z",
          "last_comment_at": "2020-10-06T10:47:35Z",
          "last_comment_author": "Obi-Wan"
        },
        {
          "number": 128,
          "created_at": "2017-10-27T09:34:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 156,
          "created_at": "2018-06-12T10:11:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 202,
          "created_at": "2019-05-28T08:40:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 248,
          "created_at": "2020-07-29T18:15:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 344,
          "created_at": "2022-09-14T19:40:54Z",
          "last_comment_at": "2024-01-09T19:39:13Z",
          "last_comment_author": "carterbox"
        },
        {
          "number": 628,
          "created_at": "2026-07-20T07:32:15Z",
          "last_comment_at": "2026-07-27T13:08:14Z",
          "last_comment_author": "wjp"
        }
      ],
      "last_merged_pr_at": "2026-07-27T17:55:24Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 51,
          "created_at": "2016-04-26T08:23:24Z",
          "last_comment_at": "2025-12-03T21:13:45Z",
          "last_comment_author": "moritz-h"
        },
        {
          "number": 71,
          "created_at": "2016-11-04T10:36:58Z",
          "last_comment_at": "2016-12-12T18:01:24Z",
          "last_comment_author": "adler-j"
        },
        {
          "number": 79,
          "created_at": "2016-11-24T12:51:54Z",
          "last_comment_at": "2020-05-25T11:40:05Z",
          "last_comment_author": "CatalysTim"
        },
        {
          "number": 89,
          "created_at": "2017-01-03T15:33:39Z",
          "last_comment_at": "2017-01-03T22:51:36Z",
          "last_comment_author": "kohr-h"
        },
        {
          "number": 95,
          "created_at": "2017-02-07T00:19:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 99,
          "created_at": "2017-02-28T09:11:10Z",
          "last_comment_at": "2017-02-28T14:06:04Z",
          "last_comment_author": "Obi-Wan"
        },
        {
          "number": 112,
          "created_at": "2017-06-26T11:52:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 116,
          "created_at": "2017-07-28T14:32:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 117,
          "created_at": "2017-08-07T14:11:56Z",
          "last_comment_at": "2024-03-08T14:19:37Z",
          "last_comment_author": "stephoog"
        },
        {
          "number": 139,
          "created_at": "2018-02-15T12:05:21Z",
          "last_comment_at": "2024-03-08T14:17:47Z",
          "last_comment_author": "stephoog"
        },
        {
          "number": 140,
          "created_at": "2018-02-19T09:30:27Z",
          "last_comment_at": "2018-06-11T12:58:19Z",
          "last_comment_author": "wjp"
        },
        {
          "number": 148,
          "created_at": "2018-04-18T15:09:55Z",
          "last_comment_at": "2019-02-18T12:23:55Z",
          "last_comment_author": "meetaig"
        },
        {
          "number": 149,
          "created_at": "2018-04-23T17:14:34Z",
          "last_comment_at": "2019-05-31T22:35:36Z",
          "last_comment_author": "PranjalSahu"
        },
        {
          "number": 161,
          "created_at": "2018-07-31T18:33:50Z",
          "last_comment_at": "2025-04-07T10:58:25Z",
          "last_comment_author": "askorikov"
        },
        {
          "number": 162,
          "created_at": "2018-08-03T05:43:12Z",
          "last_comment_at": "2023-10-17T12:18:09Z",
          "last_comment_author": "hrashidykanan"
        },
        {
          "number": 173,
          "created_at": "2018-10-30T14:44:30Z",
          "last_comment_at": "2019-02-19T23:25:45Z",
          "last_comment_author": "fschiffers"
        },
        {
          "number": 182,
          "created_at": "2019-01-17T21:43:59Z",
          "last_comment_at": "2024-03-30T14:46:33Z",
          "last_comment_author": "Zhentao-Liu"
        },
        {
          "number": 226,
          "created_at": "2020-01-16T06:27:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 227,
          "created_at": "2020-02-07T14:00:46Z",
          "last_comment_at": "2024-04-19T09:30:25Z",
          "last_comment_author": "themowhite"
        },
        {
          "number": 257,
          "created_at": "2020-10-09T20:51:23Z",
          "last_comment_at": "2023-08-11T08:56:15Z",
          "last_comment_author": "askorikov"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/astra-toolbox/astra-toolbox",
    "host": "github.com",
    "name": "astra-toolbox",
    "owner": "astra-toolbox"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 33,
        "vitality": 87,
        "community": 75,
        "governance": 62,
        "engineering": 30
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 87,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "commits_last_year": 177,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 38
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "38/52 weeks with commits",
                "points": 26.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 38
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "177 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 177
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "releases_count": 17,
              "latest_release_tag": "v2.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 42,
              "mean_days_between_releases": 118.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 42 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 42
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~118.3 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 118.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 75,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "forks": 234,
              "stars": 611,
              "watchers": 37,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "611 stars",
                "points": 45.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 611
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "234 forks",
                "points": 19.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 234
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "37 watchers",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "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 (GPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "packages": [
                "astra-toolbox"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 6849
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "6,849 downloads/month across pypi",
                "points": 51.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 6849,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 62,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 24,
              "top_contributor_share": 0.827
            },
            "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 83% of commits",
                "points": 3.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 83
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "24 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 7 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "merged_prs": 90,
              "open_issues": 36,
              "closed_issues": 344,
              "issue_closed_ratio": 0.905,
              "closed_unmerged_prs": 49
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "90% of issues closed",
                "points": 42.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 90
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "90/139 decided PRs merged",
                "points": 24.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 90,
                      "decided": 139
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/24 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "followers": 26,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "astra-toolbox",
              "public_repos": 4,
              "account_age_days": 4290
            },
            "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": "26 followers of astra-toolbox",
                "points": 10.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 26,
                      "login": "astra-toolbox"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~11 yr old",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "astra-toolbox"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 42
            },
            "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 42 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 42
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "8 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 30,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "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": 33,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 33,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.3
            },
            "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": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 1/24 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 7 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 11
            },
            "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": 37,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "critical",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.16,
              "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": "16 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 8.5,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 16,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "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": "C++ (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C++"
                    }
                  }
                ],
                "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "C++",
              "largest_source_bytes": 118345,
              "source_files_sampled": 429,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C++ (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C++"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/429 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 429,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "samples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples, samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, samples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T11:54:59.378658Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/astra-toolbox/astra-toolbox.svg",
  "full_name": "astra-toolbox/astra-toolbox",
  "license_state": "standard",
  "license_spdx": "GPL-3.0"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.