From e3b131d5347e7faa1ecab48467821e51c863b18d Mon Sep 17 00:00:00 2001 From: GeoGeek Date: Sat, 19 Sep 2026 23:48:18 +0800 Subject: [PATCH 1/2] docs: add GeoDebug overview graphic --- README.md | 3 +++ assets/geodebug-overview.webp | Bin 0 -> 7506 bytes 2 files changed, 3 insertions(+) create mode 100644 assets/geodebug-overview.webp diff --git a/README.md b/README.md index 88886b0..0998be9 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,9 @@ stable `GEOxxx` diagnostics with explicit evidence. No LLM in the core. No silent CRS guessing. No automatic "fix everything." +

+ GeoDebug architecture, diagnostic scopes, rule families, and CLI example +

## What it catches diff --git a/assets/geodebug-overview.webp b/assets/geodebug-overview.webp new file mode 100644 index 0000000000000000000000000000000000000000..550fa7dc8ab8030aa8c338b50a582e91f788ae8d GIT binary patch literal 7506 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 literal 0 HcmV?d00001 From a4b685eeb558683387ab6bfc5c34a14243d8160b Mon Sep 17 00:00:00 2001 From: GeoGeek Date: Sat, 19 Sep 2026 23:49:40 +0800 Subject: [PATCH 2/2] docs: use repository-native SVG overview --- README.md | 2 +- assets/geodebug-overview.svg | 147 ++++++++++++++++++++++++++++++++++ assets/geodebug-overview.webp | Bin 7506 -> 0 bytes 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 assets/geodebug-overview.svg delete mode 100644 assets/geodebug-overview.webp diff --git a/README.md b/README.md index 0998be9..e9ec382 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ stable `GEOxxx` diagnostics with explicit evidence. No LLM in the core. No silent CRS guessing. No automatic "fix everything."

- GeoDebug architecture, diagnostic scopes, rule families, and CLI example + GeoDebug architecture, diagnostic scopes, rule families, and CLI example

## What it catches diff --git a/assets/geodebug-overview.svg b/assets/geodebug-overview.svg new file mode 100644 index 0000000..c43ed56 --- /dev/null +++ b/assets/geodebug-overview.svg @@ -0,0 +1,147 @@ + + GeoDebug — deterministic diagnostics for geospatial data and workflows + GeoDebug architecture from source through adapter, facts, rules, diagnostics, and report, with dataset, relation, and operation rule scopes. + + + + + + + + + + + + + + + GeoDebug + Find the geographic bug, not just the code bug. + + deterministic diagnostics for + geospatial data + workflows + CRS · VECTOR · RASTER · RELATIONS · OPERATIONS + + + + + + + + + + + + + + + + + + + source + your geodata + vector · raster · … + + adapter + read + normalize + format-specific I/O + + facts + CRS · bounds · grid + geometry · metadata + + rules + spatial invariants + explicit evidence + + diagnostics + stable GEOxxx IDs + error · warn · note + + report + terminal + JSON + CI-ready output + + + + + + + + + + + + + dataset + one dataset + relation + datasets together + operation + before execution + + + + + what GeoDebug catches + COMMON SPATIAL BUGS · CAUGHT EARLY + + + + CRS + • missing CRS + • coordinate range + • area of use + + VECTOR + • invalid geometry + + RASTER + • affine transform + • NoData / mask + + RELATIONS + • spatial overlap + • grid alignment + + OPERATIONS + • buffer + • area + • distance + + + + + design principles + 01 deterministic diagnostics + same facts → same result + 02 explicit evidence + findings explain why + UNKNOWN + beats an unsupported + conclusion + + + + + + + $ geodebug preflight roads.geojson --operation buffer --distance 500 + ERROR GEO501 + buffer distance is interpreted in angular coordinate units + \ No newline at end of file diff --git a/assets/geodebug-overview.webp b/assets/geodebug-overview.webp deleted file mode 100644 index 550fa7dc8ab8030aa8c338b50a582e91f788ae8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7506 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