公开记录
软件健康报告模式 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年2月在 GitHub 上查看 ↗

xarray-contrib/xarray-spatial 的健康指数为 100 分中的 75 分,处于「良好」区间。 其得分最高的类别是Vitality(89/100),最低的是Security(50/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

75
总分 / 100
良好

软件健康指数

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

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

评分画像

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

所有权

120 关注者34 个公开仓库始于 2018年1月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
PyPIxarray-spatial0.10.17-704 天前

按类别列示的指标

活力

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

89优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
18/36提交节奏 — 52 周中有 26 周有提交
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

发布纪律

100优秀
评分方式
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

社区健康

92优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
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议题解决 — 97% 的议题已关闭
36.5/38.3PR 接受 — 已裁定的 PR 中 1,763/1,848 已合并
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所有者影响力 — xarray-contrib 有 120 位关注者
23.2/25既往记录 — 34 个公开仓库,账户约 8 年
所用输入
followers120
owner_typeOrganization
is_verified
owner_loginxarray-contrib
public_repos34
account_age_days3,101
评分方式
25/25已发布且可解析 — pypi 上有 1 个软件包
35/35发布时效 — 最近一次发布于 4 天前
20/20版本历史 — 70 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesxarray-spatial
ecosystemspypi
any_deprecated
min_days_since_publish4

工程质量

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

81良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 9 个工作流
24/24存在测试
0/16Linter 配置
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。 其余权重已重新归一化。

AI 就绪度

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

56中等 · 占总体的 0%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 91 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.91
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes2,724
评分方式
18/18一条命令的引导启动 — docs/Makefile
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
2/10已体现的代理实践 — 最近 100 次提交中有 1 次由代理编写或署名代理
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可控的文件大小 — 采样的 512 个源文件中有 61 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes333,619
source_files_sampled512
oversized_source_files61

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples, notebooks
所用输入
example_dirsexamples, notebooks
has_mcp_signal
api_schema_files

关键数据

956GitHub 星标
32贡献者
1,530最近 12 个月提交数
0距最近推送天数
71发布版本数
1巴士系数(bus factor)
62开放议题
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

更多细节

Star 与 Fork 历史 956 ★ / 93 ⇿
956Star
93Fork
69发布

每颗 star 和每个 fork 的添加时间,来自 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 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
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.