Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.26.0 · метрики 1.13.0 · 2026-07-22 08:22 UTC

xarray-contrib / xarray-spatial

Spatial analysis algorithms for xarray implemented in numba

PythonMIT★ 956 зірок⑂ 93 форкиз лют. 2020 р.Переглянути на GitHub ↗

xarray-contrib/xarray-spatial має індекс здоров’я 75 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (89/100), найнижчий — Security (50/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

75
загалом / 100
Добрий

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

75
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

xarray-contrib Організація
120 підписників34 публічні репозиторіїз січ. 2018 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
PyPIxarray-spatial0.10.17-704 дні тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

89Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
18/36Ритм комітів — 26/52 тижнів із комітами
18/18Обсяг комітів — 1 530 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year1 530
human_commit_share1
days_since_last_push0
active_weeks_last_year26
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 71 релізів
36/36Свіжість релізів — останній реліз 4 дн. тому
27/27Ритм релізів — реліз кожні ~3,6 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count71
latest_release_tagv0.10.17
releases_from_tagsні
days_since_latest_release4
mean_days_between_releases3,6
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

81Добрий · 18% загального індексу
Як обчислюється оцінка
48.3/60Зірки — 956 зірок
16.4/25Форки — 93 форків
6.5/15Спостерігачі — 16 спостерігачів
Використані вхідні дані
forks93
stars956
watchers16
growth_stateorganic
growth_factor_pct100
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
13.5/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductтак
has_pull_request_templateтак

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

68Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
3.2/22.5Розподіл комітів — головний контриб’ютор — автор 86% комітів
13.5/13.5Широта контриб’юторів — 32 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 13 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled32
top_contributor_share0,856
Як обчислюється оцінка
45.2/46.8Вирішення issue — закрито 97% issue
36.5/38.3Прийняття PR — злито 1 763/1 848 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 1/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs1 763
open_issues62
closed_issues1 751
issue_closed_ratio0,966
closed_unmerged_prs85
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
15/25Охоплення власника — 120 підписників у xarray-contrib
23.2/25Послужний список — 34 публічних репозиторіїв, вік облікового запису ~8 р.
Використані вхідні дані
followers120
owner_typeOrganization
is_verified
owner_loginxarray-contrib
public_repos34
account_age_days3 101

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у pypi
35/35Свіжість публікацій — остання публікація 4 дн. тому
20/20Історія версій — 70 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesxarray-spatial
ecosystemspypi
any_deprecatedні
min_days_since_publish4

Інженерна якість

Чи наявні базові інженерні практики та документація?

81Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 9 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

100Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://xarray-spatial.readthedocs.io/
10/10Опис репозиторію
10/10Теми — 5 тем
10/10Wiki
Використані вхідні дані
topicspython, raster-analysis, spatial-analysis, numba, xarray
has_wikiтак
homepagehttps://xarray-spatial.readthedocs.io/
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

50Помірний · 16% загального індексу

Стан безпеки

50Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
2.5/2.5CI-Tests — 30 out of 30 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
0/7.5Code-Review — Found 1/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 13 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
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 — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5
Виключено з оцінювання (немає даних або не застосовно): branch_protection, signed_releases. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

56Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 91 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,91
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes2 724
Як обчислюється оцінка
18/18Розгортання однією командою — docs/Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
0/10Відтворюване середовище
2/10Підтверджена практика роботи з агентами — 1 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileні
typed_languageні
bootstrap_filesdocs/Makefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,01
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
0/45Типізований код — Python без конфігурації перевірки типів
48.4/55Керовані розміри файлів — 61/512 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePython
largest_source_bytes333 619
source_files_sampled512
oversized_source_files61
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples, notebooks
Використані вхідні дані
example_dirsexamples, notebooks
has_mcp_signalні
api_schema_files

Ключові факти

956зірок GitHub
32контриб'юторів
1 530комітів за останні 12 місяців
0днів від останнього пушу
71релізів
1бас-фактор
62відкритих issue
PyPIпакетних екосистем

Попередження щодо збору даних

  • deps.dev does not index pypi:xarray-spatial@0.10.17; advisories assessed against the repository dependency graph instead
  • No resolved dependencies carried a version and a supported ecosystem

Докладніше

Історія зірок і форків 956 ★ / 93 ⇿
956Зірки
93Форки
69Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

02004006008001 00095693172020-022023-042026-07
Мажорні 0Мінорні 10Патчі 59

Кожна точка охоплює 6 днів.

OpenSSF Scorecard 5.0 / 10
5.0сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-22 08:21 UTC

10Binary-Artifactsno binaries found in the repo
н/дBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/30 approved changesets -- score normalized to 0
10Contributorsproject has 13 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow 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
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 6
РеєстрПакетОбмеження версіїМаніфест
PyPInumbasetup.cfg
PyPIscipysetup.cfg
PyPIxarraysetup.cfg
PyPInumpysetup.cfg
PyPIurllib3setup.cfg
PyPIzstandardsetup.cfg
Усі залежності 1

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 1 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
PyPIsetuptoolsнепряма
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies carried a version and a supported ecosystem

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "python",
        "raster-analysis",
        "spatial-analysis",
        "numba",
        "xarray"
      ],
      "is_fork": false,
      "size_kb": 324539,
      "has_wiki": true,
      "homepage": "https://xarray-spatial.readthedocs.io/",
      "languages": {
        "Python": 12521797
      },
      "pushed_at": "2026-07-21T16:21:05Z",
      "created_at": "2020-02-08T19:02:33Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T16:21:09Z",
      "description": "Spatial analysis algorithms for xarray implemented in numba",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://xarray.dev",
      "name": "xarray-contrib ",
      "type": "Organization",
      "login": "xarray-contrib",
      "company": null,
      "location": null,
      "followers": 120,
      "avatar_url": "https://avatars.githubusercontent.com/u/35757293?v=4",
      "created_at": "2018-01-24T06:13:32Z",
      "is_verified": null,
      "public_repos": 34,
      "account_age_days": 3101
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.10.17",
          "kind": "patch",
          "published_at": "2026-07-17T19:14:28Z"
        },
        {
          "tag": "v0.10.16",
          "kind": "patch",
          "published_at": "2026-07-09T20:55:23Z"
        },
        {
          "tag": "v0.10.15",
          "kind": "patch",
          "published_at": "2026-06-29T21:11:59Z"
        },
        {
          "tag": "v0.10.14",
          "kind": "patch",
          "published_at": "2026-06-29T04:22:18Z"
        },
        {
          "tag": "v0.10.13",
          "kind": "patch",
          "published_at": "2026-06-26T18:26:51Z"
        },
        {
          "tag": "v0.10.12",
          "kind": "patch",
          "published_at": "2026-06-25T15:07:03Z"
        },
        {
          "tag": "v0.10.11",
          "kind": "patch",
          "published_at": "2026-06-22T13:51:32Z"
        },
        {
          "tag": "v0.10.10",
          "kind": "patch",
          "published_at": "2026-06-17T20:53:31Z"
        },
        {
          "tag": "v0.10.9",
          "kind": "patch",
          "published_at": "2026-06-15T19:23:42Z"
        },
        {
          "tag": "v0.10.8",
          "kind": "patch",
          "published_at": "2026-06-15T12:47:47Z"
        },
        {
          "tag": "v0.10.7",
          "kind": "patch",
          "published_at": "2026-06-14T04:51:03Z"
        },
        {
          "tag": "v0.10.6",
          "kind": "patch",
          "published_at": "2026-06-09T01:13:39Z"
        },
        {
          "tag": "v0.10.5",
          "kind": "patch",
          "published_at": "2026-06-07T03:02:13Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2026-06-05T13:15:18Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2026-06-03T17:39:02Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-06-01T15:52:52Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-05-29T14:15:43Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-05-27T15:27:22Z"
        },
        {
          "tag": "v0.9.9",
          "kind": "patch",
          "published_at": "2026-05-05T19:35:05Z"
        },
        {
          "tag": "v0.9.8",
          "kind": "patch",
          "published_at": "2026-04-29T19:33:53Z"
        },
        {
          "tag": "v0.9.7",
          "kind": "patch",
          "published_at": "2026-04-24T00:08:36Z"
        },
        {
          "tag": "v0.9.6",
          "kind": "patch",
          "published_at": "2026-04-05T20:04:48Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-03-31T20:24:01Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-03-31T12:13:42Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-03-28T04:33:16Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-03-14T00:35:20Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-03-05T05:39:44Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-03-05T00:48:44Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-03-03T16:13:40Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-02T14:59:40Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-02-25T06:58:55Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-02-23T05:10:18Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2025-12-18T20:10:46Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2025-12-16T15:33:41Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2025-12-15T21:04:08Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2024-04-26T18:13:27Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2023-06-09T04:33:21Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2023-06-02T14:04:00Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2022-06-05T15:38:25Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2022-06-01T05:05:08Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2022-03-21T16:08:05Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2022-02-04T10:47:16Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2022-01-10T11:07:41Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2021-12-01T09:44:38Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2021-09-01T16:58:09Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2021-08-27T15:51:22Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2021-07-30T15:44:19Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2021-06-28T17:49:44Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2021-06-24T18:58:05Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2021-06-10T21:16:51Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2021-06-02T16:28:02Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2021-05-07T20:40:58Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2021-05-07T18:45:25Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2021-04-29T14:15:27Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2021-04-27T18:58:55Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2021-04-15T18:54:44Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2021-04-15T18:54:30Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2021-04-13T04:09:41Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2021-04-13T03:29:50Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2021-04-13T03:28:15Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2021-04-06T04:24:19Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2020-12-01T23:18:16Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2020-10-21T22:39:11Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2020-09-11T01:41:06Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2020-08-28T21:11:55Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2020-07-22T21:12:38Z"
        },
        {
          "tag": "0.0.7",
          "kind": "patch",
          "published_at": "2020-07-22T03:18:06Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2020-07-15T00:43:40Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2020-07-05T23:16:44Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2020-06-25T00:40:42Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2020-04-09T18:03:12Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8bb03aee14bac8eb83128c2e525393b547632c1a",
          "body": "…tion docstrings (#3683)\n\n* Add Examples and fix cross-correlation wording in edge_detection docstrings (#3674)\n\n* Update documentation sweep state for edge_detection (#3674)\n\n* Address review: dedupe cross-correlation wording, note laplacian symmetry (#3674)\n\n* Refresh edge_detection sweep note after #3686 merge (#3674)",
          "is_bot": false,
          "headline": "Add Examples sections and fix cross-correlation wording in edge_detec…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-21T16:21:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9f7a841a536f6e464af20d20ae8f1e121ca1e75",
          "body": "…d multi-chunk dask (#3685)",
          "is_bot": false,
          "headline": "Add edge_detection tests for Inf, boundary NaN, degenerate shapes, an…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-19T20:56:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd09e9cdfc4a4b52213262b2b3d863d5ac743fc6",
          "body": null,
          "is_bot": false,
          "headline": "Add golden-value tests pinning edge_detection to scipy.ndimage (#3681)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-19T20:56:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c3dbbaaf3c5f64dbc59ce7a0fdeafaea170359a",
          "body": "…679)",
          "is_bot": false,
          "headline": "Fix flake8 E201 in edge_detection kernels, lint test file (#3675) (#3…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-19T20:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f94444b08ab64c3531f04d3b51b8eb61d90c8adf",
          "body": null,
          "is_bot": false,
          "headline": "Document NaN propagation in edge_detection docstrings (#3678)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-19T20:51:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f33af60a7c29e6552d6fc941d5a4ed8d0520c772",
          "body": null,
          "is_bot": false,
          "headline": "Add asv benchmarks for edge_detection (#3672) (#3673)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-19T19:14:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60b2f1a1eaf872fcf7f43a8d96efa0530dfa02c4",
          "body": "…686)",
          "is_bot": false,
          "headline": "Promote wide integer rasters to float64 in edge_detection (#3680) (#3…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-18T18:22:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "418f7750992fa7f73b6d385f00c0738ab3991788",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v0.10.17 release (#3671)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-17T17:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5aa309e417fee2754b1eb9847154c670e1af01a9",
          "body": "* Remove canvas_like and datashader refs from source (#3451, #3640)\n\n- Delete canvas_like() from xrspatial/utils.py (incl. the import\n  datashader as ds try/except). canvas_like had no callers in xrspatial/\n  and was never exported.\n- Rewrite the suggest_zonal_canvas docstring example in xrspatial/z\n[…]\nne in the docstring.\n- pharmacy-deserts.ipynb: sharpen the merge='last' comment to state the\n  non-overlap assumption (each pixel covered by exactly one polygon)\n  that makes it equivalent to ds.mean.",
          "is_bot": false,
          "headline": "Decouple datashader from xarray-spatial (#3641)",
          "author_name": "Paolo Melissari",
          "author_login": "Melissari1997",
          "committed_at": "2026-07-17T17:33:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "14a6ad20e39b03e88965b29db5609338d6876c18",
          "body": "… parameter branches (#3665)\n\n* Add pathfinding test coverage for dask edges, degenerate shapes, and parameter branches (#3657)\n\nBranch coverage 86% -> 96%. New tests: dask barrier/NaN/no-path/warning\npaths, 1x1 and strip rasters on all backends, friction and search_radius\nparameter branches, cupy s\n[…]\nssion: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4\n\n* Address review: dask+cupy barrier parity test, 5x1 cupy strip\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Add pathfinding test coverage: dask edge handling, degenerate shapes,…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-17T16:49:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f186584617894b453f51b503b1181c6d4403b31",
          "body": "…, document NaN impassability (#3651) (#3662)\n\n* Fix pathfinding docstring gaps: multi_stop_search Examples, sourcecode directive, NaN semantics (#3651)\n\n- Add a runnable Examples section to multi_stop_search (verified output)\n- Fix a_star_search's '... sourcecode:: python' directive (three dots\n  r\n[…]\nclaude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4\n\n* Address review suggestion: fix snap_start/snap_goal numpydoc spacing (#3651)\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "pathfinding: add multi_stop_search Examples, fix sourcecode directive…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-17T15:48:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6fb13920783c30255d37d4681a5f381cbc024bbb",
          "body": "…e_order (#3654)\n\n* sweep-accuracy: pathfinding re-audit 2026-07-08 (#3646 HIGH, #3647 MEDIUM)\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4\n\n* Raise on infeasible tours and honor snap in multi_stop_search optimize_order (#3646)\n\n_held_karp returned [start, end] when every\n[…]\not an infinite distance and fell into the same hole.\nUse the max-finite-cost pixel as the true goal, matching the segment\nloop.\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Raise on infeasible tours and honor snap in multi_stop_search optimiz…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-17T15:48:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25b36939f4bd000dc5a7ffd5d81daa38bbce24da",
          "body": "…(#3645) (#3648)\n\nThe pathfinding benchmark only ran a_star_search on numpy at nx<=300.\nParameterize AStarSearch over numpy/cupy/dask and add nx=1000 (dask\ncapped at 300: the sparse Python A* takes ~4s per call at 1000). Add a\nMultiStopSearch class timing ordered routing and optimize_order.\n\nEvery combo was executed locally, including cupy on a GPU host.\nBenchmark-only change; no edits to xrspatial/pathfinding.py.\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Extend pathfinding asv benchmarks to dask/cupy and multi_stop_search …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-17T15:47:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04df01933eda774d17d88334426230345ef755d3",
          "body": "…3621)\n\nDeep-sweep test-coverage on a CUDA host. Branch coverage was 52% with the\ntest file exercising only numpy error paths and the default boundary mode.\n\nconvolve_2d/convolution_2d dispatch to numpy, cupy, dask+numpy, and\ndask+cupy, but only the numpy path had tests. Add:\n\n- Backend parity: conv\n[…]\nellsize, annulus_kernel,\n  custom_kernel valid/non-ndarray/even-dims, circle_kernel bad radius/unit.\n\nFull file: 26 passed including 3 GPU tests. No source change; no bug\nsurfaced. flake8/isort clean.",
          "is_bot": false,
          "headline": "test(convolution): close backend, boundary, metadata coverage gaps (#…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-17T15:47:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "275240f4991eb63d2b1ac3392787c5c6e19d10bc",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v0.10.16 release (#3670)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T20:54:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "056301281b798b6fa7d3da18657c92c7998263d0",
          "body": "…finding (#3664)\n\n* Validate barriers, search_radius, start/goal, and dims in pathfinding (#3649)\n\nString-typed barriers were silently ignored (numba compares float cells\nto unicode, always False), so a_star_search routed straight through\nwalls the caller asked to block. Negative or float search_rad\n[…]\n/session_0155N4QGamQVxgpAAPbpQNq4\n\n* Address review: validate barriers at the multi_stop boundary, document constraints (#3649)\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Validate barriers, search_radius, start/goal points, and dims in path…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T20:27:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01492d3a74e47a45afb0509c172590f56f7b7927",
          "body": "…669)",
          "is_bot": false,
          "headline": "Point README AI-review link to xarray-spatial-skills repo (#3668) (#3…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T20:27:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0561bfec311c32360600446ebf3898ea5eba336e",
          "body": null,
          "is_bot": false,
          "headline": "Stitch multi_stop_search segments lazily on dask backends (#3666)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T12:51:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f4fb3f428da0513d9754f72ab4c12b1abf9904a",
          "body": "…ring (#3658)",
          "is_bot": false,
          "headline": "style(pathfinding): drop unused has_dask_array import, fix isort orde…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T12:50:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3469f2a0661e9e76856bb08033521ecb3edf6d82",
          "body": null,
          "is_bot": false,
          "headline": "Route the HPA* coarse grid without value barriers (#3659)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T12:49:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36d170071cc9602b2fb4d71469ffa2304449825a",
          "body": "* Reset dask graph-token .name on pathfinding outputs (#3652)\n\nOn dask and dask+cupy backends, a_star_search and multi_stop_search\nreturned DataArrays named after the dask task key while numpy/cupy\nreturned unnamed results. Reset .name post-construction, same as\nzonal #2611 and focal #2733, and pin \n[…]\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4\n\n* Update sweep-metadata state for pathfinding (#3652)\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Reset dask graph-token .name on pathfinding outputs (#3652) (#3656)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T02:55:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3837bbaef922fbaa8ea4188510b8c46b294f6eaf",
          "body": "…aset support for a_star_search, type hints, defaults (#3653)\n\n* Fix pathfinding API consistency: attrs merge, Dataset support, type hints, defaults (#3644)\n\n- multi_stop_search now preserves input surface attrs alongside\n  waypoint_order/segment_costs/total_cost\n- a_star_search gets @supports_datas\n[…]\nd as a keyword. Also mention Dataset in the a_star_search\nReturns section and note why the barriers-default test is numpy-only.\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Pathfinding API consistency: preserve attrs in multi_stop_search, Dat…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T02:49:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df8b3043a61500007cdd2addeb76f222cb21ee80",
          "body": "* Add golden-value reference tests for a_star_search (#3655)\n\nPin goal costs on small inputs (open grid, barrier maze, friction\nsurface, anisotropic cellsize, 4/8-connectivity, no-path case) to\nvalues verified against scipy 1.16.1 sparse.csgraph.dijkstra and\nscikit-image 0.26.0 MCP_Geometric, which \n[…]\n//claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4\n\n* Address review: explain _golden_raster split, use pytest.param ids (#3655)\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Add golden-value reference tests for a_star_search (#3655) (#3663)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T02:48:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b17803673a9e15449d4c3b8bd96d584c176ff8d1",
          "body": "… searches (#3667)\n\n* Reuse symmetric costs in optimize_order instead of running reverse A* (#3661)\n\n_optimize_waypoint_order ran a_star_search for every ordered waypoint\npair, N(N-1) searches, even though the cost matrix is symmetric (the\npixel graph is undirected and edge costs use the mean fricti\n[…]\nelocated waypoint can be dropped from the returned order; that\nis pre-existing behavior tracked in #3646 and noted in the test.\n\nClaude-Session: https://claude.ai/code/session_0155N4QGamQVxgpAAPbpQNq4",
          "is_bot": false,
          "headline": "Reuse symmetric costs in optimize_order instead of running reverse A*…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-09T02:48:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e2b35e6b14501aee75f9da8cd17141b12dd4fd1",
          "body": "* Handle cupy and dask+cupy segments in multi_stop_search (#3630)\n\nSegment extraction assumed .get() meant cupy and everything else was\nsafe for np.asarray(seg.values), which crashes on dask-of-cupy results\n(implicit cupy->numpy conversion). Route all backends through a\n_segment_to_numpy helper (com\n[…]\nr\ncome back numpy-backed. Fixes the no-op conversion expression in\ntest_multi_stop_cupy_matches_numpy and adds a dask+cupy test.\n\n* Document output array-type preservation in multi_stop_search (#3630)",
          "is_bot": false,
          "headline": "Fix multi_stop_search on cupy and dask+cupy backends (#3637)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:15:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "503bad89bcf2d172b2d550ab84104fc393471f15",
          "body": "…638)\n\nA failed refinement used to return the partially written path image, so\nan unreachable goal produced a finite cost trail that dead-ends mid-grid\nwhile every other search path returns all NaN for no-path. Return a\nfresh all-NaN surface instead.",
          "is_bot": false,
          "headline": "Return all-NaN from HPA* when a segment cannot be refined (#3631) (#3…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:15:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "154ba9c11b0345f780ee69bdf2a8cfbd7817bbec",
          "body": "…tes (#3627) (#3633)\n\n* Order tile edges in kde dask point filter so descending coordinates keep their points (#3627)\n\n_filter_points_to_tile assumed positive dx/dy when computing the tile\nextent, so dask+numpy and dask+cupy dropped most or all points for\ndescending-coordinate templates: all-zero ou\n[…]\nbove the #1199 kernel fix.\n\nAlso records the 2026-07-03 accuracy sweep of the kde module in the\nsweep state CSV.\n\n* Address review: parametrize dask+cupy descending test, note filter overshoot (#3627)",
          "is_bot": false,
          "headline": "Fix kde dask backends dropping points on descending-coordinate templa…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:14:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21189d4a1218e024043c5471a08b54b6f9be6567",
          "body": "* Drop non-finite points and segments in kde/line_density (#3628)\n\nA NaN coordinate previously poisoned the auto-computed extent (all\nbackends returned an all-zero grid with NaN coords), made eager cupy\ngaussian return an all-NaN grid, and was silently skipped by the other\nbackends. Filter non-finit\n[…]\npolicy, and raise when a\nnon-empty input has no finite entries left. Documented in both\ndocstrings.\n\n* Address review: exact-equality auto-extent tests, silverman and GeoDataFrame NaN coverage (#3628)",
          "is_bot": false,
          "headline": "Drop non-finite points and segments in kde/line_density (#3628) (#3636)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:14:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ba40146f8f48f1ce747c0d89ce7562e76a8c42a",
          "body": "…ng _get_pixel_id (#3635)\n\n* Map points to nearest cell center and reject out-of-bounds points in _get_pixel_id (#3629)\n\nint(abs(point - coord0) / cellsize) folded points outside the raster on\nthe coords[0] side back to mirrored interior pixels, so a_star_search\nran from the wrong start instead of r\n[…]\nnow fail _is_inside\nand raise as intended.\n\nAlso records the accuracy-sweep state row for pathfinding (#3629,\n#3630, #3631).\n\n* Document nearest-center point mapping in a_star_search docstring (#3629)",
          "is_bot": false,
          "headline": "Nearest-center point mapping and out-of-bounds rejection in pathfindi…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:14:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a796dbf79ec813b682cd45c3899ab41ad89800be",
          "body": "* Aim sky_view_factor rays in ground azimuth space (#3626)\n\nRay directions were uniform in cell-index angle, so rectangular cells\n(cellsize_x != cellsize_y) sampled ground azimuths non-uniformly and\nbiased the SVF average. Convert each ground azimuth to a unit step in\ncell-index space instead. Square-cell results are unchanged.\n\nAlso records the 2026-07-03 accuracy sweep state for the module.\n\n* Address review: hoist CPU direction table, note azimuth quantization limit (#3626)",
          "is_bot": false,
          "headline": "Aim sky_view_factor rays in ground azimuth space (#3626) (#3634)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:13:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12855fe9198b38d13bd4b7131bf3f2eec95d6ed8",
          "body": "* Validate kernel and DataArray inputs to convolution entry points\n\nconvolve_2d checked the raster but never the kernel. A None, 1D, 3D, or\nlist kernel reached the numba kernel and raised a TypingError that named\nnothing the user controls. An even-sided kernel was accepted and produced\na silently of\n[…]\nobject has no attribute 'astype'\".\n\nInternal callers (focal, edge_detection, emerging_hotspots) all pass odd\n2D arrays, so they are unaffected.\n\n* sweep(error-handling): record convolution audit state",
          "is_bot": false,
          "headline": "convolution: validate kernel and agg inputs (#3623) (#3624)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-07T19:13:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1f81b8dee53e285f484f514290613cb5e560263",
          "body": "… (#3643)\n\n* Fix _parse_rat to pad category_names to pixel values for sparse RATs (#3591)\n\nWhen a sidecar's RAT has a sparse or non-zero-based Value column\n(e.g. values [1, 2, 5] from QGIS/GDAL), _parse_rat now pads\ncategory_names and category_colors with empty strings / (0,0,0,0)\nso list index equa\n[…]\native values and values >= 1,000,000 to avoid\nOOM from pathological RATs.\n\n* Add tests for sparse RAT value alignment in _parse_rat (#3591)\n\n* Address review: single-pass min/max in _parse_rat (#3591)",
          "is_bot": false,
          "headline": "Fix _parse_rat to pad category_names to pixel indices for sparse RATs…",
          "author_name": "Paolo Melissari",
          "author_login": "Melissari1997",
          "committed_at": "2026-07-07T18:58:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf58b353909a72fcdf7ec46e819e25d4136a4a73",
          "body": "… (#3642)",
          "is_bot": false,
          "headline": "Add backend statement and Examples to cost_distance docstring (#3587)…",
          "author_name": "Paolo Melissari",
          "author_login": "Melissari1997",
          "committed_at": "2026-07-07T18:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59ef9d26fa49b3f40e948eee5e0dadeb76845db6",
          "body": "* Align convolution dask output dtype with numpy/cupy (#3618)\n\nThe dask backends declared float64 via meta=np.array(()) even when the\neager numpy/cupy backends promote an int or float32 raster to float32,\nso result.dtype disagreed across backends and did not match the float32\nchunks dask actually co\n[…]\nion test.\n\nAlso records the convolution metadata sweep state (2026-07-02).\n\n* Fix isort import grouping in test_convolution (#3618)\n\n* Add cupy/dask+cupy dtype regression tests for convolve_2d (#3618)",
          "is_bot": false,
          "headline": "Align convolution dask output dtype with numpy/cupy (#3618) (#3622)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T19:00:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "992405ae743ca22931acea802c3851ef2a9f1058",
          "body": "* docs(convolution): fill docstring gaps and fix stale examples\n\n- custom_kernel: add Parameters/Returns/Examples (was a one-line stub)\n- convolve_2d: add a numpydoc docstring (had none)\n- convolution_2d: name all four supported backends in the agg param\n  (Dask+CuPy was omitted) and fix 'to process\n[…]\n calc_cellsize example wrote its\noutput as '>>> (1000.0, 1000.0)', a stray doctest prompt on an output\nline. Removed the prompt so it matches the other two output lines in\nthe same example. Docs only.",
          "is_bot": false,
          "headline": "docs(convolution): fill docstring gaps and fix stale examples (#3620)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T17:43:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74fe7e58b3815a96724fa709f063249323d07565",
          "body": "… and pin it with a test (#3619)\n\n* convolution: document cross-correlation convention in convolve_2d and pin it with a test\n\nconvolve_2d applies the kernel without flipping it, so it computes\ncross-correlation, not a true convolution. Verified against scipy.ndimage\n1.16.1: interior pixels match sci\n[…]\nvolution_2d docstring stating the convention, and a\ngolden test pinning the correlation semantics.\n\nreference-validation sweep 2026-07-02\n\n* reference-validation state: record PR #3619 for convolution",
          "is_bot": false,
          "headline": "convolution: document the cross-correlation convention in convolve_2d…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T17:43:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "324d1658451fe75ae0d7dbaaa01342afc7507c50",
          "body": "* Parallelize convolve_2d numpy kernel (#3615)\n\n_convolve_2d_numpy iterated with numba.prange but was decorated\n@jit(nopython=True, nogil=True) with no parallel=True, so prange\ndegraded to a serial range. On a 20-core host a 2000x2000 float64\nraster with a 15x15 kernel dropped from ~356 ms to ~53 ms\n[…]\nllelizes. Force the\ncompute for backends that produce a lazy array, matching the convention\nin the twi/interpolate/flood benchmarks. numpy and cupy results have no\n.compute and are unaffected. (#3615)",
          "is_bot": false,
          "headline": "Parallelize convolve_2d numpy kernel (#3615) (#3616)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T17:42:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5325aa535fe0d37ab23cdca958556e9424127dac",
          "body": "* bump: validate agg, count, and spread inputs\n\nbump() only validated width and height. Bad values for the agg template,\ncount, and spread surfaced numpy/dispatcher errors from deep in the call\nor were silently accepted:\n\n- agg as a plain ndarray -> 'Unsupported Array Type' from the backend\n  dispat\n[…]\nor-handling sweep 2026-07-02\n\n* docs: mark bump() count parameter as optional\n\nNote the default count heuristic in the docstring, matching the\noptional handling the input validation already relies on.",
          "is_bot": false,
          "headline": "bump: validate agg, count, and spread inputs (#3614)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T17:41:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6139e562b9f18fe8af05b2d47b9590fb5ba0f169",
          "body": "…ng (#3607)\n\nThe height_func Parameters entry described a per-point f(x, y) contract,\nbut bump() calls height_func(locations) once with a (count, 2) array of\ninteger (x, y) coordinates and expects a length-count heights array back.\nThe documented per-point form raises TypeError when used literally.\n\n[…]\nunt as optional and document its default of\nmin(width * height // 10, 10_000_000), which was previously unstated.\n\nDocstring-only; no behavior change. Records the doc sweep state for bump.\n\nRefs #3606",
          "is_bot": false,
          "headline": "docs(bump): correct height_func contract and count default in docstri…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T17:41:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e75d38adef2416a42e5bca3c958000f5aa8a1426",
          "body": "Claude-Session: https://claude.ai/code/session_01AqWhb4FXGNvwczdnwC42hB",
          "is_bot": false,
          "headline": "sweep-performance: geotiff Pass 18 (SAFE/IO-bound, 0 findings)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-06T13:10:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "486c95ee3624010c00791fb890a3e26896c4f3ce",
          "body": null,
          "is_bot": false,
          "headline": "Honor the boundary parameter on the cupy backend in bilateral() (#3632)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-05T19:09:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c00c3405f936297393219cf0a9a03ca98630b0e1",
          "body": null,
          "is_bot": false,
          "headline": "style(convolution): drop unused import, fix isort ordering (#3613)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-05T16:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "422e7c97c7d80373f6425e50345553758cbca3f6",
          "body": null,
          "is_bot": false,
          "headline": "bump: add name= parameter and name the output DataArray (#3610)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-05T13:43:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fd856f6178877781ec58f951020ad372fe544ec",
          "body": null,
          "is_bot": false,
          "headline": "Fix isort import-ordering drift in bump.py (#3609) (#3611)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-05T13:41:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df0ac453e97aac27377fc59bd7ee55754a7b1270",
          "body": "conda-forge published libjxl 0.12.0 on 2026-07-03 before rebuilding\nlibgdal-core/rasterio against it. An unpinned solve now installs a\nGDAL linked to libjxl.so.0.11 alongside libjxl 0.12, so rasterio\nfails at import and both workflows have been red on main since then.\n\nPin libjxl to 0.11.* so the so\n[…]\ne matches the last green combination\n(libjxl 0.11.2 + libgdal-core 3.12.3 + rasterio 1.5.0; verified with\na dry-run solve). Remove the pin once conda-forge rebuilds the GDAL\nstack against libjxl 0.12.",
          "is_bot": false,
          "headline": "ci: pin libjxl=0.11.* in geotiff-corpus and cog-validator envs (#3639)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-05T12:25:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b9ba8a85cd33c789982eac688501eaef8953a66e",
          "body": "…ndings",
          "is_bot": false,
          "headline": "style sweep (geotiff): re-sweep 2026-07-02, flake8/isort clean, no fi…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "624d565b3b3eed3062424330ed1b1a90f37620e1",
          "body": "deep-sweep security pass 2026-07-02 against xrspatial/geotiff. Delta\nsince 2026-07-01 is write-path/docs only (#3595, #3600, #3592, #3593,\n#3588); no untrusted-input parser changed. Re-verified the read/parse\nsurface (header caps, safe_xml DOCTYPE rejection, cog_http byte caps,\nsidecar SSRF hardening, decompression-bomb cap, VRT path-traversal\ncontainment, LZW/GPU kernel bounds). No new CRITICAL/HIGH/MEDIUM. Only\nstate CSV updated.",
          "is_bot": false,
          "headline": "Security sweep re-audit (pass 23) for geotiff: no new findings",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c3078a474bd4cad8e2cc0c94cca8d485ac0be85",
          "body": "Round-trip validation of the geotiff reader/writer against rasterio 1.4.4\n(GDAL 3.10.3) and gdal-cli 3.11.4 confirms parity across codecs\n(zstd/deflate/lzw/packbits/none, predictor 2 and 3), CRS encoding\n(EPSG:32611 and 4326), GeoTransform math (north-up, non-square pixels,\ntiepoint, ModelTransforma\n[…]\n suite\nparity/test_reference.py passes 31 tests including dask+cupy, and\ngolden_corpus already pins this parity, so no new test or fix is needed.\n\nState-only commit for the reference-validation sweep.",
          "is_bot": false,
          "headline": "sweep(reference-validation): geotiff MATCHES vs GDAL/rasterio",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb41d908bbdccc60860992a0a303414c34f74d53",
          "body": "Re-audit on a CUDA-available host. Re-ran all GPU decode/read paths\non-device (eager cupy parity 0.0, dask+cupy lazy->cupy, deflate+\npredictor decode parity 0.0). Dask read 4 tasks/chunk, 50k cap intact.\nNo new CRITICAL/HIGH/MEDIUM; prior LOWs unchanged.",
          "is_bot": false,
          "headline": "sweep-performance: geotiff Pass 17 (SAFE/IO-bound, 0 HIGH)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54dd7149b506f69e6e1236dbaae51b075fa86d82",
          "body": "Re-ran the metadata-propagation sweep against the geotiff subpackage.\nEnd-to-end open_geotiff/to_geotiff round-trips on all four backends show\nattrs (crs/crs_wkt/transform/nodata), coords, dims, dtype, categorical PAM\nand continuous QML sidecar attrs, and gdal_metadata pass-through all\npreserved and\n[…]\nifts correctly on\nwindow/bbox reads (no stale-transform leak). Prior MEDIUM #3595 verified\nfixed on main. No new CRITICAL/HIGH/MEDIUM findings; one documented LOW\n(band-N PAM sidecar) carried forward.",
          "is_bot": false,
          "headline": "sweep-metadata: re-audit geotiff 2026-07-02 (no new findings)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b07dd1512b4ca0fc212904c67a9d4079060b1c49",
          "body": "…indings)\n\nRe-audit of the geotiff subpackage public docs (open_geotiff, to_geotiff)\nafter the #3592 PAM-sidecar fix landed. Both functions carry complete\nnumpydoc sections with zero signature/docstring drift; doctest examples\npass; both appear in the reference autosummary. One LOW note only: several\ndocstrings cite geotiff_release_contract.rst while the page exists as .md.\nNo MEDIUM+ finding, so no rockout. State CSV updated.",
          "is_bot": false,
          "headline": "docs(geotiff): record 2026-07-02 documentation re-audit (no fixable f…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a8c5b56ff80a90f961032c90a37bbb43fbc0782",
          "body": "Re-sweep of the geotiff public API surface. No new findings; prior\n2026-07-01 pass (#3593, merged) re-confirmed. Public signatures\nunchanged since then. Verified 222 signature/contract tests pass,\ndeprecation aliases warn, xarray backend contract intact, and all\nfour backends accept identical public kwargs (CUDA available).",
          "is_bot": false,
          "headline": "sweep(api-consistency): re-confirm geotiff clean (2026-07-02)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97f400b7bf6aa22c08863a4d4bf78999e21601b1",
          "body": "Re-audited the geotiff numerical core (coords transform math, overview\n2x2 reduction kernels, nodata lifecycle, unpack/pack scale-offset\narithmetic, predictor=2/3 decode). Nothing new to fix. Parity suite\npasses: 498 tests across numpy, dask+numpy, gpu, dask+gpu, http-cog,\nand fsspec, plus the rasterio/GDAL reference tests. Touches only the\ngeotiff row of .claude/sweep-accuracy-state.csv.",
          "is_bot": false,
          "headline": "sweep-accuracy: record geotiff Pass 29 (clean re-audit)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "004b458872e53591dbeb6325202d77252bf64c27",
          "body": "…xed, no new findings",
          "is_bot": false,
          "headline": "perlin performance re-audit 2026-07-02: prior HIGH #3469 confirmed fi…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-03T10:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05fb3f7c25badebdf323d8a08e6e4a0bf631d0d5",
          "body": "…d (#3612) (#3617)",
          "is_bot": false,
          "headline": "Vectorise _partition_bumps to fix O(n_chunks x count) dask graph buil…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T21:38:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56a3928a478a0dc339005e3ac04f733d12287a5d",
          "body": null,
          "is_bot": false,
          "headline": "Add asv benchmark coverage for geotiff read/write paths (#3603)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T13:03:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0275b61df12f3b7d634e6e7f810019b0f5cd5bb",
          "body": "…D\" ValueError (#3604)",
          "is_bot": false,
          "headline": "Reject 0D/1D DataArray in to_geotiff with the clear \"Expected 2D or 3…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T13:03:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b0887fb200aaadb20d5d832c3fc8f1652d46cb6",
          "body": null,
          "is_bot": false,
          "headline": "Add tests for PAM sidecar reader edges and symbology dask stats (#3605)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T13:02:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d496289bde77aa9247e433396f326ad6bc757b36",
          "body": "…ath (#3595) (#3599)\n\n* Remove the previous file's PAM sidecar when to_geotiff overwrites a path (#3595)\n\n* Update metadata-sweep state for geotiff (#3595)\n\n* Address review: failed-write sidecar test, top-level docstring note, comment on OSError swallow (#3595)\n\n* Record LOW band-mismatch sidecar edge in metadata-sweep state (#3595)\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Remove the previous file's PAM sidecar when to_geotiff overwrites a p…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T04:07:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8ecf14d90eeb4f8b39d14f82cd78ed05270ddb44",
          "body": "…(#3598)",
          "is_bot": false,
          "headline": "Document PAM categorical sidecar behavior and category attrs (#3592) …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T03:58:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2bf13c01e2394d234116be59f6aa4fbde80640d",
          "body": "…596)\n\nThe release-contract tier list said extra_tags pass-through was\n[advanced] (no kwarg gate), but SUPPORTED_FEATURES['writer.extra_tags']\nis 'experimental' and _validate_write_rich_tag_optin rejects a fresh\nDataArray carrying attrs['extra_tags'] without\nallow_experimental_codecs=True. Move the \n[…]\name the opt-in and the round-trip exemption, and add a drift-guard\ntest so the docstring cannot disagree with the tier map again.\n\nAlso updates the api-consistency sweep state CSV for the geotiff row.",
          "is_bot": false,
          "headline": "Fix to_geotiff docstring tier for extra_tags pass-through (#3593) (#3…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T03:57:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3fdbcc5da2a0056e972c4fad2f14a75ef187a242",
          "body": "summarize_terrain was a thin wrapper over slope/aspect/curvature that\nwas never exported from the package, never documented, and had no\ninternal callers. Drop the module and its test file.",
          "is_bot": false,
          "headline": "Remove unused xrspatial.analytics module (#3601) (#3602)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T03:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3eabc27ccefe5f3b899b14095ec09e4fc68792a",
          "body": "…ff (#3594)\n\nread_pam_sidecar() must never raise on a bad sidecar: open_geotiff()\nreads the PAM .aux.xml for any local string source, and a malformed\nsidecar degrades to {} rather than breaking the read (#3520, #3522).\n\n_parse_rat() converts a thematic RAT's Value cell with\nint(float(text)). A cell \n[…]\nad.\n\nAdd OverflowError to the caught exceptions so an infinite Value cell\nfalls back to {} like every other malformed case. Found by\n/sweep-security; also records the sweep state update.\n\nCloses #3590",
          "is_bot": false,
          "headline": "Stop a non-finite RAT value in a PAM sidecar from crashing open_geoti…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T03:54:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7e94a133babe9dea1118d70721c988f94c029f1",
          "body": "* Accumulate color_ramp stats during the streaming dask write (#3597)\n\nto_geotiff(dask_data, path, color_ramp=...) executed the source graph\ntwice: once in _write_streaming for the pixels and again in\n_finite_stats for the sidecar statistics (measured 32 chunk executions\nfor a 16-chunk source). The \n[…]\n separate stats\npass; docs updated to say which paths pay it.\n\n* Update performance sweep state for geotiff pass 16 (#3597)\n\n* Address review: plain-int count, loosen cross-algorithm tolerance (#3597)",
          "is_bot": false,
          "headline": "Accumulate color_ramp stats during the streaming dask write (#3600)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T03:53:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "656c71e3ec94f46950997d2490db8e9e74298774",
          "body": null,
          "is_bot": false,
          "headline": "Fix isort drift in geotiff writer and symbology test (#3588) (#3589)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-02T03:49:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14a181f33077980774eff7affd0c698f8cda33ad",
          "body": "…6) (#3586)",
          "is_bot": false,
          "headline": "Fix pycnophylactic crash on all-NaN zones or unmatched zone ids (#340…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T23:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bf40ff770b482da66c45c72ba0259d1259edc15",
          "body": "* style(mahalanobis): drop unused is_dask_cupy import, fix isort drift\n\nCat 3 (F401): remove unused is_dask_cupy import from xrspatial.utils.\nCat 4 (isort): reformat the xrspatial.utils import block to line_length=100.\n\nflake8 and isort are clean after the change; no behaviour change.\ndask+cupy dispatch goes through ArrayTypeFunctionMapping, not a direct\nis_dask_cupy check, so the removed name had no references.\n\n* state: record mahalanobis style sweep PR #3582",
          "is_bot": false,
          "headline": "style(mahalanobis): drop unused import, fix isort drift (#3582)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T14:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "579ccd175fde19487a6d25b88844d8a0b29c8e1a",
          "body": "A fine resolution on a dask backend gets past both size caps and then\nruns out of memory building the coordinate vectors at construction.\n\nThe dask backends skip _MAX_CELLS because the grid data is lazy, and the\n_MAX_CHUNKS guard keys on block count -- the default tiling grows its\nblock edge to keep\n[…]\nn the dask branch. Eager backends are already bounded by _MAX_CELLS, so\nthis only constrains the otherwise-unbounded dask path; conus at 1 m,\nthe finest grid in the tests, is ~9e6 coordinate elements.",
          "is_bot": false,
          "headline": "from_template: cap eager coordinate allocation on the dask path (#3585)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T14:01:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d71904bb4e644cab985a2876d7aa3f7a818c5d09",
          "body": "…3584)\n\nmahalanobis() had complete backend and NaN coverage but left a few\npaths untested. Each behaves correctly on a CUDA host, so these are\ncoverage gaps rather than bugs:\n\n- Inf/-Inf in any band -> NaN output and excluded from auto stats,\n  verified identical across all four backends\n- the 'Not \n[…]\nnough valid pixels' branch for all-NaN and too-few-valid\n  inputs\n- 1x1 single-pixel (provided stats work, auto stats raise) and 1xN/Nx1\n  strips\n\nTest-only. 34 tests pass with no skips on a GPU host.",
          "is_bot": false,
          "headline": "Test mahalanobis Inf input, all-NaN, and degenerate shapes (#3583) (#…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T14:01:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5161ad20f63b3413d30c15233b800a861e989bb7",
          "body": "The public mahalanobis() docstring had Parameters and Returns but no\nExamples section, unlike peer utilities such as normalize.rescale. Its\nNaN-propagation rule was also undocumented despite being pinned by\ntest_nan_propagation.\n\nAdd a runnable Examples block (whose input includes a NaN so the outpu\n[…]\nring the NaN rule, the\nauto-stats N+1 all-finite requirement, and the four supported backends,\nand note default='mahalanobis' on the name parameter. Documentation only;\nno behavior change.\n\nRefs #3579",
          "is_bot": false,
          "headline": "docs(mahalanobis): add Examples and document NaN propagation (#3581)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T14:01:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "932f81a8b5074694cccf24d112d96dcdc22b5fd9",
          "body": "…(#3580)\n\n* Test from_template tuple chunks and explicit-shape chunk-cap message\n\nAdd two test-coverage tests for already-correct from_template behavior:\n\n- chunks passed as a (chunk_y, chunk_x) tuple through the public API. The\n  tuple form is documented but was only checked against the internal\n  \n[…]\n resolution. Only the resolution-path chunk-count message and the eager\n  cell-cap message were covered before.\n\nTest-only; no source change.\n\n* sweep-test-coverage: record templates re-run (PR #3580)",
          "is_bot": false,
          "headline": "Test from_template tuple chunks and explicit-shape chunk-cap message …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T14:00:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fce62d8a9eae1b67b32d266a94505195121da7f0",
          "body": null,
          "is_bot": false,
          "headline": "Sort templates.py imports to match isort config (#3577) (#3578)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-07-01T14:00:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76ebd7e2bb92d00c19f2b12b4bc1c3986edbb4ed",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v0.10.15 release (#3576)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-29T21:09:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3ab224f07403617ab168f59a34edec3ae1977f9",
          "body": "… the template (#3575)\n\n* generate_terrain: map dask backends over empty skeleton (#3574)\n\nThe dask backends regenerate every cell from coordinates and never read\nthe template's values, but they mapped the per-chunk generator over the\ntemplate array itself. For a from_template() grid that meant comp\n[…]\nf the graph.\n\nAlso removes the leftover data * 0 in the dask+cupy path, which built a\nNaN array the per-chunk cupy.zeros discarded.\n\n* Address review: exercise worley pre-pass on dask+cupy too (#3574)",
          "is_bot": false,
          "headline": "generate_terrain: map dask backends over an empty skeleton instead of…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-29T20:58:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6383eada5f919f5761fab1f3e95fc565a3d402a0",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v0.10.14 release (#3573)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-29T04:19:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b9c5b47219e70db7ed8f7f86839243391aa8b2d",
          "body": "* Recompute res attr for downsampled preview output (#3569)\n\npreview() rebuilds the x/y coords for the smaller grid but copied attrs\nverbatim, so attrs['res'] still described the full-resolution input.\nRecompute res from the output coordinate spacing before returning, for\nevery method and backend. Leave it absent when the input had no res.\n\n* Note res recompute in preview() docstring (#3569)",
          "is_bot": false,
          "headline": "Recompute res attribute for downsampled preview() output (#3570)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-29T04:02:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a315984b6580f3048815f6e2be9e68ad8843e37",
          "body": "…ion changes (#3571) (#3572)\n\n* Update output attrs['res'] when resolution changes in rasterize/kde (#3571)\n\nrasterize(): the reshape path (caller overrides bounds/width/height/\nresolution, or rasterizes without like=) now records the freshly-built\ngrid's cell size in attrs['res'] instead of leaving\n[…]\n brings rasterize/kde/line_density in line.\n\nUpdates the issue #2251 tests to assert the refreshed res value rather\nthan its absence.\n\n* Address review nit: add line_density res-vs-coords test (#3571)",
          "is_bot": false,
          "headline": "rasterize/kde/line_density: set output attrs['res'] when grid resolut…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-29T04:02:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "562a52119e4dc1b1302c9f9a4c26d81a03a29298",
          "body": "Group the local imports into a single parenthesized import from\nxrspatial.utils and order xrspatial.dataset_support before it, keeping\nthe # local modules comment above the first local import. No behavioural\nchange.\n\nCloses #3388",
          "is_bot": false,
          "headline": "Fix isort import-ordering in curvature.py (#3388) (#3568)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-29T02:27:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6ec0f84dae18e2853585110c28076ff6aaa5690",
          "body": "* from_template: dask-aligned extents and explicit height/width\n\nThe default dask grid now pads its shape up to whole blocks, so every\nchunk is full-size instead of leaving a ragged remainder on the far\nedge. Padding only happens on a dask backend under the default tiling:\neager grids and an explici\n[…]\n shape, height/width combined with preserve=,\nand a dask backend with a non-block-multiple shape (stays exact, tiles\nbalanced).\n\nClaude-Session: https://claude.ai/code/session_01RngbqHJk4id4BNY1ironEc",
          "is_bot": false,
          "headline": "from_template: dask-aligned extents and explicit height/width (#3567)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-28T18:18:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36101af471bf697dacd4dd761111f8cd9dad190a",
          "body": "…(#3566)",
          "is_bot": false,
          "headline": "Speed up generate_terrain numpy backend with a fused parallel kernel …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T23:28:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c674acf010e533ef3cd6ef1cecc2e1bdd88ffcc7",
          "body": "…(#3564)",
          "is_bot": false,
          "headline": "Expose multi_stop_search on the .xrs DataArray and Dataset accessors …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T20:32:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6357aaea7d6d22ff0dc0f51fdffef12a9a9124f",
          "body": "…orhood-friendly dask chunks (#3562)",
          "is_bot": false,
          "headline": "from_template ergonomics: coregister your data onto the grid + neighb…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T20:31:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b48c7b8e237251be00f5839d87d90cb201786b4",
          "body": "Wrap the datashader (and spatialpandas, which only feeds the datashader\npath) imports in a try/except so the benchmark runs whether or not\ndatashader is installed. The datashader column is skipped when absent and\nincluded when present.\n\nClaude-Session: https://claude.ai/code/session_01TF3CsJ7nee9agjajEWLw5d",
          "is_bot": false,
          "headline": "Guard datashader import in rasterizer benchmark (#3452) (#3560)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T17:45:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "242d4541b6f0e929a2622fe7ba1c4d05adfc16f3",
          "body": "…(#3559)",
          "is_bot": false,
          "headline": "from_template: guard dask grids against task-graph explosion (#3557) …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T17:14:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "982a9ae4deb8324422d85662f0644b001096d814",
          "body": "…n (#3392) (#3555)\n\n* Fix dask EUCLIDEAN/MANHATTAN proximity NaN at float32-ulp max_distance (#3392)\n\nThe cKDTree backends (eager numpy PROXIMITY and the dask paths for every\nmode) compared the float64 distance against max_distance, while the\nbrute-force and CUDA kernels round the distance to float3\n[…]\ncupy, and\ndask+cupy so the brute-force GPU backends are pinned to the cKDTree backends\nat the boundary and cannot drift apart. Replace the one-element\nnp.linalg.norm with a plain longitude difference.",
          "is_bot": false,
          "headline": "Match cKDTree max_distance check to the brute-force float32 conventio…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T16:39:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e01a4f8fc852bf5a69d448bbbd30f53263635b17",
          "body": "…ied (#3556)\n\n* from_template: lazy dask grids skip the cell cap when chunks given (#3554)\n\nSupplying chunks now promotes an eager backend to its dask variant\n(numpy->dask+numpy, cupy->dask+cupy) and returns a lazy grid. The\n500M-cell cap applies only to the eager backends, which materialize the\nwho\n[…]\n(#3554)\n\nDocstring caution that a very fine resolution on a dask backend builds a\nlarge task graph, plus an Examples entry for the lazy chunked path. The\nactual chunk-count guard is deferred to #3557.",
          "is_bot": false,
          "headline": "from_template: lazy dask grids skip the cell cap when chunks is suppl…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T16:38:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9be1f25175dfa589d3d870e3da710d71516fd36c",
          "body": "…Oceania) (#3553)\n\n* Add regional templates to from_template (#3552)\n\nAdd southeast_asia (EPSG:10594), central_america/caribbean (EPSG:10598),\nand west_africa (EPSG:10592), each in its GLANCE continental Lambert\nazimuthal equal-area projection. Real EPSG codes keep attrs['crs'] an int.\nReuses the ex\n[…]\n84 / PDC\nMercator), the Pacific Disaster Center projection centered on lon_0=150\nso the Pacific Ocean is continuous (map seam in the Atlantic). Conformal,\nso preserve='area' falls back to Equal Earth.",
          "is_bot": false,
          "headline": "Add regional templates to from_template (Africa, Asia, the Americas, …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T14:49:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7cd5745b030d74408935fad43d4e05c5680022d2",
          "body": null,
          "is_bot": false,
          "headline": "docs(interpolate): add IDW examples and backend-support notes (#3547)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T10:28:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22e2d1cc3f71449da3447c066fd8f41e58c7c4be",
          "body": "…(#3510) (#3548)",
          "is_bot": false,
          "headline": "classify: return all-NaN instead of crashing on all-non-finite input …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T10:28:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9516e9610e0a8c80adbe2226b7eb6d1d3d7eae7",
          "body": "…/latlon, equal_earth) (#3550)",
          "is_bot": false,
          "headline": "Add global-projection templates to from_template (web_mercator, wgs84…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T10:27:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08557e6fb8cfa2f62d79f7ced75f47aa04544661",
          "body": "…color_ramp_range (#3545) (#3546)\n\nThe continuous-symbology sidecars from #3537 are covered on the eager numpy\npath, but four branches of the shared _write_sidecars emit had no test:\n\n- color_ramp_range only asserted its written bounds on a numpy array, yet the\n  kwarg exists as the escape hatch for\n[…]\n probed on a CUDA host and behave correctly, so these are\ncoverage gaps, not bugs. Test-only: adds four tests to\ntest_symbology_sidecar_3537.py (the dask+GPU one ran and passed locally).\n\nCloses #3545",
          "is_bot": false,
          "headline": "geotiff: cover symbology sidecars on dask, dask+GPU, 3D single-band, …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-27T01:06:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "861c28c2712a9e2abb0a6904141237d76b8a04ed",
          "body": "…#3543)",
          "is_bot": false,
          "headline": "templates: add type hints to from_template / list_templates (#3542) (…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T23:27:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29b178b7daa13914c41c197056e914da65e04c19",
          "body": null,
          "is_bot": false,
          "headline": "docs(templates): fix stale UTM zone in from_template FRA example (#3544)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T23:27:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ef7769554468b267fa6cbdd4a325cb16717f8da",
          "body": "…validation (#3540)",
          "is_bot": false,
          "headline": "test(templates): cover single-pixel/strip grids and resolution-tuple …",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T23:26:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5da5062a66edf28f00ae17a27ab6048e26496e66",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v0.10.13 release (#3539)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T18:16:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d327e1fae71857c20ca70da980b9f10740a4fc8",
          "body": "…es (#3502)\n\n* docs(flood): add missing reference entries, examples, and backend notes\n\nThree public flood functions (vegetation_roughness, vegetation_curve_number,\nflood_depth_vegetation) were exported but listed in no autosummary block, so\nthey were absent from the rendered API reference. Add them\n[…]\nwhich previously omitted it.\n\nDocumentation only; no behavior changes. Examples were executed against all\nbackends available on the build host.\n\n* chore(sweep): record flood doc-sweep state (PR #3502)",
          "is_bot": false,
          "headline": "docs(flood): add missing reference entries, examples, and backend not…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T18:12:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85575e4c7bb65269f7f05ecb561e044d95cc3282",
          "body": "* performance sweep: record flood state (issue #3503)\n\n* flood: make mannings_n DataArray validation lazy-safe (#3503)\n\n_validate_mannings_n_dataarray called np.asarray(mannings_n.values),\nwhich materializes the whole roughness raster into host memory: a full\ngraph compute for dask and a full device\n[…]\n0 .all()), transferring\n  only a scalar bool.\n- numpy: unchanged.\n\nAdds regression tests asserting a tripwired dask mannings_n is not\nmaterialized during travel_time/flood_depth_vegetation validation.",
          "is_bot": false,
          "headline": "flood: make mannings_n DataArray validation lazy-safe (#3503) (#3507)",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T17:57:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e862f0432c044999465756e2bd0e578ffed6634f",
          "body": "…ds (#3499) (#3509)\n\nnumpy and cupy cast the input to float64, but _flood_depth_dask and\n_cn_runoff_dask operated on the input array without a cast, so a float32\ninput returned float32 on the dask and dask+cupy backends. Both functions\ndocument a float64 output. Cast hand/p to float64 at the top of the dask\nhelpers so all four backends agree.\n\nAdds float32-input dtype tests across numpy, dask, cupy, and dask+cupy.\nUpdates the sweep-accuracy state CSV.\n\nCloses #3499",
          "is_bot": false,
          "headline": "Fix float32 dtype leak in flood_depth/curve_number_runoff dask backen…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T17:52:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "386137204b71225b1adc10f38fe8eee1e2f32c32",
          "body": "…3516)\n\n* docs(classify): fix stale example outputs and add missing examples\n\nThe reclassify and equal_interval docstring examples printed arrays that\ndo not match what the functions return for the given input; binary used\nnp.nan in the array repr where numpy prints plain nan. Correct all three\nto t\n[…]\nn_numpy_bin -> xrspatial.reclassify\n  (renamed via _dask_task_name_kwargs)\n- cupy type: cupy.core.core.ndarray -> cupy.ndarray\n\nVerified each repr against output on a CUDA host. Docs only.\n\nRefs #3506",
          "is_bot": false,
          "headline": "docs(classify): fix stale example outputs and add missing examples (#…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T17:52:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6e6051002dbbeb105827f980081a8b0b58c02bd",
          "body": "…#3508) (#3513)\n\nThe _cpu_binary float32 fix and the verify_dtype=True backend tests landed\non main via the duplicate accuracy-sweep PR #3514. This change is the\nremaining piece: _run_dask_cupy_binary passed meta=cupy.array(()), which\ndefaults to float64, so the lazy dask+cupy array advertised float\n[…]\narray((), dtype='f4') and assert the lazy dtype in\ntest_binary_dask_cupy. Same advertised-vs-computed class as aspect #2682 and\nfocal #3217. Also records the classify metadata-propagation sweep state.",
          "is_bot": false,
          "headline": "binary(): type the dask+cupy meta so the lazy dtype matches float32 (…",
          "author_name": "Brendan Collins",
          "author_login": "brendancol",
          "committed_at": "2026-06-26T17:18:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 71,
      "commits_last_year": 1530,
      "latest_release_at": "2026-07-17T19:14:28Z",
      "latest_release_tag": "v0.10.17",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 26,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 3.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "xarray-spatial",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "Development Status :: 4 - Beta",
            "Intended Audience :: Developers",
            "Intended Audience :: Science/Research",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/xarray-spatial/",
          "is_deprecated": false,
          "latest_version": "0.10.17",
          "repository_url": "https://github.com/xarray-contrib/xarray-spatial",
          "versions_count": 70,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2020-02-15T23:53:25.299071Z",
          "latest_published_at": "2026-07-17T19:14:18.951486Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 93,
      "stars": 956,
      "watchers": 16,
      "fork_history": {
        "days": [
          {
            "date": "2020-02-13",
            "count": 1
          },
          {
            "date": "2020-02-28",
            "count": 2
          },
          {
            "date": "2020-04-23",
            "count": 1
          },
          {
            "date": "2020-05-23",
            "count": 1
          },
          {
            "date": "2020-06-26",
            "count": 2
          },
          {
            "date": "2020-07-02",
            "count": 2
          },
          {
            "date": "2020-07-13",
            "count": 1
          },
          {
            "date": "2020-07-20",
            "count": 1
          },
          {
            "date": "2020-07-21",
            "count": 1
          },
          {
            "date": "2020-07-22",
            "count": 1
          },
          {
            "date": "2020-08-16",
            "count": 1
          },
          {
            "date": "2020-08-17",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2020-11-17",
            "count": 1
          },
          {
            "date": "2020-12-03",
            "count": 1
          },
          {
            "date": "2020-12-10",
            "count": 1
          },
          {
            "date": "2021-01-12",
            "count": 1
          },
          {
            "date": "2021-01-31",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 2
          },
          {
            "date": "2021-04-01",
            "count": 1
          },
          {
            "date": "2021-04-03",
            "count": 1
          },
          {
            "date": "2021-04-06",
            "count": 1
          },
          {
            "date": "2021-04-13",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 2
          },
          {
            "date": "2021-04-24",
            "count": 1
          },
          {
            "date": "2021-05-17",
            "count": 1
          },
          {
            "date": "2021-05-30",
            "count": 1
          },
          {
            "date": "2021-06-03",
            "count": 1
          },
          {
            "date": "2021-06-21",
            "count": 2
          },
          {
            "date": "2021-06-29",
            "count": 1
          },
          {
            "date": "2021-07-08",
            "count": 1
          },
          {
            "date": "2021-07-23",
            "count": 1
          },
          {
            "date": "2021-08-04",
            "count": 1
          },
          {
            "date": "2021-08-07",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-10-28",
            "count": 4
          },
          {
            "date": "2021-11-05",
            "count": 1
          },
          {
            "date": "2021-11-15",
            "count": 1
          },
          {
            "date": "2021-11-17",
            "count": 1
          },
          {
            "date": "2021-11-18",
            "count": 1
          },
          {
            "date": "2021-12-14",
            "count": 1
          },
          {
            "date": "2021-12-15",
            "count": 1
          },
          {
            "date": "2022-01-04",
            "count": 1
          },
          {
            "date": "2022-01-07",
            "count": 1
          },
          {
            "date": "2022-01-13",
            "count": 1
          },
          {
            "date": "2022-02-09",
            "count": 1
          },
          {
            "date": "2022-02-21",
            "count": 1
          },
          {
            "date": "2022-02-25",
            "count": 1
          },
          {
            "date": "2022-03-04",
            "count": 1
          },
          {
            "date": "2022-03-23",
            "count": 1
          },
          {
            "date": "2022-04-24",
            "count": 1
          },
          {
            "date": "2022-05-29",
            "count": 1
          },
          {
            "date": "2022-06-01",
            "count": 1
          },
          {
            "date": "2022-06-09",
            "count": 1
          },
          {
            "date": "2022-06-11",
            "count": 1
          },
          {
            "date": "2022-06-14",
            "count": 1
          },
          {
            "date": "2022-09-07",
            "count": 1
          },
          {
            "date": "2022-12-06",
            "count": 1
          },
          {
            "date": "2022-12-20",
            "count": 1
          },
          {
            "date": "2022-12-22",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 1
          },
          {
            "date": "2023-05-06",
            "count": 1
          },
          {
            "date": "2023-10-22",
            "count": 1
          },
          {
            "date": "2024-04-24",
            "count": 1
          },
          {
            "date": "2024-08-15",
            "count": 1
          },
          {
            "date": "2024-08-29",
            "count": 1
          },
          {
            "date": "2024-09-23",
            "count": 1
          },
          {
            "date": "2024-10-23",
            "count": 1
          },
          {
            "date": "2025-02-25",
            "count": 1
          },
          {
            "date": "2025-11-21",
            "count": 1
          },
          {
            "date": "2026-01-27",
            "count": 1
          },
          {
            "date": "2026-03-08",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 2
          },
          {
            "date": "2026-05-21",
            "count": 2
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 93,
        "total_forks": 93
      },
      "star_history": {
        "days": [
          {
            "date": "2020-02-09",
            "count": 1
          },
          {
            "date": "2020-02-16",
            "count": 1
          },
          {
            "date": "2020-02-18",
            "count": 5
          },
          {
            "date": "2020-02-19",
            "count": 1
          },
          {
            "date": "2020-02-20",
            "count": 2
          },
          {
            "date": "2020-02-28",
            "count": 2
          },
          {
            "date": "2020-03-04",
            "count": 1
          },
          {
            "date": "2020-03-05",
            "count": 4
          },
          {
            "date": "2020-03-06",
            "count": 3
          },
          {
            "date": "2020-03-09",
            "count": 1
          },
          {
            "date": "2020-03-10",
            "count": 1
          },
          {
            "date": "2020-03-12",
            "count": 1
          },
          {
            "date": "2020-03-13",
            "count": 1
          },
          {
            "date": "2020-03-21",
            "count": 1
          },
          {
            "date": "2020-03-23",
            "count": 2
          },
          {
            "date": "2020-03-28",
            "count": 2
          },
          {
            "date": "2020-04-01",
            "count": 1
          },
          {
            "date": "2020-04-03",
            "count": 1
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-13",
            "count": 1
          },
          {
            "date": "2020-04-18",
            "count": 1
          },
          {
            "date": "2020-04-20",
            "count": 1
          },
          {
            "date": "2020-05-05",
            "count": 3
          },
          {
            "date": "2020-05-11",
            "count": 2
          },
          {
            "date": "2020-05-30",
            "count": 1
          },
          {
            "date": "2020-06-01",
            "count": 1
          },
          {
            "date": "2020-06-05",
            "count": 1
          },
          {
            "date": "2020-06-06",
            "count": 1
          },
          {
            "date": "2020-06-11",
            "count": 1
          },
          {
            "date": "2020-06-12",
            "count": 1
          },
          {
            "date": "2020-06-15",
            "count": 1
          },
          {
            "date": "2020-06-16",
            "count": 4
          },
          {
            "date": "2020-06-17",
            "count": 3
          },
          {
            "date": "2020-06-18",
            "count": 2
          },
          {
            "date": "2020-06-22",
            "count": 1
          },
          {
            "date": "2020-06-25",
            "count": 4
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-07-02",
            "count": 1
          },
          {
            "date": "2020-07-07",
            "count": 1
          },
          {
            "date": "2020-07-08",
            "count": 1
          },
          {
            "date": "2020-07-13",
            "count": 2
          },
          {
            "date": "2020-07-14",
            "count": 1
          },
          {
            "date": "2020-07-16",
            "count": 1
          },
          {
            "date": "2020-07-17",
            "count": 1
          },
          {
            "date": "2020-07-19",
            "count": 1
          },
          {
            "date": "2020-07-20",
            "count": 2
          },
          {
            "date": "2020-07-21",
            "count": 2
          },
          {
            "date": "2020-07-22",
            "count": 9
          },
          {
            "date": "2020-07-23",
            "count": 3
          },
          {
            "date": "2020-07-27",
            "count": 1
          },
          {
            "date": "2020-07-28",
            "count": 1
          },
          {
            "date": "2020-07-30",
            "count": 2
          },
          {
            "date": "2020-07-31",
            "count": 3
          },
          {
            "date": "2020-08-08",
            "count": 1
          },
          {
            "date": "2020-08-10",
            "count": 1
          },
          {
            "date": "2020-08-12",
            "count": 2
          },
          {
            "date": "2020-08-13",
            "count": 1
          },
          {
            "date": "2020-09-09",
            "count": 1
          },
          {
            "date": "2020-09-10",
            "count": 3
          },
          {
            "date": "2020-09-16",
            "count": 1
          },
          {
            "date": "2020-09-17",
            "count": 1
          },
          {
            "date": "2020-09-18",
            "count": 1
          },
          {
            "date": "2020-09-24",
            "count": 2
          },
          {
            "date": "2020-09-25",
            "count": 1
          },
          {
            "date": "2020-09-27",
            "count": 2
          },
          {
            "date": "2020-09-28",
            "count": 1
          },
          {
            "date": "2020-10-04",
            "count": 1
          },
          {
            "date": "2020-10-07",
            "count": 3
          },
          {
            "date": "2020-10-15",
            "count": 1
          },
          {
            "date": "2020-10-16",
            "count": 1
          },
          {
            "date": "2020-10-18",
            "count": 1
          },
          {
            "date": "2020-10-19",
            "count": 1
          },
          {
            "date": "2020-10-25",
            "count": 1
          },
          {
            "date": "2020-10-26",
            "count": 2
          },
          {
            "date": "2020-10-27",
            "count": 2
          },
          {
            "date": "2020-10-28",
            "count": 1
          },
          {
            "date": "2020-10-29",
            "count": 3
          },
          {
            "date": "2020-10-31",
            "count": 2
          },
          {
            "date": "2020-11-01",
            "count": 1
          },
          {
            "date": "2020-11-04",
            "count": 3
          },
          {
            "date": "2020-11-11",
            "count": 1
          },
          {
            "date": "2020-11-13",
            "count": 1
          },
          {
            "date": "2020-11-16",
            "count": 2
          },
          {
            "date": "2020-11-17",
            "count": 7
          },
          {
            "date": "2020-11-18",
            "count": 2
          },
          {
            "date": "2020-11-19",
            "count": 1
          },
          {
            "date": "2020-11-22",
            "count": 1
          },
          {
            "date": "2020-11-27",
            "count": 1
          },
          {
            "date": "2020-11-29",
            "count": 2
          },
          {
            "date": "2020-11-30",
            "count": 1
          },
          {
            "date": "2020-12-03",
            "count": 1
          },
          {
            "date": "2020-12-06",
            "count": 1
          },
          {
            "date": "2020-12-08",
            "count": 1
          },
          {
            "date": "2020-12-14",
            "count": 3
          },
          {
            "date": "2020-12-15",
            "count": 3
          },
          {
            "date": "2020-12-16",
            "count": 1
          },
          {
            "date": "2020-12-17",
            "count": 1
          },
          {
            "date": "2020-12-18",
            "count": 2
          },
          {
            "date": "2020-12-19",
            "count": 2
          },
          {
            "date": "2020-12-22",
            "count": 1
          },
          {
            "date": "2020-12-23",
            "count": 2
          },
          {
            "date": "2020-12-28",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 1
          },
          {
            "date": "2021-01-03",
            "count": 1
          },
          {
            "date": "2021-01-05",
            "count": 1
          },
          {
            "date": "2021-01-06",
            "count": 1
          },
          {
            "date": "2021-01-09",
            "count": 1
          },
          {
            "date": "2021-01-11",
            "count": 2
          },
          {
            "date": "2021-01-15",
            "count": 1
          },
          {
            "date": "2021-01-18",
            "count": 1
          },
          {
            "date": "2021-01-20",
            "count": 1
          },
          {
            "date": "2021-01-29",
            "count": 1
          },
          {
            "date": "2021-01-30",
            "count": 1
          },
          {
            "date": "2021-01-31",
            "count": 3
          },
          {
            "date": "2021-02-02",
            "count": 2
          },
          {
            "date": "2021-02-06",
            "count": 1
          },
          {
            "date": "2021-02-07",
            "count": 1
          },
          {
            "date": "2021-02-10",
            "count": 1
          },
          {
            "date": "2021-02-16",
            "count": 1
          },
          {
            "date": "2021-02-17",
            "count": 2
          },
          {
            "date": "2021-02-22",
            "count": 3
          },
          {
            "date": "2021-02-24",
            "count": 3
          },
          {
            "date": "2021-02-25",
            "count": 1
          },
          {
            "date": "2021-02-26",
            "count": 1
          },
          {
            "date": "2021-03-01",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-03-04",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 2
          },
          {
            "date": "2021-03-12",
            "count": 3
          },
          {
            "date": "2021-03-13",
            "count": 1
          },
          {
            "date": "2021-03-15",
            "count": 4
          },
          {
            "date": "2021-03-16",
            "count": 1
          },
          {
            "date": "2021-03-18",
            "count": 2
          },
          {
            "date": "2021-03-20",
            "count": 2
          },
          {
            "date": "2021-03-21",
            "count": 1
          },
          {
            "date": "2021-03-23",
            "count": 3
          },
          {
            "date": "2021-03-24",
            "count": 1
          },
          {
            "date": "2021-03-25",
            "count": 1
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-03-28",
            "count": 2
          },
          {
            "date": "2021-03-29",
            "count": 2
          },
          {
            "date": "2021-03-30",
            "count": 7
          },
          {
            "date": "2021-04-01",
            "count": 1
          },
          {
            "date": "2021-04-03",
            "count": 3
          },
          {
            "date": "2021-04-04",
            "count": 2
          },
          {
            "date": "2021-04-05",
            "count": 3
          },
          {
            "date": "2021-04-06",
            "count": 1
          },
          {
            "date": "2021-04-08",
            "count": 2
          },
          {
            "date": "2021-04-11",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 1
          },
          {
            "date": "2021-04-16",
            "count": 1
          },
          {
            "date": "2021-04-19",
            "count": 2
          },
          {
            "date": "2021-04-20",
            "count": 2
          },
          {
            "date": "2021-04-22",
            "count": 2
          },
          {
            "date": "2021-04-23",
            "count": 1
          },
          {
            "date": "2021-04-26",
            "count": 1
          },
          {
            "date": "2021-04-27",
            "count": 2
          },
          {
            "date": "2021-04-28",
            "count": 4
          },
          {
            "date": "2021-04-29",
            "count": 5
          },
          {
            "date": "2021-05-05",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 4
          },
          {
            "date": "2021-05-08",
            "count": 1
          },
          {
            "date": "2021-05-09",
            "count": 1
          },
          {
            "date": "2021-05-14",
            "count": 1
          },
          {
            "date": "2021-05-18",
            "count": 1
          },
          {
            "date": "2021-05-20",
            "count": 1
          },
          {
            "date": "2021-05-21",
            "count": 10
          },
          {
            "date": "2021-05-23",
            "count": 2
          },
          {
            "date": "2021-05-25",
            "count": 1
          },
          {
            "date": "2021-05-26",
            "count": 2
          },
          {
            "date": "2021-05-30",
            "count": 2
          },
          {
            "date": "2021-05-31",
            "count": 3
          },
          {
            "date": "2021-06-01",
            "count": 1
          },
          {
            "date": "2021-06-02",
            "count": 3
          },
          {
            "date": "2021-06-03",
            "count": 1
          },
          {
            "date": "2021-06-06",
            "count": 1
          },
          {
            "date": "2021-06-09",
            "count": 3
          },
          {
            "date": "2021-06-10",
            "count": 1
          },
          {
            "date": "2021-06-11",
            "count": 1
          },
          {
            "date": "2021-06-12",
            "count": 1
          },
          {
            "date": "2021-06-13",
            "count": 1
          },
          {
            "date": "2021-06-14",
            "count": 3
          },
          {
            "date": "2021-06-15",
            "count": 6
          },
          {
            "date": "2021-06-16",
            "count": 1
          },
          {
            "date": "2021-06-17",
            "count": 7
          },
          {
            "date": "2021-06-18",
            "count": 1
          },
          {
            "date": "2021-06-20",
            "count": 2
          },
          {
            "date": "2021-06-21",
            "count": 2
          },
          {
            "date": "2021-06-22",
            "count": 1
          },
          {
            "date": "2021-06-23",
            "count": 1
          },
          {
            "date": "2021-06-24",
            "count": 1
          },
          {
            "date": "2021-06-29",
            "count": 1
          },
          {
            "date": "2021-06-30",
            "count": 2
          },
          {
            "date": "2021-07-01",
            "count": 1
          },
          {
            "date": "2021-07-02",
            "count": 1
          },
          {
            "date": "2021-07-07",
            "count": 1
          },
          {
            "date": "2021-07-13",
            "count": 1
          },
          {
            "date": "2021-07-14",
            "count": 1
          },
          {
            "date": "2021-07-15",
            "count": 2
          },
          {
            "date": "2021-07-16",
            "count": 1
          },
          {
            "date": "2021-07-21",
            "count": 1
          },
          {
            "date": "2021-07-29",
            "count": 3
          },
          {
            "date": "2021-08-01",
            "count": 1
          },
          {
            "date": "2021-08-03",
            "count": 1
          },
          {
            "date": "2021-08-04",
            "count": 1
          },
          {
            "date": "2021-08-06",
            "count": 2
          },
          {
            "date": "2021-08-11",
            "count": 2
          },
          {
            "date": "2021-08-12",
            "count": 1
          },
          {
            "date": "2021-08-13",
            "count": 1
          },
          {
            "date": "2021-08-14",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-17",
            "count": 1
          },
          {
            "date": "2021-08-18",
            "count": 2
          },
          {
            "date": "2021-08-26",
            "count": 1
          },
          {
            "date": "2021-08-30",
            "count": 1
          },
          {
            "date": "2021-09-01",
            "count": 1
          },
          {
            "date": "2021-09-03",
            "count": 2
          },
          {
            "date": "2021-09-08",
            "count": 1
          },
          {
            "date": "2021-09-09",
            "count": 2
          },
          {
            "date": "2021-09-10",
            "count": 4
          },
          {
            "date": "2021-09-11",
            "count": 1
          },
          {
            "date": "2021-09-13",
            "count": 1
          },
          {
            "date": "2021-09-17",
            "count": 2
          },
          {
            "date": "2021-09-20",
            "count": 1
          },
          {
            "date": "2021-09-22",
            "count": 1
          },
          {
            "date": "2021-09-23",
            "count": 1
          },
          {
            "date": "2021-09-27",
            "count": 1
          },
          {
            "date": "2021-09-30",
            "count": 1
          },
          {
            "date": "2021-10-02",
            "count": 3
          },
          {
            "date": "2021-10-04",
            "count": 1
          },
          {
            "date": "2021-10-05",
            "count": 2
          },
          {
            "date": "2021-10-07",
            "count": 1
          },
          {
            "date": "2021-10-08",
            "count": 1
          },
          {
            "date": "2021-10-10",
            "count": 1
          },
          {
            "date": "2021-10-11",
            "count": 1
          },
          {
            "date": "2021-10-13",
            "count": 1
          },
          {
            "date": "2021-10-14",
            "count": 2
          },
          {
            "date": "2021-10-15",
            "count": 1
          },
          {
            "date": "2021-10-16",
            "count": 1
          },
          {
            "date": "2021-10-17",
            "count": 1
          },
          {
            "date": "2021-10-18",
            "count": 1
          },
          {
            "date": "2021-10-20",
            "count": 1
          },
          {
            "date": "2021-10-21",
            "count": 2
          },
          {
            "date": "2021-10-28",
            "count": 5
          },
          {
            "date": "2021-10-29",
            "count": 2
          },
          {
            "date": "2021-10-30",
            "count": 2
          },
          {
            "date": "2021-10-31",
            "count": 1
          },
          {
            "date": "2021-11-01",
            "count": 1
          },
          {
            "date": "2021-11-04",
            "count": 3
          },
          {
            "date": "2021-11-05",
            "count": 2
          },
          {
            "date": "2021-11-06",
            "count": 1
          },
          {
            "date": "2021-11-08",
            "count": 3
          },
          {
            "date": "2021-11-09",
            "count": 2
          },
          {
            "date": "2021-11-10",
            "count": 1
          },
          {
            "date": "2021-11-11",
            "count": 1
          },
          {
            "date": "2021-11-12",
            "count": 2
          },
          {
            "date": "2021-11-14",
            "count": 3
          },
          {
            "date": "2021-11-16",
            "count": 1
          },
          {
            "date": "2021-11-17",
            "count": 2
          },
          {
            "date": "2021-11-18",
            "count": 1
          },
          {
            "date": "2021-11-27",
            "count": 1
          },
          {
            "date": "2021-11-28",
            "count": 1
          },
          {
            "date": "2021-11-29",
            "count": 3
          },
          {
            "date": "2021-12-01",
            "count": 1
          },
          {
            "date": "2021-12-03",
            "count": 1
          },
          {
            "date": "2021-12-05",
            "count": 1
          },
          {
            "date": "2021-12-08",
            "count": 1
          },
          {
            "date": "2021-12-09",
            "count": 1
          },
          {
            "date": "2021-12-12",
            "count": 1
          },
          {
            "date": "2021-12-13",
            "count": 1
          },
          {
            "date": "2021-12-16",
            "count": 3
          },
          {
            "date": "2021-12-17",
            "count": 1
          },
          {
            "date": "2021-12-19",
            "count": 1
          },
          {
            "date": "2021-12-20",
            "count": 1
          },
          {
            "date": "2021-12-22",
            "count": 1
          },
          {
            "date": "2021-12-23",
            "count": 1
          },
          {
            "date": "2021-12-27",
            "count": 2
          },
          {
            "date": "2022-01-03",
            "count": 1
          },
          {
            "date": "2022-01-04",
            "count": 2
          },
          {
            "date": "2022-01-05",
            "count": 2
          },
          {
            "date": "2022-01-06",
            "count": 1
          },
          {
            "date": "2022-01-07",
            "count": 2
          },
          {
            "date": "2022-01-08",
            "count": 2
          },
          {
            "date": "2022-01-11",
            "count": 1
          },
          {
            "date": "2022-01-14",
            "count": 1
          },
          {
            "date": "2022-01-16",
            "count": 3
          },
          {
            "date": "2022-01-19",
            "count": 1
          },
          {
            "date": "2022-01-20",
            "count": 1
          },
          {
            "date": "2022-01-21",
            "count": 1
          },
          {
            "date": "2022-01-22",
            "count": 1
          },
          {
            "date": "2022-01-23",
            "count": 1
          },
          {
            "date": "2022-01-24",
            "count": 1
          },
          {
            "date": "2022-01-25",
            "count": 2
          },
          {
            "date": "2022-01-31",
            "count": 2
          },
          {
            "date": "2022-02-01",
            "count": 1
          },
          {
            "date": "2022-02-03",
            "count": 2
          },
          {
            "date": "2022-02-04",
            "count": 1
          },
          {
            "date": "2022-02-09",
            "count": 1
          },
          {
            "date": "2022-02-15",
            "count": 2
          },
          {
            "date": "2022-02-17",
            "count": 1
          },
          {
            "date": "2022-02-18",
            "count": 2
          },
          {
            "date": "2022-02-21",
            "count": 1
          },
          {
            "date": "2022-02-22",
            "count": 1
          },
          {
            "date": "2022-02-28",
            "count": 1
          },
          {
            "date": "2022-03-03",
            "count": 1
          },
          {
            "date": "2022-03-06",
            "count": 1
          },
          {
            "date": "2022-03-07",
            "count": 2
          },
          {
            "date": "2022-03-09",
            "count": 1
          },
          {
            "date": "2022-03-10",
            "count": 1
          },
          {
            "date": "2022-03-14",
            "count": 1
          },
          {
            "date": "2022-03-16",
            "count": 2
          },
          {
            "date": "2022-03-17",
            "count": 1
          },
          {
            "date": "2022-03-18",
            "count": 1
          },
          {
            "date": "2022-03-23",
            "count": 1
          },
          {
            "date": "2022-03-24",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-04-04",
            "count": 1
          },
          {
            "date": "2022-04-05",
            "count": 2
          },
          {
            "date": "2022-04-06",
            "count": 1
          },
          {
            "date": "2022-04-08",
            "count": 1
          },
          {
            "date": "2022-04-13",
            "count": 2
          },
          {
            "date": "2022-04-16",
            "count": 1
          },
          {
            "date": "2022-04-18",
            "count": 1
          },
          {
            "date": "2022-04-19",
            "count": 1
          },
          {
            "date": "2022-04-21",
            "count": 1
          },
          {
            "date": "2022-04-22",
            "count": 1
          },
          {
            "date": "2022-04-25",
            "count": 1
          },
          {
            "date": "2022-04-26",
            "count": 1
          },
          {
            "date": "2022-04-28",
            "count": 1
          },
          {
            "date": "2022-04-29",
            "count": 2
          },
          {
            "date": "2022-04-30",
            "count": 1
          },
          {
            "date": "2022-05-01",
            "count": 1
          },
          {
            "date": "2022-05-02",
            "count": 1
          },
          {
            "date": "2022-05-03",
            "count": 1
          },
          {
            "date": "2022-05-05",
            "count": 1
          },
          {
            "date": "2022-05-07",
            "count": 1
          },
          {
            "date": "2022-05-09",
            "count": 2
          },
          {
            "date": "2022-05-10",
            "count": 1
          },
          {
            "date": "2022-05-11",
            "count": 1
          },
          {
            "date": "2022-05-13",
            "count": 1
          },
          {
            "date": "2022-05-15",
            "count": 1
          },
          {
            "date": "2022-05-16",
            "count": 2
          },
          {
            "date": "2022-05-19",
            "count": 1
          },
          {
            "date": "2022-05-20",
            "count": 2
          },
          {
            "date": "2022-05-21",
            "count": 1
          },
          {
            "date": "2022-05-28",
            "count": 1
          },
          {
            "date": "2022-06-01",
            "count": 1
          },
          {
            "date": "2022-06-02",
            "count": 2
          },
          {
            "date": "2022-06-04",
            "count": 1
          },
          {
            "date": "2022-06-14",
            "count": 1
          },
          {
            "date": "2022-06-15",
            "count": 1
          },
          {
            "date": "2022-06-17",
            "count": 1
          },
          {
            "date": "2022-06-18",
            "count": 1
          },
          {
            "date": "2022-06-19",
            "count": 1
          },
          {
            "date": "2022-06-21",
            "count": 2
          },
          {
            "date": "2022-06-25",
            "count": 1
          },
          {
            "date": "2022-06-28",
            "count": 1
          },
          {
            "date": "2022-06-29",
            "count": 1
          },
          {
            "date": "2022-07-07",
            "count": 3
          },
          {
            "date": "2022-07-13",
            "count": 1
          },
          {
            "date": "2022-07-20",
            "count": 1
          },
          {
            "date": "2022-07-26",
            "count": 2
          },
          {
            "date": "2022-08-01",
            "count": 2
          },
          {
            "date": "2022-08-05",
            "count": 1
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-12",
            "count": 1
          },
          {
            "date": "2022-08-15",
            "count": 2
          },
          {
            "date": "2022-08-20",
            "count": 1
          },
          {
            "date": "2022-08-22",
            "count": 1
          },
          {
            "date": "2022-08-23",
            "count": 1
          },
          {
            "date": "2022-08-26",
            "count": 1
          },
          {
            "date": "2022-09-03",
            "count": 1
          },
          {
            "date": "2022-09-07",
            "count": 1
          },
          {
            "date": "2022-09-08",
            "count": 1
          },
          {
            "date": "2022-09-12",
            "count": 1
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-09-20",
            "count": 1
          },
          {
            "date": "2022-09-25",
            "count": 1
          },
          {
            "date": "2022-10-05",
            "count": 1
          },
          {
            "date": "2022-10-10",
            "count": 1
          },
          {
            "date": "2022-10-12",
            "count": 2
          },
          {
            "date": "2022-10-17",
            "count": 1
          },
          {
            "date": "2022-10-18",
            "count": 1
          },
          {
            "date": "2022-10-19",
            "count": 1
          },
          {
            "date": "2022-10-20",
            "count": 2
          },
          {
            "date": "2022-10-24",
            "count": 1
          },
          {
            "date": "2022-10-25",
            "count": 1
          },
          {
            "date": "2022-10-26",
            "count": 2
          },
          {
            "date": "2022-10-28",
            "count": 3
          },
          {
            "date": "2022-11-02",
            "count": 1
          },
          {
            "date": "2022-11-04",
            "count": 1
          },
          {
            "date": "2022-11-07",
            "count": 1
          },
          {
            "date": "2022-11-08",
            "count": 1
          },
          {
            "date": "2022-11-29",
            "count": 1
          },
          {
            "date": "2022-12-05",
            "count": 2
          },
          {
            "date": "2022-12-09",
            "count": 2
          },
          {
            "date": "2022-12-10",
            "count": 1
          },
          {
            "date": "2022-12-11",
            "count": 1
          },
          {
            "date": "2022-12-12",
            "count": 1
          },
          {
            "date": "2022-12-14",
            "count": 1
          },
          {
            "date": "2022-12-26",
            "count": 1
          },
          {
            "date": "2022-12-28",
            "count": 2
          },
          {
            "date": "2023-01-01",
            "count": 1
          },
          {
            "date": "2023-01-04",
            "count": 1
          },
          {
            "date": "2023-01-05",
            "count": 2
          },
          {
            "date": "2023-01-06",
            "count": 2
          },
          {
            "date": "2023-01-09",
            "count": 1
          },
          {
            "date": "2023-01-10",
            "count": 2
          },
          {
            "date": "2023-01-12",
            "count": 1
          },
          {
            "date": "2023-01-13",
            "count": 2
          },
          {
            "date": "2023-01-14",
            "count": 1
          },
          {
            "date": "2023-01-31",
            "count": 1
          },
          {
            "date": "2023-02-04",
            "count": 1
          },
          {
            "date": "2023-02-07",
            "count": 1
          },
          {
            "date": "2023-02-08",
            "count": 1
          },
          {
            "date": "2023-02-10",
            "count": 4
          },
          {
            "date": "2023-02-15",
            "count": 2
          },
          {
            "date": "2023-02-20",
            "count": 1
          },
          {
            "date": "2023-02-22",
            "count": 1
          },
          {
            "date": "2023-02-24",
            "count": 1
          },
          {
            "date": "2023-02-25",
            "count": 1
          },
          {
            "date": "2023-02-28",
            "count": 1
          },
          {
            "date": "2023-03-02",
            "count": 1
          },
          {
            "date": "2023-03-03",
            "count": 2
          },
          {
            "date": "2023-03-05",
            "count": 1
          },
          {
            "date": "2023-03-07",
            "count": 1
          },
          {
            "date": "2023-03-13",
            "count": 1
          },
          {
            "date": "2023-03-14",
            "count": 3
          },
          {
            "date": "2023-03-15",
            "count": 1
          },
          {
            "date": "2023-03-20",
            "count": 2
          },
          {
            "date": "2023-03-23",
            "count": 2
          },
          {
            "date": "2023-03-24",
            "count": 3
          },
          {
            "date": "2023-03-29",
            "count": 1
          },
          {
            "date": "2023-04-01",
            "count": 1
          },
          {
            "date": "2023-04-04",
            "count": 2
          },
          {
            "date": "2023-04-06",
            "count": 1
          },
          {
            "date": "2023-04-12",
            "count": 1
          },
          {
            "date": "2023-04-18",
            "count": 1
          },
          {
            "date": "2023-04-24",
            "count": 2
          },
          {
            "date": "2023-05-12",
            "count": 1
          },
          {
            "date": "2023-05-20",
            "count": 1
          },
          {
            "date": "2023-05-22",
            "count": 1
          },
          {
            "date": "2023-06-01",
            "count": 1
          },
          {
            "date": "2023-06-02",
            "count": 2
          },
          {
            "date": "2023-06-11",
            "count": 1
          },
          {
            "date": "2023-06-13",
            "count": 1
          },
          {
            "date": "2023-06-18",
            "count": 2
          },
          {
            "date": "2023-06-20",
            "count": 1
          },
          {
            "date": "2023-06-22",
            "count": 1
          },
          {
            "date": "2023-06-26",
            "count": 3
          },
          {
            "date": "2023-06-29",
            "count": 1
          },
          {
            "date": "2023-07-05",
            "count": 1
          },
          {
            "date": "2023-07-17",
            "count": 1
          },
          {
            "date": "2023-07-20",
            "count": 1
          },
          {
            "date": "2023-07-21",
            "count": 1
          },
          {
            "date": "2023-07-22",
            "count": 1
          },
          {
            "date": "2023-07-23",
            "count": 1
          },
          {
            "date": "2023-08-03",
            "count": 1
          },
          {
            "date": "2023-08-07",
            "count": 1
          },
          {
            "date": "2023-08-08",
            "count": 1
          },
          {
            "date": "2023-08-10",
            "count": 1
          },
          {
            "date": "2023-08-17",
            "count": 1
          },
          {
            "date": "2023-08-20",
            "count": 1
          },
          {
            "date": "2023-09-01",
            "count": 1
          },
          {
            "date": "2023-09-02",
            "count": 1
          },
          {
            "date": "2023-09-08",
            "count": 1
          },
          {
            "date": "2023-09-11",
            "count": 1
          },
          {
            "date": "2023-09-17",
            "count": 1
          },
          {
            "date": "2023-09-19",
            "count": 1
          },
          {
            "date": "2023-09-26",
            "count": 1
          },
          {
            "date": "2023-09-29",
            "count": 1
          },
          {
            "date": "2023-10-03",
            "count": 1
          },
          {
            "date": "2023-10-10",
            "count": 1
          },
          {
            "date": "2023-10-12",
            "count": 1
          },
          {
            "date": "2023-10-19",
            "count": 1
          },
          {
            "date": "2023-11-08",
            "count": 1
          },
          {
            "date": "2023-11-29",
            "count": 2
          },
          {
            "date": "2023-12-03",
            "count": 1
          },
          {
            "date": "2023-12-05",
            "count": 1
          },
          {
            "date": "2023-12-21",
            "count": 1
          },
          {
            "date": "2023-12-24",
            "count": 1
          },
          {
            "date": "2023-12-27",
            "count": 1
          },
          {
            "date": "2024-01-19",
            "count": 1
          },
          {
            "date": "2024-01-23",
            "count": 1
          },
          {
            "date": "2024-01-25",
            "count": 1
          },
          {
            "date": "2024-02-07",
            "count": 1
          },
          {
            "date": "2024-02-14",
            "count": 1
          },
          {
            "date": "2024-02-17",
            "count": 1
          },
          {
            "date": "2024-02-24",
            "count": 1
          },
          {
            "date": "2024-02-26",
            "count": 1
          },
          {
            "date": "2024-03-05",
            "count": 2
          },
          {
            "date": "2024-03-11",
            "count": 1
          },
          {
            "date": "2024-03-12",
            "count": 1
          },
          {
            "date": "2024-03-14",
            "count": 1
          },
          {
            "date": "2024-03-16",
            "count": 1
          },
          {
            "date": "2024-03-19",
            "count": 2
          },
          {
            "date": "2024-04-04",
            "count": 1
          },
          {
            "date": "2024-04-05",
            "count": 1
          },
          {
            "date": "2024-04-06",
            "count": 1
          },
          {
            "date": "2024-04-09",
            "count": 2
          },
          {
            "date": "2024-04-10",
            "count": 1
          },
          {
            "date": "2024-04-11",
            "count": 1
          },
          {
            "date": "2024-04-15",
            "count": 2
          },
          {
            "date": "2024-04-17",
            "count": 1
          },
          {
            "date": "2024-04-18",
            "count": 1
          },
          {
            "date": "2024-04-19",
            "count": 1
          },
          {
            "date": "2024-04-25",
            "count": 1
          },
          {
            "date": "2024-04-26",
            "count": 1
          },
          {
            "date": "2024-04-27",
            "count": 1
          },
          {
            "date": "2024-04-29",
            "count": 2
          },
          {
            "date": "2024-05-01",
            "count": 1
          },
          {
            "date": "2024-05-02",
            "count": 1
          },
          {
            "date": "2024-05-03",
            "count": 1
          },
          {
            "date": "2024-05-08",
            "count": 1
          },
          {
            "date": "2024-05-10",
            "count": 1
          },
          {
            "date": "2024-05-11",
            "count": 1
          },
          {
            "date": "2024-05-14",
            "count": 1
          },
          {
            "date": "2024-05-15",
            "count": 1
          },
          {
            "date": "2024-05-19",
            "count": 1
          },
          {
            "date": "2024-05-20",
            "count": 1
          },
          {
            "date": "2024-05-27",
            "count": 1
          },
          {
            "date": "2024-06-01",
            "count": 1
          },
          {
            "date": "2024-06-06",
            "count": 2
          },
          {
            "date": "2024-06-10",
            "count": 3
          },
          {
            "date": "2024-06-11",
            "count": 1
          },
          {
            "date": "2024-06-13",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 1
          },
          {
            "date": "2024-06-22",
            "count": 1
          },
          {
            "date": "2024-06-26",
            "count": 1
          },
          {
            "date": "2024-06-27",
            "count": 1
          },
          {
            "date": "2024-08-03",
            "count": 1
          },
          {
            "date": "2024-08-09",
            "count": 1
          },
          {
            "date": "2024-08-10",
            "count": 1
          },
          {
            "date": "2024-08-19",
            "count": 2
          },
          {
            "date": "2024-08-21",
            "count": 1
          },
          {
            "date": "2024-08-26",
            "count": 1
          },
          {
            "date": "2024-09-08",
            "count": 1
          },
          {
            "date": "2024-09-11",
            "count": 2
          },
          {
            "date": "2024-09-12",
            "count": 1
          },
          {
            "date": "2024-09-16",
            "count": 3
          },
          {
            "date": "2024-09-18",
            "count": 1
          },
          {
            "date": "2024-09-19",
            "count": 1
          },
          {
            "date": "2024-09-21",
            "count": 1
          },
          {
            "date": "2024-09-22",
            "count": 1
          },
          {
            "date": "2024-09-26",
            "count": 2
          },
          {
            "date": "2024-10-01",
            "count": 1
          },
          {
            "date": "2024-10-03",
            "count": 2
          },
          {
            "date": "2024-10-04",
            "count": 1
          },
          {
            "date": "2024-10-07",
            "count": 1
          },
          {
            "date": "2024-10-09",
            "count": 1
          },
          {
            "date": "2024-10-11",
            "count": 1
          },
          {
            "date": "2024-10-13",
            "count": 1
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2024-10-20",
            "count": 2
          },
          {
            "date": "2024-10-24",
            "count": 2
          },
          {
            "date": "2024-10-31",
            "count": 2
          },
          {
            "date": "2024-11-03",
            "count": 3
          },
          {
            "date": "2024-11-04",
            "count": 1
          },
          {
            "date": "2024-11-11",
            "count": 1
          },
          {
            "date": "2024-11-15",
            "count": 1
          },
          {
            "date": "2024-11-20",
            "count": 1
          },
          {
            "date": "2024-11-25",
            "count": 1
          },
          {
            "date": "2024-11-27",
            "count": 1
          },
          {
            "date": "2024-12-06",
            "count": 1
          },
          {
            "date": "2024-12-15",
            "count": 1
          },
          {
            "date": "2024-12-17",
            "count": 1
          },
          {
            "date": "2024-12-20",
            "count": 1
          },
          {
            "date": "2024-12-22",
            "count": 1
          },
          {
            "date": "2024-12-27",
            "count": 1
          },
          {
            "date": "2024-12-28",
            "count": 1
          },
          {
            "date": "2025-01-08",
            "count": 1
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-10",
            "count": 1
          },
          {
            "date": "2025-01-13",
            "count": 1
          },
          {
            "date": "2025-01-14",
            "count": 1
          },
          {
            "date": "2025-01-16",
            "count": 1
          },
          {
            "date": "2025-01-25",
            "count": 1
          },
          {
            "date": "2025-02-08",
            "count": 1
          },
          {
            "date": "2025-02-09",
            "count": 1
          },
          {
            "date": "2025-02-12",
            "count": 1
          },
          {
            "date": "2025-02-15",
            "count": 1
          },
          {
            "date": "2025-02-16",
            "count": 1
          },
          {
            "date": "2025-02-18",
            "count": 2
          },
          {
            "date": "2025-02-26",
            "count": 1
          },
          {
            "date": "2025-03-01",
            "count": 1
          },
          {
            "date": "2025-03-05",
            "count": 1
          },
          {
            "date": "2025-03-10",
            "count": 1
          },
          {
            "date": "2025-03-25",
            "count": 1
          },
          {
            "date": "2025-03-28",
            "count": 2
          },
          {
            "date": "2025-04-02",
            "count": 1
          },
          {
            "date": "2025-04-14",
            "count": 1
          },
          {
            "date": "2025-04-16",
            "count": 1
          },
          {
            "date": "2025-04-17",
            "count": 1
          },
          {
            "date": "2025-05-02",
            "count": 1
          },
          {
            "date": "2025-05-08",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 1
          },
          {
            "date": "2025-05-23",
            "count": 1
          },
          {
            "date": "2025-06-01",
            "count": 1
          },
          {
            "date": "2025-06-09",
            "count": 1
          },
          {
            "date": "2025-06-12",
            "count": 1
          },
          {
            "date": "2025-06-15",
            "count": 1
          },
          {
            "date": "2025-06-17",
            "count": 1
          },
          {
            "date": "2025-06-24",
            "count": 1
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-08",
            "count": 1
          },
          {
            "date": "2025-07-27",
            "count": 1
          },
          {
            "date": "2025-08-20",
            "count": 1
          },
          {
            "date": "2025-08-27",
            "count": 1
          },
          {
            "date": "2025-08-29",
            "count": 1
          },
          {
            "date": "2025-09-06",
            "count": 1
          },
          {
            "date": "2025-09-17",
            "count": 1
          },
          {
            "date": "2025-09-26",
            "count": 1
          },
          {
            "date": "2025-10-14",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2025-12-04",
            "count": 1
          },
          {
            "date": "2025-12-10",
            "count": 1
          },
          {
            "date": "2025-12-16",
            "count": 1
          },
          {
            "date": "2025-12-17",
            "count": 3
          },
          {
            "date": "2025-12-23",
            "count": 1
          },
          {
            "date": "2025-12-26",
            "count": 1
          },
          {
            "date": "2026-01-03",
            "count": 1
          },
          {
            "date": "2026-01-05",
            "count": 1
          },
          {
            "date": "2026-01-07",
            "count": 1
          },
          {
            "date": "2026-01-13",
            "count": 1
          },
          {
            "date": "2026-01-17",
            "count": 1
          },
          {
            "date": "2026-01-22",
            "count": 2
          },
          {
            "date": "2026-01-24",
            "count": 2
          },
          {
            "date": "2026-01-27",
            "count": 2
          },
          {
            "date": "2026-01-31",
            "count": 1
          },
          {
            "date": "2026-02-06",
            "count": 2
          },
          {
            "date": "2026-02-07",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-12",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-02-27",
            "count": 1
          },
          {
            "date": "2026-03-01",
            "count": 2
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-08",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 2
          },
          {
            "date": "2026-04-19",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-24",
            "count": 2
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 2
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 1
          },
          {
            "date": "2026-05-31",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-09",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 1
          },
          {
            "date": "2026-06-16",
            "count": 2
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 2
          },
          {
            "date": "2026-07-06",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 956,
        "total_stars": 956
      },
      "open_issues_and_prs": 62
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "docs/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 333619,
      "source_files_sampled": 512,
      "oversized_source_files": 61,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 2724
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "setup.cfg",
        "setup.py"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 1,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "numba",
          "manifest": "setup.cfg",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "scipy",
          "manifest": "setup.cfg",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "xarray",
          "manifest": "setup.cfg",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "numpy",
          "manifest": "setup.cfg",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "urllib3",
          "manifest": "setup.cfg",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "zstandard",
          "manifest": "setup.cfg",
          "ecosystem": "pypi",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "setuptools",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 1,
        "direct_count": 0,
        "indirect_count": 1
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 1763,
        "open_issues": 62,
        "closed_ratio": 0.966,
        "closed_issues": 1751,
        "closed_unmerged_prs": 85
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "brendancol",
          "commits": 1745,
          "avatar_url": "https://avatars.githubusercontent.com/u/433221?v=4"
        },
        {
          "type": "User",
          "login": "thuydotm",
          "commits": 120,
          "avatar_url": "https://avatars.githubusercontent.com/u/47617499?v=4"
        },
        {
          "type": "User",
          "login": "giancastro",
          "commits": 58,
          "avatar_url": "https://avatars.githubusercontent.com/u/16704806?v=4"
        },
        {
          "type": "User",
          "login": "ianthomas23",
          "commits": 29,
          "avatar_url": "https://avatars.githubusercontent.com/u/580326?v=4"
        },
        {
          "type": "User",
          "login": "Melissari1997",
          "commits": 17,
          "avatar_url": "https://avatars.githubusercontent.com/u/62259800?v=4"
        },
        {
          "type": "User",
          "login": "calexat-123",
          "commits": 15,
          "avatar_url": "https://avatars.githubusercontent.com/u/66706246?v=4"
        },
        {
          "type": "User",
          "login": "kristinepetrosyan",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/12383190?v=4"
        },
        {
          "type": "User",
          "login": "alex-soklev",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/15478599?v=4"
        },
        {
          "type": "User",
          "login": "marcozimmermannpm",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/65608702?v=4"
        },
        {
          "type": "User",
          "login": "tcmetzger",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/39711796?v=4"
        }
      ],
      "contributors_sampled": 32,
      "top_contributor_share": 0.856
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "benchmarks.yml",
        "copilot-review.yml",
        "docs.yml",
        "labeler.yml",
        "pypi-publish.yml",
        "test-cog-validator.yml",
        "test-geotiff-corpus.yml",
        "test.yml",
        "welcome-contributor.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 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": 0,
            "reason": "Found 1/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow 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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8bb03aee14bac8eb83128c2e525393b547632c1a",
        "ran_at": "2026-07-22T08:21:27Z",
        "aggregate_score": 5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T05:07:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-21T16:21:05Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1135,
          "created_at": "2026-04-01T15:18:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1136,
          "created_at": "2026-04-01T15:18:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1139,
          "created_at": "2026-04-01T15:18:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1140,
          "created_at": "2026-04-01T15:19:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1141,
          "created_at": "2026-04-01T15:19:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1142,
          "created_at": "2026-04-01T15:19:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1144,
          "created_at": "2026-04-01T15:19:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1146,
          "created_at": "2026-04-01T15:19:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1147,
          "created_at": "2026-04-01T15:19:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1153,
          "created_at": "2026-04-01T15:29:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2415,
          "created_at": "2026-05-26T13:45:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2930,
          "created_at": "2026-06-04T15:58:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2931,
          "created_at": "2026-06-04T15:59:14Z",
          "last_comment_at": "2026-06-06T21:37:58Z",
          "last_comment_author": "brendancol"
        },
        {
          "number": 2932,
          "created_at": "2026-06-04T15:59:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2933,
          "created_at": "2026-06-04T15:59:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2934,
          "created_at": "2026-06-04T15:59:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2935,
          "created_at": "2026-06-04T15:59:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2936,
          "created_at": "2026-06-04T16:00:10Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2937,
          "created_at": "2026-06-04T16:00:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2938,
          "created_at": "2026-06-04T16:00:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/xarray-contrib/xarray-spatial",
    "host": "github.com",
    "name": "xarray-spatial",
    "owner": "xarray-contrib"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 75,
      "inputs": {
        "security": 50,
        "vitality": 89,
        "community": 81,
        "governance": 68,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 89,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 1530,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 26
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "26/52 weeks with commits",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1530 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1530
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 100,
            "inputs": {
              "releases_count": 71,
              "latest_release_tag": "v0.10.17",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 3.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "71 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 71
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.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": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 81,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "forks": 93,
              "stars": 956,
              "watchers": 16,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "956 stars",
                "points": 48.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 956
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "93 forks",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 93
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "16 watchers",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 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": 68,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 32,
              "top_contributor_share": 0.856
            },
            "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 86% of commits",
                "points": 3.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 86
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "32 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "merged_prs": 1763,
              "open_issues": 62,
              "closed_issues": 1751,
              "issue_closed_ratio": 0.966,
              "closed_unmerged_prs": 85
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "97% of issues closed",
                "points": 45.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1763/1848 decided PRs merged",
                "points": 36.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1763,
                      "decided": 1848
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "followers": 120,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "xarray-contrib",
              "public_repos": 34,
              "account_age_days": 3101
            },
            "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": "120 followers of xarray-contrib",
                "points": 15,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 120,
                      "login": "xarray-contrib"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "34 public repos, account ~8 yr old",
                "points": 23.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 34
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 8
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "xarray-spatial"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "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 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "70 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 70
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "9 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "python",
                "raster-analysis",
                "spatial-analysis",
                "numba",
                "xarray"
              ],
              "has_wiki": true,
              "homepage": "https://xarray-spatial.readthedocs.io/",
              "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://xarray-spatial.readthedocs.io/",
                "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 9
            },
            "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": 56,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.91,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 2724
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "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": "91 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 91,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "docs/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "docs/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "docs/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": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "at_risk",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 333619,
              "source_files_sampled": 512,
              "oversized_source_files": 61
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "61/512 source files over 60KB",
                "points": 48.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 512,
                      "oversized": 61
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "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": "examples, notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, 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": [
    "deps.dev does not index pypi:xarray-spatial@0.10.17; advisories assessed against the repository dependency graph instead",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T08:22:03.774643Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/x/xarray-contrib/xarray-spatial.svg",
  "full_name": "xarray-contrib/xarray-spatial",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.26.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаPyPI.