# selftest_review.py — targeted negative tests (reviewer-requested gates)
{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 1.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2236,
    "vertices_failed": 0,
    "segments_total": 2226,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 1.0
}
1.0

[reference] score = 1.0 (expect 1.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": false
  },
  "scores": {},
  "raster_match_fraction": 0.00125,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[naive_a] score = 0.0 (expect 0.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": false,
    "pixel_edge_bounds_exact": false,
    "raster_matches_reference": true
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N1 affine origin +half pixel] score = 0.0 (expect 0.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": false,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": false,
    "raster_matches_reference": false
  },
  "scores": {},
  "raster_match_fraction": 0.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N2 201x201 grid] score = 0.0 (expect 0.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 20,
    "vertices_failed": 20,
    "segments_total": 10,
    "segments_nonlocal": 10
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.7
}
0.7

[N3 fabricated contour lines] score = 0.7 (expect < 0.75: the whole contour component is lost, only raster+zonal credit remains)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 0.0667,
    "contours": 1.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2236,
    "vertices_failed": 0,
    "segments_total": 2226,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.58
}
0.58

[N4 zonal on pixel corners] score = 0.58 (expect < 1.0)

[N5 setup] north_ridge: float rule count=5896 vs exact reference 5890
[N5 setup] valley_floor: float rule count=4740 vs exact reference 4734
[N5 setup] east_slope: float rule count=3062 vs exact reference 3061
{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 0.8,
    "contours": 1.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2236,
    "vertices_failed": 0,
    "segments_total": 2226,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.91
}
0.91

[N5 float-based membership counts] score = 0.91 (expect < 1.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": false
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N6a renamed CSV header] score = 0.0 (expect 0.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": false
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N6b 3-decimal values] score = 0.0 (expect 0.0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": true,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2156,
    "vertices_failed": 0,
    "segments_total": 2147,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.7
}
0.7

[N7] score = 0.7 (expect 0.7, rc=0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": false,
    "malformed_features": true,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2156,
    "vertices_failed": 0,
    "segments_total": 2147,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.7
}
0.7

[N7] score = 0.7 (expect 0.7, rc=0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": true,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2156,
    "vertices_failed": 0,
    "segments_total": 2147,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.7
}
0.7

[N7] score = 0.7 (expect 0.7, rc=0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": false
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "error": "empty or non-list FeatureCollection"
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 0,
  "final": 0.7
}
0.7

[N7] score = 0.7 (expect 0.7, rc=0)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 1419,
    "vertices_failed": 0,
    "segments_total": 1409,
    "segments_nonlocal": 1
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.7
}
0.7

[N8 nonlocal jump (2 distant valid crossings stitched)] score = 0.7 (expect 0.7 — whole contour component lost, raster+zonal kept)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": false
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N9 count written as float '5890.0'] score = 0.0 (expect 0.0 — integer-only CSV format gate)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": false
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "error": "empty or non-list FeatureCollection"
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 0,
  "final": 0.7
}
0.7

[N10 top-level type 'Feature Collection'] score = 0.7 (expect 0.7 — no contour credit)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": false,
    "n_levels_expected": 5,
    "vertices_total": 2236,
    "vertices_failed": 0,
    "segments_total": 2226,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 0.7
}
0.7

[N11 level 1e-7 off the 50 m grid] score = 0.7 (expect 0.7 — contour component lost: levels must be EXACT multiples)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": false,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N12 CRS metadata changed to 3857] score = 0.0 (expect 0.0 — isolated grid_meta_crs_res_nodata)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": false,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N13 nodata attribute unset] score = 0.0 (expect 0.0 — isolated grid_meta_crs_res_nodata)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": false
  },
  "scores": {},
  "raster_match_fraction": 0.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N14 same-shape wrong pixels (+0.5)] score = 0.0 (expect 0.0 — raster_matches_reference gate)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 0.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 1995,
    "vertices_failed": 0,
    "segments_total": 1988,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 7,
  "final": 0.7
}
0.7

[N15 7/10 features (past +/-20%)] score = 0.7 (expect 0.7 — count tolerance boundary)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": false
  },
  "scores": {},
  "raster_match_fraction": 1.0,
  "final": 0.0,
  "reason": "hard gate failed"
}
0.0

[N16 negative count cell '-5'] score = 0.0 (expect 0.0 — integer-only grammar edge)

{
  "gates": {
    "tif_exists": true,
    "csv_exists": true,
    "geojson_exists": true,
    "grid_meta_crs_res_nodata": true,
    "affine_transform_exact": true,
    "pixel_edge_bounds_exact": true,
    "raster_matches_reference": true,
    "csv_header_and_format_exact": true,
    "geojson_featurecollection_type": true
  },
  "scores": {
    "zonal_stats_1e-3": 1.0,
    "contours": 1.0,
    "raster_exactness": 1.0
  },
  "raster_match_fraction": 1.0,
  "contour_diagnostics": {
    "linestring_all": true,
    "malformed_features": false,
    "duplicate_features": false,
    "degenerate_segments": false,
    "levels_complete": true,
    "n_levels_expected": 5,
    "vertices_total": 2236,
    "vertices_failed": 0,
    "segments_total": 2226,
    "segments_nonlocal": 0
  },
  "contour_reference_count": 10,
  "contour_delivered_count": 10,
  "final": 1.0
}
1.0

[N17 features shuffled + LineStrings reversed] score = 1.0 (expect 1.0 — order invariance)

ALL targeted negatives rejected or penalised (every run rc=0)
