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