Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-26 07:19 UTC

iiasa / message-ix-models

Tools for the MESSAGEix-GLOBIOM family of models

PythonApache-2.0★ 32 Sterne⑂ 57 Forksseit Jan. 2021Auf GitHub ansehen ↗

iiasa/message-ix-models erreicht einen Gesundheitsindex von 71 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Vitality (89/100) ab, am schwächsten bei AI Readiness (50/100). Zuletzt vor 1 Tag aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

71
gesamt / 100
Gut

Software-Gesundheitsindex

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

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

Bewertungsprofil

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

Eigentümerschaft

IIASAOrganisation
212 Follower202 öffentliche Reposseit Okt. 2015

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

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
PyPImessage-ix-models2026.4.17-59vor 99 Tagen

Metriken nach Kategorie

Vitalität

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

89Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 1 Tagen
29.8/36Commit-Rhythmus — 43/52 Wochen mit Commits
18/18Commit-Volumen — 840 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year840
human_commit_share0,99
days_since_last_push1
active_weeks_last_year43
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 39 Releases veröffentlicht
27/36Release-Aktualität — letztes Release vor 99 Tagen
19.8/27Release-Rhythmus — ein Release etwa alle 80,6 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count39
latest_release_tagv2026.4.17
releases_from_tagsnein
days_since_latest_release99
mean_days_between_releases80,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

51Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
24.2/60Stars — 32 Stars
14.6/25Forks — 57 Forks
6.8/15Watcher — 18 Watcher
Verwendete Eingangsdaten
forks57
stars32
watchers18
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templateja

Nachhaltigkeit & Governance

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

64Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
9.7/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 57 % der Commits
13.5/13.5Breite der Beitragenden — 31 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 13 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled31
top_contributor_share0,567
Wie die Bewertung erfolgt
17.9/46.8Issue-Lösungsquote — 38 % der Issues geschlossen
32.9/38.3PR-Annahme — 280/326 entschiedene PRs gemergt
3/15OpenSSF Scorecard: Code-Review — Found 1/4 approved changesets -- score normalized to 2
Verwendete Eingangsdaten
merged_prs280
open_issues97
closed_issues60
issue_closed_ratio0,382
closed_unmerged_prs46
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
16.7/25Reichweite des Inhabers — 212 Follower von iiasa
25/25Kontohistorie — 202 öffentliche Repos, Kontoalter ca. 10 Jahre
Verwendete Eingangsdaten
followers212
owner_typeOrganization
is_verified
owner_loginiiasa
public_repos202
account_age_days3.930

Paketpflege

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

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

88Exzellent · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration
9.6/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 5 out of 5 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_configja
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://docs.messageix.org/models
10/10Repository-Beschreibung
0/10Topics
0/10Wiki
Verwendete Eingangsdaten
topics
has_wikinein
homepagehttps://docs.messageix.org/models
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

59Mittel · 16 % des Gesamtindex

Sicherheitslage

49Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 5 out of 5 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 1/4 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 13 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 80 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages112
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von pypi:message-ix-models@2026.4.17 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 112 Paketen. Erreichbarkeit wird nicht analysiert.

AI Readiness

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

50Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
12.9/40Lesbare Commit-Historie — 24 von 99 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,242
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — doc/Makefile
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — message_ix_models/py.typed
0/10Reproduzierbare Umgebung
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
8/8Automatisierte Wartung — 1 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_filesdoc/Makefile
has_devcontainernein
has_linter_configja
typecheck_configsmessage_ix_models/py.typed
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,01
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Python mit Typprüfungs-Konfiguration (message_ix_models/py.typed)
54.3/55Handhabbare Dateigrößen — 5/374 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes290.980
source_files_sampled374
oversized_source_files5
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — notebooks
Verwendete Eingangsdaten
example_dirsnotebooks
has_mcp_signalnein
api_schema_files

Eckdaten

32GitHub-Sterne
31Mitwirkende
840Commits, letzte 12 Monate
1Tage seit letztem Push
39Releases
1Bus-Faktor
97offene Issues
PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 57 ⇿
0Sterne
57Forks
37Releases

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

01020304050605642021-022023-092026-05
Major 0Minor 0Patch 37

Jeder Punkt umfasst 5 Tage.

OpenSSF Scorecard 4.9 / 10
4.9Gesamtwert

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

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests5 out of 5 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 1/4 approved changesets -- score normalized to 2
10Contributorsproject has 13 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities80 existing vulnerabilities detected
Direkte Abhängigkeiten 13
RegistryPaketVersionsvorgabeManifest
PyPIclickpyproject.toml
PyPIcoloramapyproject.toml
PyPIgenno>= 1.25pyproject.toml
PyPIiam_units>= 2023.9.11pyproject.toml
PyPImessage_ix>= 3.8pyproject.toml
PyPIpoochpyproject.toml
PyPIpyam-iamc>= 0.6pyproject.toml
PyPIpyarrowpyproject.toml
PyPIpycountrypyproject.toml
PyPIPyYAMLpyproject.toml
PyPIsdmx1>= 2.22.0pyproject.toml
PyPItqdmpyproject.toml
PyPIpyxlsb>= 1.0.10pyproject.toml
Alle Abhängigkeiten 239

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

RegistryPaketVersionBeziehung
PyPIclickdirekt
PyPIclick8.4.0direkt
PyPIcoloramadirekt
PyPIcolorama0.4.6direkt
PyPIgennodirekt
PyPIgenno1.30.1direkt
PyPIiam-unitsdirekt
PyPIiam-units2026.5.18direkt
PyPImessage-ixdirekt
PyPIpoochdirekt
PyPIpooch1.9.0direkt
PyPIpyam-iamcdirekt
PyPIpyam-iamc3.3.0direkt
PyPIpyarrowdirekt
PyPIpyarrow24.0.0direkt
PyPIpycountrydirekt
PyPIpycountry26.2.16direkt
PyPIpyxlsbdirekt
PyPIpyxlsb1.0.10direkt
PyPIpyyamldirekt
PyPIpyyaml6.0.3direkt
PyPIsdmx1direkt
PyPIsdmx12.26.0direkt
PyPItqdmdirekt
PyPItqdm4.67.3direkt
PyPIalabaster1.0.0indirekt
PyPIalembic1.18.4indirekt
PyPIannotated-doc0.0.4indirekt
PyPIannotated-types0.7.0indirekt
PyPIanyio4.13.0indirekt
PyPIargon2-cffi25.1.0indirekt
PyPIargon2-cffi-bindings25.1.0indirekt
PyPIarrow1.4.0indirekt
PyPIast-serialize0.5.0indirekt
PyPIasttokens3.0.1indirekt
PyPIasync-lru2.3.0indirekt
PyPIattrs26.1.0indirekt
PyPIbabel2.16.0indirekt
PyPIbeautifulsoup44.14.3indirekt
PyPIbleach6.3.0indirekt
PyPIcattrs26.1.0indirekt
PyPIcertifi2023.7.22indirekt
PyPIcffi2.0.0indirekt
PyPIcharset-normalizer3.2.0indirekt
PyPIcloudpickle3.1.2indirekt
PyPIcomm0.2.3indirekt
PyPIcontourpy1.3.3indirekt
PyPIcoverage7.14.0indirekt
PyPIcramjam2.11.0indirekt
PyPIcycler0.12.1indirekt
PyPIdask2026.3.0indirekt
PyPIdebugpy1.8.20indirekt
PyPIdecorator5.3.1indirekt
PyPIdefusedxml0.7.1indirekt
PyPIdocutils0.21.2indirekt
PyPIet-xmlfile2.0.0indirekt
PyPIexecnet2.1.2indirekt
PyPIexecuting2.2.1indirekt
PyPIfastapi0.136.1indirekt
PyPIfastjsonschema2.21.2indirekt
PyPIfastparquet2026.5.0indirekt
PyPIflexcache0.3indirekt
PyPIflexparser0.4indirekt
PyPIfonttools4.63.0indirekt
PyPIfqdn1.5.1indirekt
PyPIfsspec2026.4.0indirekt
PyPIgamsapi53.5.0indirekt
PyPIgitdb4.0.12indirekt
PyPIgitpython3.1.50indirekt
PyPIgraphviz0.21indirekt
PyPIgreenlet3.5.0indirekt
PyPIh110.16.0indirekt
PyPIh24.3.0indirekt
PyPIhpack4.1.0indirekt
PyPIhttpcore1.0.9indirekt
PyPIhttpx0.28.1indirekt
PyPIhyperframe6.1.0indirekt
PyPIidna3.4indirekt
PyPIimagesize1.4.1indirekt
PyPIiniconfig2.3.0indirekt
PyPIipykernel7.2.0indirekt
PyPIipython9.13.0indirekt
PyPIipython-pygments-lexers1.1.1indirekt
PyPIipywidgets8.1.8indirekt
PyPIisoduration20.11.0indirekt
PyPIixmpindirekt
PyPIixmp40.14.0indirekt
PyPIjaydebeapi1.2.3indirekt
PyPIjedi0.20.0indirekt
PyPIjinja23.1.2indirekt
PyPIjpype11.7.1indirekt
PyPIjson50.14.0indirekt
PyPIjsonpointer3.1.1indirekt
PyPIjsonschema4.26.0indirekt
PyPIjsonschema-specifications2025.9.1indirekt
PyPIjupyter1.1.1indirekt
PyPIjupyter-client8.8.0indirekt
PyPIjupyter-console6.6.3indirekt
PyPIjupyter-core5.9.1indirekt
PyPIjupyter-events0.12.1indirekt
PyPIjupyter-lsp2.3.1indirekt
PyPIjupyter-server2.18.2indirekt
PyPIjupyter-server-terminals0.5.4indirekt
PyPIjupyterlab4.5.7indirekt
PyPIjupyterlab-pygments0.3.0indirekt
PyPIjupyterlab-server2.28.0indirekt
PyPIjupyterlab-widgets3.0.16indirekt
PyPIkiwisolver1.5.0indirekt
PyPIlark1.3.1indirekt
PyPIlatexcodec3.0.1indirekt
PyPIlibrt0.11.0indirekt
PyPIlocket1.0.0indirekt
PyPIlxml6.1.1indirekt
PyPImako1.3.12indirekt
PyPImarkdown-it-py4.2.0indirekt
PyPImarkupsafe2.1.3indirekt
PyPImatplotlib3.10.9indirekt
PyPImatplotlib-inline0.2.2indirekt
PyPImdurl0.1.2indirekt
PyPImemory-profiler0.61.0indirekt
PyPImistune3.2.1indirekt
PyPImizani0.14.4indirekt
PyPImypy2.1.0indirekt
PyPImypy-extensions1.1.0indirekt
PyPInarwhals2.21.2indirekt
PyPInbclient0.10.4indirekt
PyPInbconvert7.17.1indirekt
PyPInbformat5.10.4indirekt
PyPInest-asyncio1.6.0indirekt
PyPInotebook7.5.6indirekt
PyPInotebook-shim0.2.4indirekt
PyPInumpy2.3.0indirekt
PyPInumpydoc1.10.0indirekt
PyPIopenpyxl3.1.5indirekt
PyPIpackaging26.2indirekt
PyPIpandas2.2.3indirekt
PyPIpandera0.31.1indirekt
PyPIpandocfilters1.5.1indirekt
PyPIparso0.8.7indirekt
PyPIpartd1.4.2indirekt
PyPIpathspec1.1.1indirekt
PyPIpatsy1.0.2indirekt
PyPIpexpect4.9.0indirekt
PyPIpillow12.2.0indirekt
PyPIpint0.25.3indirekt
PyPIplatformdirs4.9.6indirekt
PyPIplotly6.7.0indirekt
PyPIplotnine0.15.4indirekt
PyPIpluggy1.6.0indirekt
PyPIply3.11indirekt
PyPIprometheus-client0.25.0indirekt
PyPIprompt-toolkit3.0.52indirekt
PyPIpsutil7.2.2indirekt
PyPIpsycopg3.3.4indirekt
PyPIpsycopg-binary3.3.4indirekt
PyPIptyprocess0.7.0indirekt
PyPIpure-eval0.2.3indirekt
PyPIpy-cpuinfo9.0.0indirekt
PyPIpybtex0.26.1indirekt
PyPIpybtex-docutils1.0.3indirekt
PyPIpycparser3.0indirekt
PyPIpydantic2.13.4indirekt
PyPIpydantic-core2.46.4indirekt
PyPIpydantic-settings2.14.1indirekt
PyPIpygments2.18.0indirekt
PyPIpyjwt2.12.1indirekt
PyPIpyparsing3.3.2indirekt
PyPIpytest9.0.3indirekt
PyPIpytest-benchmark5.2.3indirekt
PyPIpytest-cov7.1.0indirekt
PyPIpytest-httpserver1.1.5indirekt
PyPIpytest-rerunfailures16.2indirekt
PyPIpytest-timeout2.4.0indirekt
PyPIpytest-xdist3.8.0indirekt
PyPIpython-dateutil2.9.0.post0indirekt
PyPIpython-dotenv1.2.2indirekt
PyPIpython-json-logger4.1.0indirekt
PyPIpytz2025.2indirekt
PyPIpyzmq27.1.0indirekt
PyPIreferencing0.37.0indirekt
PyPIrequests2.31.0indirekt
PyPIrequests-cache1.3.2indirekt
PyPIrfc3339-validator0.1.4indirekt
PyPIrfc3986-validator0.1.1indirekt
PyPIrfc3987-syntax1.1.0indirekt
PyPIrich15.0.0indirekt
PyPIroman-numerals4.1.0indirekt
PyPIrpds-py0.30.0indirekt
PyPIscgraph2.15.0indirekt
PyPIscipy1.17.1indirekt
PyPIseaborn0.13.2indirekt
PyPIsend2trash2.1.0indirekt
PyPIsetuptools82.0.1indirekt
PyPIshellingham1.5.4indirekt
PyPIsix1.16.0indirekt
PyPIsmmap5.0.3indirekt
PyPIsnowballstemmer2.2.0indirekt
PyPIsoupsieve2.8.3indirekt
PyPIsphinx9.1.0indirekt
PyPIsphinx-rtd-theme3.1.0indirekt
PyPIsphinxcontrib-applehelp2.0.0indirekt
PyPIsphinxcontrib-bibtex2.7.0indirekt
PyPIsphinxcontrib-devhelp2.0.0indirekt
PyPIsphinxcontrib-htmlhelp2.1.0indirekt
PyPIsphinxcontrib-jquery4.1indirekt
PyPIsphinxcontrib-jsmath1.0.1indirekt
PyPIsphinxcontrib-qthelp2.0.0indirekt
PyPIsphinxcontrib-serializinghtml2.0.0indirekt
PyPIsqlalchemy2.0.49indirekt
PyPIsqlalchemy-utils0.42.1indirekt
PyPIstack-data0.6.3indirekt
PyPIstarlette1.0.0indirekt
PyPIstatsmodels0.14.6indirekt
PyPIterminado0.18.1indirekt
PyPItinycss21.4.0indirekt
PyPItoml0.10.2indirekt
PyPItoolz1.1.0indirekt
PyPItornado6.5.5indirekt
PyPItraitlets5.15.0indirekt
PyPItransport-energy2025.3.31indirekt
PyPItypeguard4.5.2indirekt
PyPItyper0.25.1indirekt
PyPItyping-extensions4.15.0indirekt
PyPItyping-inspect0.9.0indirekt
PyPItyping-inspection0.4.2indirekt
PyPItzdata2025.2indirekt
PyPIuri-template1.3.0indirekt
PyPIurl-normalize3.0.0indirekt
PyPIurllib32.0.4indirekt
PyPIwcwidth0.7.0indirekt
PyPIwebcolors25.10.0indirekt
PyPIwebencodings0.5.1indirekt
PyPIwebsocket-client1.9.0indirekt
PyPIwerkzeug3.1.8indirekt
PyPIwidgetsnbextension4.0.15indirekt
PyPIwquantiles0.6indirekt
PyPIxarray2026.4.0indirekt
PyPIxlrd2.0.2indirekt
PyPIxlsxwriter3.2.9indirekt
Abhängigkeits-Advisories 0

Die Installation von pypi:message-ix-models@2026.4.17 zieht 112 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

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

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 208655,
      "has_wiki": false,
      "homepage": "https://docs.messageix.org/models",
      "languages": {
        "R": 112732,
        "Python": 3613568,
        "Jupyter Notebook": 9945
      },
      "pushed_at": "2026-07-24T14:50:03Z",
      "created_at": "2021-01-20T10:51:32Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-01T08:33:37Z",
      "description": "Tools for the MESSAGEix-GLOBIOM family of models",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://www.iiasa.ac.at",
      "name": "IIASA",
      "type": "Organization",
      "login": "iiasa",
      "company": null,
      "location": "Laxenburg, Austria",
      "followers": 212,
      "avatar_url": "https://avatars.githubusercontent.com/u/15230149?v=4",
      "created_at": "2015-10-21T11:14:33Z",
      "is_verified": null,
      "public_repos": 202,
      "account_age_days": 3930
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2026.4.17",
          "kind": "patch",
          "published_at": "2026-04-17T21:27:18Z"
        },
        {
          "tag": "v2026.1.15",
          "kind": "patch",
          "published_at": "2026-01-15T15:46:06Z"
        },
        {
          "tag": "v2025.10.31",
          "kind": "patch",
          "published_at": "2025-10-31T14:40:23Z"
        },
        {
          "tag": "v2025.9.9",
          "kind": "patch",
          "published_at": "2025-09-09T21:06:40Z"
        },
        {
          "tag": "v2025.8.7",
          "kind": "patch",
          "published_at": "2025-08-07T09:00:13Z"
        },
        {
          "tag": "v2025.7.23",
          "kind": "patch",
          "published_at": "2025-07-23T09:00:33Z"
        },
        {
          "tag": "v2025.5.28",
          "kind": "patch",
          "published_at": "2025-05-28T12:35:16Z"
        },
        {
          "tag": "v2025.1.10",
          "kind": "patch",
          "published_at": "2025-01-13T07:58:25Z"
        },
        {
          "tag": "v2024.8.6",
          "kind": "patch",
          "published_at": "2024-08-06T12:38:44Z"
        },
        {
          "tag": "v2024.4.22",
          "kind": "patch",
          "published_at": "2024-04-22T14:45:22Z"
        },
        {
          "tag": "v2024.4.2",
          "kind": "patch",
          "published_at": "2024-04-02T06:25:33Z"
        },
        {
          "tag": "v2024.1.29",
          "kind": "patch",
          "published_at": "2024-01-29T17:10:06Z"
        },
        {
          "tag": "v2023.11.24",
          "kind": "patch",
          "published_at": "2023-11-24T09:55:51Z"
        },
        {
          "tag": "v2023.10.16",
          "kind": "patch",
          "published_at": "2023-10-16T15:08:19Z"
        },
        {
          "tag": "v2023.9.12",
          "kind": "patch",
          "published_at": "2023-09-12T14:39:41Z"
        },
        {
          "tag": "v2023.9.2",
          "kind": "patch",
          "published_at": "2023-09-02T19:47:42Z"
        },
        {
          "tag": "v2023.7.26",
          "kind": "patch",
          "published_at": "2023-07-26T14:06:04Z"
        },
        {
          "tag": "v2023.5.31",
          "kind": "patch",
          "published_at": "2023-05-31T12:38:05Z"
        },
        {
          "tag": "v2023.5.13",
          "kind": "patch",
          "published_at": "2023-05-13T12:04:12Z"
        },
        {
          "tag": "v2023.4.2",
          "kind": "patch",
          "published_at": "2023-04-02T09:01:07Z"
        },
        {
          "tag": "v2023.2.8",
          "kind": "patch",
          "published_at": "2023-02-08T10:59:36Z"
        },
        {
          "tag": "v2022.11.7",
          "kind": "patch",
          "published_at": "2022-11-07T11:29:40Z"
        },
        {
          "tag": "v2022.8.17",
          "kind": "patch",
          "published_at": "2022-08-17T15:28:18Z"
        },
        {
          "tag": "v2022.7.25",
          "kind": "patch",
          "published_at": "2022-07-25T19:10:55Z"
        },
        {
          "tag": "v2022.5.6",
          "kind": "patch",
          "published_at": "2022-05-06T13:34:30Z"
        },
        {
          "tag": "v2022.3.30",
          "kind": "patch",
          "published_at": "2022-03-30T13:45:35Z"
        },
        {
          "tag": "v2022.3.3",
          "kind": "patch",
          "published_at": "2022-03-03T12:42:51Z"
        },
        {
          "tag": "v2022.1.26",
          "kind": "patch",
          "published_at": "2022-01-26T17:33:06Z"
        },
        {
          "tag": "v2021.11.24",
          "kind": "patch",
          "published_at": "2021-11-24T14:37:58Z"
        },
        {
          "tag": "v2021.7.27",
          "kind": "patch",
          "published_at": "2021-07-27T18:57:29Z"
        },
        {
          "tag": "v2021.7.22",
          "kind": "patch",
          "published_at": "2021-07-22T20:40:22Z"
        },
        {
          "tag": "v2021.7.6",
          "kind": "patch",
          "published_at": "2021-07-06T14:24:40Z"
        },
        {
          "tag": "v2021.4.7",
          "kind": "patch",
          "published_at": "2021-04-07T14:09:59Z"
        },
        {
          "tag": "v2021.3.24",
          "kind": "patch",
          "published_at": "2021-03-25T17:19:06Z"
        },
        {
          "tag": "v2021.3.22",
          "kind": "patch",
          "published_at": "2021-03-22T19:46:11Z"
        },
        {
          "tag": "v2021.3.3",
          "kind": "patch",
          "published_at": "2021-03-03T10:22:47Z"
        },
        {
          "tag": "v2021.2.28",
          "kind": "patch",
          "published_at": "2021-02-28T21:42:56Z"
        },
        {
          "tag": "v2021.2.26",
          "kind": "patch",
          "published_at": "2021-02-26T14:38:13Z"
        },
        {
          "tag": "v2021.2.23",
          "kind": "patch",
          "published_at": "2021-02-23T16:25:28Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8e13506d86f319de84438ec03c23b6809de33015",
          "body": "Bumps the all-actions group with 2 updates in the / directory: [actions/checkout](https://github.com/actions/checkout) and [codecov/codecov-action](https://github.com/codecov/codecov-action).\n\n\nUpdates `actions/checkout` from 6 to 7\n- [Release notes](https://github.com/actions/checkout/releases)\n- [\n[…]\nction\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: all-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-actions group across 1 directory with 2 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-25T08:21:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6511efafd26a15db4851aa8d84feb0f23fa8363",
          "body": "Collect water module settings into Config dataclass",
          "is_bot": false,
          "headline": "Merge pull request #509 from wegatriespython/wr/pr-c-water-config",
          "author_name": "Wega",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-26T09:41:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6110b41917f67f499d19be9998106609831bf81b",
          "body": null,
          "is_bot": false,
          "headline": "Add type hint for test",
          "author_name": "Vignesh Raghunathan",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-19T14:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "907295b1c4fe06cede86ce4be1f68fc6c5de7c19",
          "body": null,
          "is_bot": false,
          "headline": "Update docstring",
          "author_name": "Vignesh Raghunathan",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-19T14:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a1872036fe971eeaa87da5ac336f10ef9ac5a3a",
          "body": null,
          "is_bot": false,
          "headline": "Update whatsnew",
          "author_name": "Vignesh Raghunathan",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-19T14:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29f87463891edc0c3793ab9b21ad694834519474",
          "body": null,
          "is_bot": false,
          "headline": "Remove legacy water Config context bridge",
          "author_name": "Vignesh Raghunathan",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-19T14:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c447e6255b428743f838505b747066be9465cb2",
          "body": "store_context() now skips assignment when value is None and the\nparameter is already set on the Context. Keeps a group-level\n`water-ix --ssp SSPx` alive when a subcommand declares its own --ssp\nwith default=None; the subcommand callback used to overwrite the\ngroup's value at the end of parsing.",
          "is_bot": false,
          "headline": "Preserve stored Context values on None CLI option overwrites",
          "author_name": "Vignesh Raghunathan",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-19T14:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5052ae247e9f9e7d2616e831077ea6bb4f943f77",
          "body": "Add message_ix_models.model.water.config.Config holding water-module\nsettings/state (RCP, SDG, REL, time, type_reg, map_ISO_c, nexus_set,\nreduced-basin settings, valid_basins, all_nodes). Build/data/utility\ncode reads Config.from_context(context); the CLI populates context.water\nat setup. Config.apply() remains as an explicit backward-compat helper\nfor callers that build a Context directly.",
          "is_bot": false,
          "headline": "Introduce water Config dataclass for context.water",
          "author_name": "Vignesh Raghunathan",
          "author_login": "Wegatriespython",
          "committed_at": "2026-05-19T14:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d47ec6e10c5aeaa6fef767e392121715b27104b4",
          "body": "Work around documentation build errors with ixmp4 0.15",
          "is_bot": false,
          "headline": "Merge pull request #511 from iiasa/fix/doc-build-ixmp4-0.15",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T21:30:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "809e510dffe0b79b8e5858a8c89901472b9d79ea",
          "body": null,
          "is_bot": false,
          "headline": "Don't install [docs] extras in pytest CI workflow",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04caa2c0bda04e87790331e53f50a331fbe47003",
          "body": null,
          "is_bot": false,
          "headline": "Ignore Sphinx warnings re :mod:`message_data`",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bdb1565fd3ab251457ac825008a447da05b9bed",
          "body": null,
          "is_bot": false,
          "headline": "Replace viewcode with sphinx_linkcode_github",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09720724183cc2fa09f6b30238ed9cd6aa7093ef",
          "body": null,
          "is_bot": false,
          "headline": "Drop requests-cache exclusion in RTD build",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cd56b0292e1414ef464392f19279b6d90b0f53f",
          "body": null,
          "is_bot": false,
          "headline": "Bump OS, Python versions for RTD build",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aefd4f49ff0900eb7567c1d15ad8fd998571f96a",
          "body": null,
          "is_bot": false,
          "headline": "Drop RTD work-around for pyam-iamc/Python 3.13",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "996aff62d17c2b637b013303d2367701c7eeaafa",
          "body": "- Install package, then enforce doc/requirements.txt.",
          "is_bot": false,
          "headline": "Change order in .readthedocs.yaml",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb9d83f0bca99a63a730242a7da3aa1aeb64e620",
          "body": "- Address a mypy error with genno 1.30.x.\n- Improve type hints in message_ix_models.workflow.",
          "is_bot": false,
          "headline": "Narrow type of Workflow.run() arg",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f59d056d06ba1f9c64ff5ea65281b221855324ee",
          "body": "- Use `uv pip compile`, in line with other packages in the stack.\n- Reference [docs] entries from pyproject.toml.",
          "is_bot": false,
          "headline": "Recreate doc/requirements.txt",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "406a43f1f97e8f8654d6ab4cee4e232498c90d35",
          "body": null,
          "is_bot": false,
          "headline": "Drop redundant entries in doc/requirements.in",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1d615b9f90ba0bf34b9847488fd83190470f84",
          "body": null,
          "is_bot": false,
          "headline": "Bump sphinx to >=9 in pyproject.toml",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T20:55:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcecaf5ef07deb14390ff7a1336afc5724d6c3fd",
          "body": "Work around #507.",
          "is_bot": false,
          "headline": "Mark ixmp4 < 0.15 in doc/requirements.in",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-05-18T16:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "583e26773172a9d2b1af36abbb4d26faf9ad4bd3",
          "body": "Add HOWTO Develop reporting code",
          "is_bot": false,
          "headline": "Merge pull request #488 from iiasa/doc/report-2026-w12",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T14:19:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9709fecb76a34c59543b95aa93f2835510107c5f",
          "body": null,
          "is_bot": false,
          "headline": "Add #488 to doc/whatsnew",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T13:53:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2f347c46ef7f3cacc7d0c14f477ac7b0e3b9bbc",
          "body": null,
          "is_bot": false,
          "headline": "Improve docstring of .transport.report.callback()",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T13:53:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21470f5d1bf1b0b181027a5add1a006a27f947fe",
          "body": "- Add to howto/index\n- Add reference target in api/report/index.",
          "is_bot": false,
          "headline": "Add doc/howto/report.rst",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T13:53:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80bd4461bc775165cd493c124efb76229fd25ffa",
          "body": "Adjust `.ssp.transport`",
          "is_bot": false,
          "headline": "Merge pull request #485 from iiasa/project/ssp/transport/2026-03-11",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T13:31:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c0c7ad4da308036abd7eb5c595c22d78c751434",
          "body": null,
          "is_bot": false,
          "headline": "Add #485 to doc/whatsnew",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T09:32:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a2bb857bd821cec52cbe9d464d19b937e70aae4",
          "body": null,
          "is_bot": false,
          "headline": "Adjust tests for #485",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T09:32:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a47f541e4483ced21227d35055b8fb33f2c2b11c",
          "body": null,
          "is_bot": false,
          "headline": "Consolidate setup in .transport.get_computer()",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T09:00:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06c8f0d1e121bdcd564fd55bc130d169ec9dfe7e",
          "body": null,
          "is_bot": false,
          "headline": "Compute n=World aviation FE by sum of regions",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "441f6661e19da530d1573d6faa7851b7dc40ec25",
          "body": "Using CEDS 2020 ratios per OF.",
          "is_bot": false,
          "headline": "Update implied transport/emi-intensity.csv values",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29485ad8c28cf0324c80ad76ddd28ef4e63e1400",
          "body": "Change missed in eeb263a1f62683ca2e446309e56eded825b5e294.",
          "is_bot": false,
          "headline": "Drop exclusion of y=2020 from FE modification",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dfb89562db816027accd62cf281f970edb272e7",
          "body": null,
          "is_bot": false,
          "headline": "Zero existing values for n=World non-CO2 emissions",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7097ed193dab7d74eba1ba281cb214ed628b6dc2",
          "body": "- Handle distinction between CO2 and other species in construction of\n  the broadcasting quantity.",
          "is_bot": false,
          "headline": "Combine broadcast_est_emi() functions",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b433e4889ce90738db30618842ac99ca6a7d4d2",
          "body": "- Replace prior method using AIR share of transport final energy.\n- Adjust global totals for all regions.",
          "is_bot": false,
          "headline": "Reduce \"Emi.*Transportation\" using computed values",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "646c5f0fbc0f87698cc933572bce51d8b454c1db",
          "body": null,
          "is_bot": false,
          "headline": "Also modify \"…|Energy and Industrial Processes\"",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b19c33e20f4339737249cfcd224fc7f31413d502",
          "body": "- check(): compute diff data frame and debug dump before assertions.\n- Expand cases for test_v_to_emi_coords().",
          "is_bot": false,
          "headline": "Update .project.ssp.test_transport",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fd3101fdb79091fd557855d812d975663a7cbf9",
          "body": null,
          "is_bot": false,
          "headline": "Add test data specimen as of SSP v6.5",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-28T08:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e817c34c8ae3f93481baf3adae716ee0b63443b8",
          "body": "Sketch a ScenarioMIP workflow",
          "is_bot": false,
          "headline": "Merge pull request #394 from iiasa/scenariomip/workflow",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-27T22:13:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58254ecbdd537a81107f940c445592e1c4a1af84",
          "body": null,
          "is_bot": false,
          "headline": "Add #394 to docs, whatsnew",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-27T19:31:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "738ea60394b3e7eb0cdef9a74a6cec05738a7f45",
          "body": "- Add stub functions for workflow steps.\n- Add tests.",
          "is_bot": false,
          "headline": "Add .scenariomip.workflow.generate()",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-27T19:31:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5939f07937b7c68467d969507bd3002f32f86e4",
          "body": "Add `.tools.newclimate`",
          "is_bot": false,
          "headline": "Merge pull request #499 from iiasa/enh/newclimate",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-26T12:37:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d56c4b3a3f3753f5849f3f7629fdd77252329e7",
          "body": null,
          "is_bot": false,
          "headline": "Update docs, whatsnew for #499",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T17:55:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "122cff55cae48c0bc397456353ea25ea5ff02185",
          "body": null,
          "is_bot": false,
          "headline": "Add CODEOWNERS entries for .tools.newclimate",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T17:54:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6f56874a5e33520077b759bfc7b627238f51800",
          "body": null,
          "is_bot": false,
          "headline": "Add .newclimate.__init__ and tests",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T17:54:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31cd2764c81f274f8b0477b73ea2e5fc2b10ccf8",
          "body": null,
          "is_bot": false,
          "headline": "Add .newclimate.structure",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T17:54:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66fec2cb08f4de968f4e3ae67ad76bf23c69ab45",
          "body": "- …as appearing in the NewClimate CPDB.\n- Defer import of pycountry itself until invoked.",
          "is_bot": false,
          "headline": "Add 4 aliases to pycountry.COUNTRY_NAME",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T17:42:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a40140f6553969ccf75ba66564261b241d8485",
          "body": null,
          "is_bot": false,
          "headline": "Type hint pooch.SOURCE as MutableMapping",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T17:42:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5974ba8ca5b3c82e0bee89ec47344e46bbc36c3d",
          "body": "Add BMT workflows and update functions to build Buildings module",
          "is_bot": false,
          "headline": "Merge pull request #433 from iiasa/bmt_dev",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T14:50:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12434be141c2d53de8fbf9c3750e74743d56fc8c",
          "body": "- Move doc/bmt.rst → doc/api/model-bmt.rst.\n- Add to toctree directives.\n- Add recursive autodoc of module contents.\n- Apply semantic line breaks.",
          "is_bot": false,
          "headline": "Add #433 to docs, whatsnew",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T11:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba60a26bf8bc6b6ecd2538eae1dd8e220862fe72",
          "body": null,
          "is_bot": false,
          "headline": "Move buildings tests to tests.model.test_buildings",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T11:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9af2781dd197f185877a0726e565421b8ca4076d",
          "body": null,
          "is_bot": false,
          "headline": "Add and use get_spec(…, filter_relations=…) param",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T11:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c5e11cdaf87f5454bea08bfd743c9487bd2f29a",
          "body": null,
          "is_bot": false,
          "headline": "Format and document .bmt.__init__",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T11:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14eedec2d992134c0cd0cf5a434d22de96f8c7a3",
          "body": "Adjust code for single-line statements.",
          "is_bot": false,
          "headline": "Format and document .bmt.workflow.generate()",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T11:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30c2c46e37f79d0a95fa2ce357adc2c40ce7377b",
          "body": "- Remove all but load_buildings_config() function.\n- Construct and return an instance of .buildings.Config().\n- Adjust data/bmt/config.yaml to match.\n- Adjust tests.",
          "is_bot": false,
          "headline": "Simplify .bmt.config",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-24T11:14:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2aeb319bcbdbec9427db6d474090673d94273d3",
          "body": "- Rename prepare_method() → prepare_method_A() to mirror\n  prepare_method_B().\n- Switch logic in main() based on Config.method.\n- Adjust imports of build_B() in other modules.\n- Adjust type hints.",
          "is_bot": false,
          "headline": "Consolidate .buildings.build.{build_B,main}",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-23T17:55:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db6df15c5923fe55f80cc4b50e5cba1eef118135",
          "body": null,
          "is_bot": false,
          "headline": "Add .buildings.Config.data_paths and defaults",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-23T17:55:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c37bf2fc453d4b8caea8286c64d3870ca2988851",
          "body": null,
          "is_bot": false,
          "headline": "Add .buildings.Config.method; METHOD enumeration",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-23T17:55:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db448ca415dc7bc9e44162eb2515cc9e0b9997a1",
          "body": "This allows the utility methods of the former class to be used on\ninstances of the latter.",
          "is_bot": false,
          "headline": "Subclass ConfigHelper for .buildings.Config",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-23T14:18:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f342e2f19bace92d54eda380af3cc441365f0950",
          "body": null,
          "is_bot": false,
          "headline": "Add ConfigHelper.read_file(…, key=…) argument",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-23T14:17:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2eff98caa8503c601666f747908f6b7d14b16c92",
          "body": "Mirror structure in .model.{material,transport}.",
          "is_bot": false,
          "headline": "Move .buildings.Config to a dedicated submodule",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-23T12:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4a8d408a6110e1481026841ee6b90d624c7a7e6",
          "body": "Address 3 F821 errors from ruff.",
          "is_bot": false,
          "headline": "Adjust import in .test_bmt",
          "author_name": "Paul Natsuo Kishimoto",
          "author_login": "khaeru",
          "committed_at": "2026-04-22T20:54:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86843e76ad08c5cc1fa709e543848a3742dfb38",
          "body": "Co-authored-by: Florian Maczek <62338954+macflo8@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Apply suggestions from code review",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f3956bd07431b04f15828d13cf1bc0d07bc9843",
          "body": null,
          "is_bot": false,
          "headline": "Specify dic with time year",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be03f4332f033529090bce1d09bab7fd2ee39ad6",
          "body": null,
          "is_bot": false,
          "headline": "Specify dict for other possible duplication of input_cap_new",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef68f965f1a87173de888768049b54fe06a322c4",
          "body": null,
          "is_bot": false,
          "headline": "Specify dict to pass Python 3.14 env test",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96e4464946b79a92e3db23ad8f01017f92b6319b",
          "body": null,
          "is_bot": false,
          "headline": "Add additional test",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d17a2a59bf77d6b6affa88bdcdb3e3f35449f7e",
          "body": null,
          "is_bot": false,
          "headline": "Update tech number as sp_el_RC_RT is added",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86ac6b82a4ac9e62d48aad45664e9ad7db36f70f",
          "body": null,
          "is_bot": false,
          "headline": "Revise test_buildings so it checks either afofi or afofio",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4955e80b2ca7817bd3b9a938e135710cbd56473",
          "body": null,
          "is_bot": false,
          "headline": "Add doc",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "735ac7c3d772e71569166bb225dd613a69eb50f7",
          "body": null,
          "is_bot": false,
          "headline": "Update build buildings to restrict required relations to existing ones",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab3f2cdd9fe4ad5bbb0cc590fa0a57c27767c19e",
          "body": null,
          "is_bot": false,
          "headline": "Add test",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d66e2ecaf7a73b5d08971e9fee929122ea40b68",
          "body": null,
          "is_bot": false,
          "headline": "Update build buildings",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f16935be74047292b4a091cdca2eee12bd2fd37",
          "body": null,
          "is_bot": false,
          "headline": "Update BMT workflow with config",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "172c875d1dc6563e68509b62f5533397a6969fed",
          "body": null,
          "is_bot": false,
          "headline": "Update bmt config",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec369e1a47ed8bf8e3be91edc17f917c65243b31",
          "body": null,
          "is_bot": false,
          "headline": "Revert non-Buildings commits",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "481ce0e5870a2dd80e40da8f3879b73245a8bd1f",
          "body": null,
          "is_bot": false,
          "headline": "Add build_T and update BMT workflow",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83e574e1c58f5a563cbcb7d972ed4a2cf9bc1f7b",
          "body": null,
          "is_bot": false,
          "headline": "Update workflow for the current BM setting",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8dff8cedb065e552aea69609a747bb75f5a3f95",
          "body": null,
          "is_bot": false,
          "headline": "Add RT_elec_share_RC_max share mode constraint",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be2a8198788c0c9dd99f94c4fa9b6e5fff906599",
          "body": null,
          "is_bot": false,
          "headline": "Limit RT end-uses",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7470d60d96d76325aa1cb95c194814fea5c99b0",
          "body": null,
          "is_bot": false,
          "headline": "Remove ACT/CAP bounds of rc techs in 2020/2025",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "305d707fc3cb5764ee6dfb01167f4187c52bc1b9",
          "body": null,
          "is_bot": false,
          "headline": "Update set yaml",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86f8734bc2a840ca41aae830f025bcf96f37e9c",
          "body": null,
          "is_bot": false,
          "headline": "Add prepare_data_B",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "935fbb33a14285b2c419fd49de49cf360169a79c",
          "body": null,
          "is_bot": false,
          "headline": "Update build",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcef297736de47ab54f0d737967382ca0846eaa5",
          "body": null,
          "is_bot": false,
          "headline": "Add commodity definition",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9202dd570b9584d582c3b328d80430b41f9a7de",
          "body": null,
          "is_bot": false,
          "headline": "Revert prepare_data to NAVIGATE version (commit 630d110)",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9e27ce1c920d532c450278d78bbf4eab84316ca",
          "body": null,
          "is_bot": false,
          "headline": "Deal with sp_el_RC_RT",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d022f3bf68388497b2136f4153e4b0622e874062",
          "body": null,
          "is_bot": false,
          "headline": "Remove placeholders",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8af78bf5ef61c341b0cdc2be859de75b3210003",
          "body": null,
          "is_bot": false,
          "headline": "Update BMT workflow",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a653711b386f0a82a7c4b4e6413baece04650e7",
          "body": null,
          "is_bot": false,
          "headline": "Update worklfow with PM in the last step",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bbefb13c6e82225e669d534cae651c2d5246f43",
          "body": null,
          "is_bot": false,
          "headline": "Add build_PM function for power sector material intensity",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "985f225869da23744b33ae9360f49605e418aaee",
          "body": null,
          "is_bot": false,
          "headline": "Update bm_subtraction method",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6be15b29946ea7acc8fb513ab4ba2d109b4db40e",
          "body": null,
          "is_bot": false,
          "headline": "Update workflow for takeaway BM scenario",
          "author_name": "JU Yiyi",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "043b2f30bf32f9f14f3242b773581dced2e23718",
          "body": null,
          "is_bot": false,
          "headline": "Add material subtraction vetting",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00a00bc92fd324f7ed0c98843f74ea08f39fcc2d",
          "body": null,
          "is_bot": false,
          "headline": "Standardize how to treat material double-counting",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "828974ade8dcc503684b072c8050c710c35185a6",
          "body": null,
          "is_bot": false,
          "headline": "Assign useful energy and demand levels and additional nots",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5422c0de209c8c4fdb8fd49c87e0fa82ea76aee",
          "body": null,
          "is_bot": false,
          "headline": "Update context build material",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12b6c96a9d76c01e7eb2579671305ab5a963213d",
          "body": null,
          "is_bot": false,
          "headline": "Add optional way to add afofi and update workflow",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bd994b86221c873bcf6e796e84304e4dbf14ffc",
          "body": null,
          "is_bot": false,
          "headline": "Add a placeholder for add_dac to skip errors",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb05e3d68c218c980449d71fc74a412883b3bfe2",
          "body": null,
          "is_bot": false,
          "headline": "Apply pre-commit auto-fixes",
          "author_name": "yiyi1991",
          "author_login": "yiyi1991",
          "committed_at": "2026-04-22T20:46:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 39,
      "commits_last_year": 840,
      "latest_release_at": "2026-04-17T21:27:18Z",
      "latest_release_tag": "v2026.4.17",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 43,
      "days_since_latest_release": 99,
      "mean_days_between_releases": 80.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "message-ix-models",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "Development Status :: 5 - Production/Stable",
            "Intended Audience :: Developers",
            "Intended Audience :: Science/Research",
            "Natural Language :: English",
            "Operating System :: OS Independent",
            "Programming Language :: Python",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14",
            "Programming Language :: R",
            "Topic :: Scientific/Engineering",
            "Topic :: Scientific/Engineering :: Information Analysis"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/message-ix-models/",
          "is_deprecated": false,
          "latest_version": "2026.4.17",
          "repository_url": "https://github.com/iiasa/message-ix-models",
          "versions_count": 59,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2021-02-23T15:37:17.352988Z",
          "latest_published_at": "2026-04-17T21:30:05.693625Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 99
        }
      ]
    },
    "popularity": {
      "forks": 57,
      "stars": 32,
      "watchers": 18,
      "fork_history": {
        "days": [
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-16",
            "count": 1
          },
          {
            "date": "2021-04-21",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-17",
            "count": 1
          },
          {
            "date": "2021-06-25",
            "count": 1
          },
          {
            "date": "2021-09-14",
            "count": 1
          },
          {
            "date": "2021-10-05",
            "count": 1
          },
          {
            "date": "2022-03-10",
            "count": 1
          },
          {
            "date": "2022-04-17",
            "count": 1
          },
          {
            "date": "2022-05-24",
            "count": 1
          },
          {
            "date": "2022-05-31",
            "count": 1
          },
          {
            "date": "2022-06-08",
            "count": 1
          },
          {
            "date": "2022-07-07",
            "count": 1
          },
          {
            "date": "2022-10-11",
            "count": 1
          },
          {
            "date": "2023-05-11",
            "count": 1
          },
          {
            "date": "2023-06-07",
            "count": 1
          },
          {
            "date": "2023-10-23",
            "count": 1
          },
          {
            "date": "2023-11-13",
            "count": 1
          },
          {
            "date": "2023-11-23",
            "count": 4
          },
          {
            "date": "2024-01-24",
            "count": 1
          },
          {
            "date": "2024-03-21",
            "count": 1
          },
          {
            "date": "2024-03-31",
            "count": 1
          },
          {
            "date": "2024-04-15",
            "count": 1
          },
          {
            "date": "2024-05-24",
            "count": 1
          },
          {
            "date": "2024-07-30",
            "count": 1
          },
          {
            "date": "2024-08-27",
            "count": 1
          },
          {
            "date": "2024-11-12",
            "count": 1
          },
          {
            "date": "2024-11-26",
            "count": 1
          },
          {
            "date": "2024-12-22",
            "count": 1
          },
          {
            "date": "2025-01-23",
            "count": 2
          },
          {
            "date": "2025-03-17",
            "count": 1
          },
          {
            "date": "2025-04-02",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-17",
            "count": 1
          },
          {
            "date": "2025-06-04",
            "count": 1
          },
          {
            "date": "2025-06-17",
            "count": 1
          },
          {
            "date": "2025-06-30",
            "count": 1
          },
          {
            "date": "2025-07-13",
            "count": 1
          },
          {
            "date": "2025-07-21",
            "count": 1
          },
          {
            "date": "2025-08-18",
            "count": 1
          },
          {
            "date": "2025-09-15",
            "count": 1
          },
          {
            "date": "2025-10-06",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 1
          },
          {
            "date": "2026-01-30",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-04-11",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-03",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 56,
        "total_forks": 57
      },
      "star_history": null,
      "open_issues_and_prs": 136
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "doc/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "message_ix_models/py.typed"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 290980,
      "source_files_sampled": 374,
      "oversized_source_files": 5,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "doc/requirements.txt",
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 112,
        "malicious_count": 0,
        "assessed_package": "pypi:message-ix-models@2026.4.17",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "click",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "colorama",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "genno",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">= 1.25"
        },
        {
          "name": "iam_units",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">= 2023.9.11"
        },
        {
          "name": "message_ix",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">= 3.8"
        },
        {
          "name": "pooch",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pyam-iamc",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">= 0.6"
        },
        {
          "name": "pyarrow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pycountry",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "PyYAML",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "sdmx1",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">= 2.22.0"
        },
        {
          "name": "tqdm",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pyxlsb",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">= 1.0.10"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "click",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "click",
            "direct": true,
            "version": "8.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "colorama",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "colorama",
            "direct": true,
            "version": "0.4.6",
            "ecosystem": "pypi"
          },
          {
            "name": "genno",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "genno",
            "direct": true,
            "version": "1.30.1",
            "ecosystem": "pypi"
          },
          {
            "name": "iam-units",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "iam-units",
            "direct": true,
            "version": "2026.5.18",
            "ecosystem": "pypi"
          },
          {
            "name": "message-ix",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pooch",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pooch",
            "direct": true,
            "version": "1.9.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyam-iamc",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyam-iamc",
            "direct": true,
            "version": "3.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyarrow",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyarrow",
            "direct": true,
            "version": "24.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pycountry",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pycountry",
            "direct": true,
            "version": "26.2.16",
            "ecosystem": "pypi"
          },
          {
            "name": "pyxlsb",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyxlsb",
            "direct": true,
            "version": "1.0.10",
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": "6.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "sdmx1",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sdmx1",
            "direct": true,
            "version": "2.26.0",
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": true,
            "version": "4.67.3",
            "ecosystem": "pypi"
          },
          {
            "name": "alabaster",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "alembic",
            "direct": false,
            "version": "1.18.4",
            "ecosystem": "pypi"
          },
          {
            "name": "annotated-doc",
            "direct": false,
            "version": "0.0.4",
            "ecosystem": "pypi"
          },
          {
            "name": "annotated-types",
            "direct": false,
            "version": "0.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "anyio",
            "direct": false,
            "version": "4.13.0",
            "ecosystem": "pypi"
          },
          {
            "name": "argon2-cffi",
            "direct": false,
            "version": "25.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "argon2-cffi-bindings",
            "direct": false,
            "version": "25.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "arrow",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ast-serialize",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "asttokens",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "async-lru",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "attrs",
            "direct": false,
            "version": "26.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "babel",
            "direct": false,
            "version": "2.16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "beautifulsoup4",
            "direct": false,
            "version": "4.14.3",
            "ecosystem": "pypi"
          },
          {
            "name": "bleach",
            "direct": false,
            "version": "6.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cattrs",
            "direct": false,
            "version": "26.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "certifi",
            "direct": false,
            "version": "2023.7.22",
            "ecosystem": "pypi"
          },
          {
            "name": "cffi",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "charset-normalizer",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cloudpickle",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "comm",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "pypi"
          },
          {
            "name": "contourpy",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "pypi"
          },
          {
            "name": "coverage",
            "direct": false,
            "version": "7.14.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cramjam",
            "direct": false,
            "version": "2.11.0",
            "ecosystem": "pypi"
          },
          {
            "name": "cycler",
            "direct": false,
            "version": "0.12.1",
            "ecosystem": "pypi"
          },
          {
            "name": "dask",
            "direct": false,
            "version": "2026.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "debugpy",
            "direct": false,
            "version": "1.8.20",
            "ecosystem": "pypi"
          },
          {
            "name": "decorator",
            "direct": false,
            "version": "5.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "defusedxml",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "docutils",
            "direct": false,
            "version": "0.21.2",
            "ecosystem": "pypi"
          },
          {
            "name": "et-xmlfile",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "execnet",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "executing",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "pypi"
          },
          {
            "name": "fastapi",
            "direct": false,
            "version": "0.136.1",
            "ecosystem": "pypi"
          },
          {
            "name": "fastjsonschema",
            "direct": false,
            "version": "2.21.2",
            "ecosystem": "pypi"
          },
          {
            "name": "fastparquet",
            "direct": false,
            "version": "2026.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "flexcache",
            "direct": false,
            "version": "0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "flexparser",
            "direct": false,
            "version": "0.4",
            "ecosystem": "pypi"
          },
          {
            "name": "fonttools",
            "direct": false,
            "version": "4.63.0",
            "ecosystem": "pypi"
          },
          {
            "name": "fqdn",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "fsspec",
            "direct": false,
            "version": "2026.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "gamsapi",
            "direct": false,
            "version": "53.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "gitdb",
            "direct": false,
            "version": "4.0.12",
            "ecosystem": "pypi"
          },
          {
            "name": "gitpython",
            "direct": false,
            "version": "3.1.50",
            "ecosystem": "pypi"
          },
          {
            "name": "graphviz",
            "direct": false,
            "version": "0.21",
            "ecosystem": "pypi"
          },
          {
            "name": "greenlet",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "h11",
            "direct": false,
            "version": "0.16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "h2",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "hpack",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "httpcore",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "pypi"
          },
          {
            "name": "httpx",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "pypi"
          },
          {
            "name": "hyperframe",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "idna",
            "direct": false,
            "version": "3.4",
            "ecosystem": "pypi"
          },
          {
            "name": "imagesize",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "pypi"
          },
          {
            "name": "iniconfig",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ipykernel",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ipython",
            "direct": false,
            "version": "9.13.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ipython-pygments-lexers",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "ipywidgets",
            "direct": false,
            "version": "8.1.8",
            "ecosystem": "pypi"
          },
          {
            "name": "isoduration",
            "direct": false,
            "version": "20.11.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ixmp",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ixmp4",
            "direct": false,
            "version": "0.14.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jaydebeapi",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "pypi"
          },
          {
            "name": "jedi",
            "direct": false,
            "version": "0.20.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jinja2",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "jpype1",
            "direct": false,
            "version": "1.7.1",
            "ecosystem": "pypi"
          },
          {
            "name": "json5",
            "direct": false,
            "version": "0.14.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jsonpointer",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jsonschema",
            "direct": false,
            "version": "4.26.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jsonschema-specifications",
            "direct": false,
            "version": "2025.9.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-client",
            "direct": false,
            "version": "8.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-console",
            "direct": false,
            "version": "6.6.3",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-core",
            "direct": false,
            "version": "5.9.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-events",
            "direct": false,
            "version": "0.12.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-lsp",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-server",
            "direct": false,
            "version": "2.18.2",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyter-server-terminals",
            "direct": false,
            "version": "0.5.4",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyterlab",
            "direct": false,
            "version": "4.5.7",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyterlab-pygments",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyterlab-server",
            "direct": false,
            "version": "2.28.0",
            "ecosystem": "pypi"
          },
          {
            "name": "jupyterlab-widgets",
            "direct": false,
            "version": "3.0.16",
            "ecosystem": "pypi"
          },
          {
            "name": "kiwisolver",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "pypi"
          },
          {
            "name": "lark",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "pypi"
          },
          {
            "name": "latexcodec",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "librt",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "pypi"
          },
          {
            "name": "locket",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "lxml",
            "direct": false,
            "version": "6.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "mako",
            "direct": false,
            "version": "1.3.12",
            "ecosystem": "pypi"
          },
          {
            "name": "markdown-it-py",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "markupsafe",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "pypi"
          },
          {
            "name": "matplotlib",
            "direct": false,
            "version": "3.10.9",
            "ecosystem": "pypi"
          },
          {
            "name": "matplotlib-inline",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "mdurl",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "pypi"
          },
          {
            "name": "memory-profiler",
            "direct": false,
            "version": "0.61.0",
            "ecosystem": "pypi"
          },
          {
            "name": "mistune",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "pypi"
          },
          {
            "name": "mizani",
            "direct": false,
            "version": "0.14.4",
            "ecosystem": "pypi"
          },
          {
            "name": "mypy",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "mypy-extensions",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "narwhals",
            "direct": false,
            "version": "2.21.2",
            "ecosystem": "pypi"
          },
          {
            "name": "nbclient",
            "direct": false,
            "version": "0.10.4",
            "ecosystem": "pypi"
          },
          {
            "name": "nbconvert",
            "direct": false,
            "version": "7.17.1",
            "ecosystem": "pypi"
          },
          {
            "name": "nbformat",
            "direct": false,
            "version": "5.10.4",
            "ecosystem": "pypi"
          },
          {
            "name": "nest-asyncio",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "notebook",
            "direct": false,
            "version": "7.5.6",
            "ecosystem": "pypi"
          },
          {
            "name": "notebook-shim",
            "direct": false,
            "version": "0.2.4",
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "numpydoc",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "openpyxl",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "pypi"
          },
          {
            "name": "packaging",
            "direct": false,
            "version": "26.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pandera",
            "direct": false,
            "version": "0.31.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pandocfilters",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "parso",
            "direct": false,
            "version": "0.8.7",
            "ecosystem": "pypi"
          },
          {
            "name": "partd",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pathspec",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "patsy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pexpect",
            "direct": false,
            "version": "4.9.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": false,
            "version": "12.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pint",
            "direct": false,
            "version": "0.25.3",
            "ecosystem": "pypi"
          },
          {
            "name": "platformdirs",
            "direct": false,
            "version": "4.9.6",
            "ecosystem": "pypi"
          },
          {
            "name": "plotly",
            "direct": false,
            "version": "6.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "plotnine",
            "direct": false,
            "version": "0.15.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pluggy",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "pypi"
          },
          {
            "name": "ply",
            "direct": false,
            "version": "3.11",
            "ecosystem": "pypi"
          },
          {
            "name": "prometheus-client",
            "direct": false,
            "version": "0.25.0",
            "ecosystem": "pypi"
          },
          {
            "name": "prompt-toolkit",
            "direct": false,
            "version": "3.0.52",
            "ecosystem": "pypi"
          },
          {
            "name": "psutil",
            "direct": false,
            "version": "7.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "psycopg",
            "direct": false,
            "version": "3.3.4",
            "ecosystem": "pypi"
          },
          {
            "name": "psycopg-binary",
            "direct": false,
            "version": "3.3.4",
            "ecosystem": "pypi"
          },
          {
            "name": "ptyprocess",
            "direct": false,
            "version": "0.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pure-eval",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "pypi"
          },
          {
            "name": "py-cpuinfo",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pybtex",
            "direct": false,
            "version": "0.26.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pybtex-docutils",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pycparser",
            "direct": false,
            "version": "3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic",
            "direct": false,
            "version": "2.13.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic-core",
            "direct": false,
            "version": "2.46.4",
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic-settings",
            "direct": false,
            "version": "2.14.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pygments",
            "direct": false,
            "version": "2.18.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pyjwt",
            "direct": false,
            "version": "2.12.1",
            "ecosystem": "pypi"
          },
          {
            "name": "pyparsing",
            "direct": false,
            "version": "3.3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": "9.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-benchmark",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-cov",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-httpserver",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-rerunfailures",
            "direct": false,
            "version": "16.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-timeout",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-xdist",
            "direct": false,
            "version": "3.8.0",
            "ecosystem": "pypi"
          },
          {
            "name": "python-dateutil",
            "direct": false,
            "version": "2.9.0.post0",
            "ecosystem": "pypi"
          },
          {
            "name": "python-dotenv",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "pypi"
          },
          {
            "name": "python-json-logger",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "pytz",
            "direct": false,
            "version": "2025.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyzmq",
            "direct": false,
            "version": "27.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "referencing",
            "direct": false,
            "version": "0.37.0",
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": false,
            "version": "2.31.0",
            "ecosystem": "pypi"
          },
          {
            "name": "requests-cache",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "pypi"
          },
          {
            "name": "rfc3339-validator",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "pypi"
          },
          {
            "name": "rfc3986-validator",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "pypi"
          },
          {
            "name": "rfc3987-syntax",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "rich",
            "direct": false,
            "version": "15.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "roman-numerals",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "rpds-py",
            "direct": false,
            "version": "0.30.0",
            "ecosystem": "pypi"
          },
          {
            "name": "scgraph",
            "direct": false,
            "version": "2.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "scipy",
            "direct": false,
            "version": "1.17.1",
            "ecosystem": "pypi"
          },
          {
            "name": "seaborn",
            "direct": false,
            "version": "0.13.2",
            "ecosystem": "pypi"
          },
          {
            "name": "send2trash",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": "82.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "shellingham",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "pypi"
          },
          {
            "name": "six",
            "direct": false,
            "version": "1.16.0",
            "ecosystem": "pypi"
          },
          {
            "name": "smmap",
            "direct": false,
            "version": "5.0.3",
            "ecosystem": "pypi"
          },
          {
            "name": "snowballstemmer",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "pypi"
          },
          {
            "name": "soupsieve",
            "direct": false,
            "version": "2.8.3",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinx",
            "direct": false,
            "version": "9.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinx-rtd-theme",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-applehelp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-bibtex",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-devhelp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-htmlhelp",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-jquery",
            "direct": false,
            "version": "4.1",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-jsmath",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-qthelp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sphinxcontrib-serializinghtml",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "sqlalchemy",
            "direct": false,
            "version": "2.0.49",
            "ecosystem": "pypi"
          },
          {
            "name": "sqlalchemy-utils",
            "direct": false,
            "version": "0.42.1",
            "ecosystem": "pypi"
          },
          {
            "name": "stack-data",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "pypi"
          },
          {
            "name": "starlette",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "statsmodels",
            "direct": false,
            "version": "0.14.6",
            "ecosystem": "pypi"
          },
          {
            "name": "terminado",
            "direct": false,
            "version": "0.18.1",
            "ecosystem": "pypi"
          },
          {
            "name": "tinycss2",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "toml",
            "direct": false,
            "version": "0.10.2",
            "ecosystem": "pypi"
          },
          {
            "name": "toolz",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "pypi"
          },
          {
            "name": "tornado",
            "direct": false,
            "version": "6.5.5",
            "ecosystem": "pypi"
          },
          {
            "name": "traitlets",
            "direct": false,
            "version": "5.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "transport-energy",
            "direct": false,
            "version": "2025.3.31",
            "ecosystem": "pypi"
          },
          {
            "name": "typeguard",
            "direct": false,
            "version": "4.5.2",
            "ecosystem": "pypi"
          },
          {
            "name": "typer",
            "direct": false,
            "version": "0.25.1",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-extensions",
            "direct": false,
            "version": "4.15.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-inspect",
            "direct": false,
            "version": "0.9.0",
            "ecosystem": "pypi"
          },
          {
            "name": "typing-inspection",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "pypi"
          },
          {
            "name": "tzdata",
            "direct": false,
            "version": "2025.2",
            "ecosystem": "pypi"
          },
          {
            "name": "uri-template",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "pypi"
          },
          {
            "name": "url-normalize",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "pypi"
          },
          {
            "name": "urllib3",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "pypi"
          },
          {
            "name": "wcwidth",
            "direct": false,
            "version": "0.7.0",
            "ecosystem": "pypi"
          },
          {
            "name": "webcolors",
            "direct": false,
            "version": "25.10.0",
            "ecosystem": "pypi"
          },
          {
            "name": "webencodings",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "pypi"
          },
          {
            "name": "websocket-client",
            "direct": false,
            "version": "1.9.0",
            "ecosystem": "pypi"
          },
          {
            "name": "werkzeug",
            "direct": false,
            "version": "3.1.8",
            "ecosystem": "pypi"
          },
          {
            "name": "widgetsnbextension",
            "direct": false,
            "version": "4.0.15",
            "ecosystem": "pypi"
          },
          {
            "name": "wquantiles",
            "direct": false,
            "version": "0.6",
            "ecosystem": "pypi"
          },
          {
            "name": "xarray",
            "direct": false,
            "version": "2026.4.0",
            "ecosystem": "pypi"
          },
          {
            "name": "xlrd",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "pypi"
          },
          {
            "name": "xlsxwriter",
            "direct": false,
            "version": "3.2.9",
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 239,
        "direct_count": 25,
        "indirect_count": 214
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 39,
        "merged_prs": 280,
        "open_issues": 97,
        "closed_ratio": 0.382,
        "closed_issues": 60,
        "closed_unmerged_prs": 46
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "khaeru",
          "commits": 4488,
          "avatar_url": "https://avatars.githubusercontent.com/u/1634164?v=4"
        },
        {
          "type": "User",
          "login": "macflo8",
          "commits": 677,
          "avatar_url": "https://avatars.githubusercontent.com/u/62338954?v=4"
        },
        {
          "type": "User",
          "login": "zilliacus",
          "commits": 462,
          "avatar_url": "https://avatars.githubusercontent.com/u/17705034?v=4"
        },
        {
          "type": "User",
          "login": "measrainsey",
          "commits": 362,
          "avatar_url": "https://avatars.githubusercontent.com/u/21201137?v=4"
        },
        {
          "type": "User",
          "login": "GamzeUnlu95",
          "commits": 312,
          "avatar_url": "https://avatars.githubusercontent.com/u/44092465?v=4"
        },
        {
          "type": "User",
          "login": "junukitashepard",
          "commits": 193,
          "avatar_url": "https://avatars.githubusercontent.com/u/51372492?v=4"
        },
        {
          "type": "User",
          "login": "Gardina2016",
          "commits": 177,
          "avatar_url": "https://avatars.githubusercontent.com/u/19169620?v=4"
        },
        {
          "type": "User",
          "login": "Jihoon",
          "commits": 160,
          "avatar_url": "https://avatars.githubusercontent.com/u/13112?v=4"
        },
        {
          "type": "User",
          "login": "adrivinca",
          "commits": 159,
          "avatar_url": "https://avatars.githubusercontent.com/u/22025365?v=4"
        },
        {
          "type": "User",
          "login": "Wegatriespython",
          "commits": 146,
          "avatar_url": "https://avatars.githubusercontent.com/u/149388560?v=4"
        }
      ],
      "contributors_sampled": 31,
      "top_contributor_share": 0.567
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "publish.yaml",
        "pytest-snapshots.yaml",
        "pytest.yaml",
        "transport.yaml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "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": 5,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "5 out of 5 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 2,
            "reason": "Found 1/4 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 13 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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 7 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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "80 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8e13506d86f319de84438ec03c23b6809de33015",
        "ran_at": "2026-07-26T07:18:11Z",
        "aggregate_score": 4.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T06:51:50Z",
      "oldest_open_prs": [
        {
          "number": 57,
          "created_at": "2022-03-10T11:10:08Z",
          "last_comment_at": "2022-05-02T10:50:42Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 58,
          "created_at": "2022-03-10T16:17:33Z",
          "last_comment_at": "2022-03-10T16:23:16Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 205,
          "created_at": "2024-07-11T10:51:22Z",
          "last_comment_at": "2024-07-11T10:57:43Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 223,
          "created_at": "2024-09-02T14:47:05Z",
          "last_comment_at": "2024-09-02T14:54:01Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 228,
          "created_at": "2024-09-12T07:37:58Z",
          "last_comment_at": "2024-09-12T07:45:09Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 254,
          "created_at": "2024-11-26T12:23:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 257,
          "created_at": "2024-11-28T10:26:25Z",
          "last_comment_at": "2024-11-28T10:36:50Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 270,
          "created_at": "2024-12-18T12:35:53Z",
          "last_comment_at": "2024-12-18T13:13:11Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 274,
          "created_at": "2025-01-13T08:18:57Z",
          "last_comment_at": "2025-01-13T08:30:31Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 276,
          "created_at": "2025-01-13T12:40:03Z",
          "last_comment_at": "2025-03-03T09:45:11Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 277,
          "created_at": "2025-01-13T13:33:35Z",
          "last_comment_at": "2025-01-13T13:47:22Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 290,
          "created_at": "2025-01-30T13:16:35Z",
          "last_comment_at": "2025-09-11T09:18:19Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 329,
          "created_at": "2025-04-07T13:44:19Z",
          "last_comment_at": "2025-04-07T13:57:13Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 348,
          "created_at": "2025-05-13T09:48:34Z",
          "last_comment_at": "2025-05-13T09:59:36Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 425,
          "created_at": "2025-09-17T19:54:45Z",
          "last_comment_at": "2026-05-22T12:36:06Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 455,
          "created_at": "2025-11-12T15:57:45Z",
          "last_comment_at": "2025-11-12T16:24:36Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 456,
          "created_at": "2025-11-12T22:12:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 465,
          "created_at": "2025-12-05T12:39:01Z",
          "last_comment_at": "2025-12-05T13:03:34Z",
          "last_comment_author": "codecov"
        },
        {
          "number": 466,
          "created_at": "2025-12-10T16:32:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 473,
          "created_at": "2026-02-02T22:03:55Z",
          "last_comment_at": "2026-02-03T15:05:49Z",
          "last_comment_author": "codecov"
        }
      ],
      "last_merged_pr_at": "2026-06-25T08:21:38Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 27,
          "created_at": "2021-07-21T08:35:33Z",
          "last_comment_at": "2024-04-19T07:38:54Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 40,
          "created_at": "2021-12-17T15:33:57Z",
          "last_comment_at": "2021-12-20T08:50:00Z",
          "last_comment_author": "adrivinca"
        },
        {
          "number": 45,
          "created_at": "2022-02-22T16:24:17Z",
          "last_comment_at": "2022-03-04T10:32:01Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 65,
          "created_at": "2022-04-05T07:56:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 67,
          "created_at": "2022-04-26T09:47:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 70,
          "created_at": "2022-05-04T14:23:19Z",
          "last_comment_at": "2022-05-04T14:23:57Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 93,
          "created_at": "2023-03-06T15:00:18Z",
          "last_comment_at": "2023-03-07T10:26:47Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 126,
          "created_at": "2023-09-15T08:13:47Z",
          "last_comment_at": "2023-09-15T08:15:16Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 128,
          "created_at": "2023-09-20T11:01:28Z",
          "last_comment_at": "2023-09-22T09:00:15Z",
          "last_comment_author": "glatterf42"
        },
        {
          "number": 133,
          "created_at": "2023-10-16T15:23:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 136,
          "created_at": "2023-10-24T09:22:17Z",
          "last_comment_at": "2024-01-29T16:30:32Z",
          "last_comment_author": "khaeru"
        },
        {
          "number": 139,
          "created_at": "2023-11-24T09:26:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 140,
          "created_at": "2023-12-14T15:34:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 147,
          "created_at": "2024-01-22T06:44:49Z",
          "last_comment_at": "2024-01-23T09:27:43Z",
          "last_comment_author": "glatterf42"
        },
        {
          "number": 148,
          "created_at": "2024-01-22T08:36:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 164,
          "created_at": "2024-04-08T08:46:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 170,
          "created_at": "2024-04-14T22:57:22Z",
          "last_comment_at": "2024-04-16T06:10:31Z",
          "last_comment_author": "glatterf42"
        },
        {
          "number": 171,
          "created_at": "2024-04-15T09:51:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 172,
          "created_at": "2024-04-17T07:03:50Z",
          "last_comment_at": "2024-04-18T15:18:47Z",
          "last_comment_author": "Jihoon"
        },
        {
          "number": 177,
          "created_at": "2024-04-19T10:49:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/iiasa/message-ix-models",
    "host": "github.com",
    "name": "message-ix-models",
    "owner": "iiasa"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 71,
      "inputs": {
        "security": 59,
        "vitality": 89,
        "community": 51,
        "governance": 64,
        "engineering": 88
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 89,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "commits_last_year": 840,
              "human_commit_share": 0.99,
              "days_since_last_push": 1,
              "active_weeks_last_year": 43
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "43/52 weeks with commits",
                "points": 29.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 43
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "840 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 840
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 7 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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 82,
            "inputs": {
              "releases_count": 39,
              "latest_release_tag": "v2026.4.17",
              "releases_from_tags": false,
              "days_since_latest_release": 99,
              "mean_days_between_releases": 80.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "39 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 39
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 99 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 99
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~80.6 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 80.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 60,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 60 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 60
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 51,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "forks": 57,
              "stars": 32,
              "watchers": 18,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "32 stars",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "57 forks",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 57
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "18 watchers",
                "points": 6.8,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 64,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 31,
              "top_contributor_share": 0.567
            },
            "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 57% of commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 57
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "31 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 31
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "merged_prs": 280,
              "open_issues": 97,
              "closed_issues": 60,
              "issue_closed_ratio": 0.382,
              "closed_unmerged_prs": 46
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "38% of issues closed",
                "points": 17.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 38
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "280/326 decided PRs merged",
                "points": 32.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 280,
                      "decided": 326
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/4 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "followers": 212,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "iiasa",
              "public_repos": 202,
              "account_age_days": 3930
            },
            "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": "212 followers of iiasa",
                "points": 16.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 212,
                      "login": "iiasa"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "202 public repos, account ~10 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 202
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 10
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "message-ix-models"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 99
            },
            "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 99 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 99
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "59 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 59
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 88,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "5 out of 5 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://docs.messageix.org/models",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://docs.messageix.org/models",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": 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": "moderate",
        "name": "Security",
        "value": 59,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.9
            },
            "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 is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "5 out of 5 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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/4 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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 7 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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "80 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:message-ix-models@2026.4.17 runtime dependency closure — what installing the published package pulls in — 112 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:message-ix-models@2026.4.17",
                  "assessed": 112
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 112,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 112,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 8
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 50,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "critical",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.242,
              "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": "24 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 12.9,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 24,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "doc/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "message_ix_models/py.typed"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "doc/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "doc/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "message_ix_models/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "message_ix_models/py.typed"
                    }
                  }
                ],
                "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": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "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": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 290980,
              "source_files_sampled": 374,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (message_ix_models/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "message_ix_models/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/374 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 374,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "notebooks"
              ],
              "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": "notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "notebooks"
                    }
                  }
                ],
                "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T07:19:01.949318Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/iiasa/message-ix-models.svg",
  "full_name": "iiasa/message-ix-models",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.