{
 "cases": [
  {
   "sweep_deg": 20,
   "true_arc_px": 163.28,
   "measured_length_px": 160.4,
   "length_error_pct": -1.76,
   "true_width_px": 58.56,
   "measured_grade_px": 58.98,
   "grade_error_pct": 0.72,
   "measured_end_to_end_px": 160.0
  },
  {
   "sweep_deg": 40,
   "true_arc_px": 267.96,
   "measured_length_px": 265.4,
   "length_error_pct": -0.96,
   "true_width_px": 58.52,
   "measured_grade_px": 58.93,
   "grade_error_pct": 0.7,
   "measured_end_to_end_px": 260.6
  },
  {
   "sweep_deg": 60,
   "true_arc_px": 372.555,
   "measured_length_px": 372.3,
   "length_error_pct": -0.07,
   "true_width_px": 58.4,
   "measured_grade_px": 58.83,
   "grade_error_pct": 0.74,
   "measured_end_to_end_px": 355.5
  },
  {
   "sweep_deg": 80,
   "true_arc_px": 477.128,
   "measured_length_px": 478.1,
   "length_error_pct": 0.2,
   "true_width_px": 58.25,
   "measured_grade_px": 58.72,
   "grade_error_pct": 0.81,
   "measured_end_to_end_px": 440.0
  },
  {
   "sweep_deg": 100,
   "true_arc_px": 581.728,
   "measured_length_px": 585.0,
   "length_error_pct": 0.56,
   "true_width_px": 58.13,
   "measured_grade_px": 58.6,
   "grade_error_pct": 0.81,
   "measured_end_to_end_px": 514.4
  },
  {
   "sweep_deg": 120,
   "true_arc_px": 686.443,
   "measured_length_px": 687.4,
   "length_error_pct": 0.14,
   "true_width_px": 58.12,
   "measured_grade_px": 58.54,
   "grade_error_pct": 0.72,
   "measured_end_to_end_px": 574.5
  }
 ],
 "measured_band": {
  "length_pct": [
   -2.24,
   0.81
  ],
  "grade_pct": [
   -0.89,
   1.42
  ]
 },
 "published_band": {
  "length_pct": [
   -2.3,
   0.9
  ],
  "grade_pct": [
   -0.9,
   1.5
  ],
  "basis": "24 circular bands: radii 120-700 px, sweeps 20-150 deg, thicknesses 24-90. Scored against the bands' anti-aliased COVERAGE AREA, which needs no edge-finder and carries no threshold",
  "errs_low_only": false,
  "measured_on_the_plane": "with the scale card in frame the photograph is rectified onto the card's plane first; across camera tilt 0-25 deg the length holds to 1.30%",
  "was": {
   "length_pct": [
    -1.9,
    1.1
   ],
   "grade_pct": [
    -2.3,
    4.0
   ],
   "why_it_changed": "not the measurement -- the REFERENCE. Grade was scored against a count of mask pixels, which carries the same threshold as the measurement, so both moved together and a biased grade scored as unbiased. Against coverage area the old mask-based grade ran -3.9% to -0.4%, never the +4.0% published. Measuring the edge sub-pixel instead then took it to -0.9% .. +1.5%"
  }
 },
 "family": [
  {
   "radius_px": 210,
   "sweep_deg": 33,
   "nominal_thickness_px": 41,
   "true_arc_px": 164.66,
   "true_width_px": 43.71,
   "length_error_pct": -1.37,
   "grade_error_pct": -0.89,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 255,
   "sweep_deg": 51,
   "nominal_thickness_px": 63,
   "true_arc_px": 292.67,
   "true_width_px": 65.69,
   "length_error_pct": -0.23,
   "grade_error_pct": -0.61,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 380,
   "sweep_deg": 71,
   "nominal_thickness_px": 49,
   "true_arc_px": 522.41,
   "true_width_px": 51.52,
   "length_error_pct": 0.3,
   "grade_error_pct": -0.47,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 440,
   "sweep_deg": 93,
   "nominal_thickness_px": 77,
   "true_arc_px": 793.6,
   "true_width_px": 79.41,
   "length_error_pct": 0.81,
   "grade_error_pct": -0.17,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 180,
   "sweep_deg": 27,
   "nominal_thickness_px": 35,
   "true_arc_px": 122.44,
   "true_width_px": 37.62,
   "length_error_pct": -1.75,
   "grade_error_pct": -0.66,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 330,
   "sweep_deg": 110,
   "nominal_thickness_px": 44,
   "true_arc_px": 679.9,
   "true_width_px": 46.34,
   "length_error_pct": 0.07,
   "grade_error_pct": 0.95,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 500,
   "sweep_deg": 64,
   "nominal_thickness_px": 90,
   "true_arc_px": 650.88,
   "true_width_px": 92.37,
   "length_error_pct": 0.31,
   "grade_error_pct": 0.59,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 150,
   "sweep_deg": 45,
   "nominal_thickness_px": 28,
   "true_arc_px": 148.34,
   "true_width_px": 30.53,
   "length_error_pct": -1.37,
   "grade_error_pct": 1.42,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 600,
   "sweep_deg": 85,
   "nominal_thickness_px": 60,
   "true_arc_px": 952.45,
   "true_width_px": 62.33,
   "length_error_pct": 0.23,
   "grade_error_pct": 0.66,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 270,
   "sweep_deg": 130,
   "nominal_thickness_px": 52,
   "true_arc_px": 666.94,
   "true_width_px": 54.33,
   "length_error_pct": -0.08,
   "grade_error_pct": 0.92,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 220,
   "sweep_deg": 150,
   "nominal_thickness_px": 38,
   "true_arc_px": 616.41,
   "true_width_px": 40.45,
   "length_error_pct": -2.24,
   "grade_error_pct": 0.92,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 700,
   "sweep_deg": 40,
   "nominal_thickness_px": 70,
   "true_arc_px": 561.34,
   "true_width_px": 72.65,
   "length_error_pct": -0.1,
   "grade_error_pct": 0.37,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 120,
   "sweep_deg": 60,
   "nominal_thickness_px": 24,
   "true_arc_px": 152.35,
   "true_width_px": 26.69,
   "length_error_pct": -1.09,
   "grade_error_pct": 1.01,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 250,
   "sweep_deg": 75,
   "nominal_thickness_px": 45,
   "true_arc_px": 374.85,
   "true_width_px": 47.6,
   "length_error_pct": 0.25,
   "grade_error_pct": -0.65,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 400,
   "sweep_deg": 55,
   "nominal_thickness_px": 55,
   "true_arc_px": 441.53,
   "true_width_px": 57.56,
   "length_error_pct": -0.01,
   "grade_error_pct": -0.49,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 190,
   "sweep_deg": 100,
   "nominal_thickness_px": 32,
   "true_arc_px": 366.1,
   "true_width_px": 34.48,
   "length_error_pct": 0.27,
   "grade_error_pct": 1.35,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 550,
   "sweep_deg": 120,
   "nominal_thickness_px": 66,
   "true_arc_px": 1220.11,
   "true_width_px": 68.19,
   "length_error_pct": -0.55,
   "grade_error_pct": 0.67,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  },
  {
   "radius_px": 160,
   "sweep_deg": 38,
   "nominal_thickness_px": 30,
   "true_arc_px": 138.85,
   "true_width_px": 32.74,
   "length_error_pct": -1.77,
   "grade_error_pct": 0.71,
   "truth_from": "anti-aliased coverage area, independent of any threshold"
  }
 ],
 "shapes_scored": 24,
 "every_error_is_negative": false,
 "why_that_matters": "the errors used to be negative on every shape, and the answer leaned on it: against a minimum, reading low means a finger reported as clearing the floor cleared it. That is no longer true. The bands are four times tighter on length and centred rather than one-sided, so a reading of 140.5 mm can be a 139.9 mm finger. Decide at a floor using the band, not the direction",
 "reproduce_without_us": {
  "recipe": {
   "radius_px": 300.0,
   "thickness_px": 56.0,
   "canvas_px": [
    820,
    820
   ],
   "centre_px": [
    410,
    590
   ],
   "sweeps_deg": [
    20,
    40,
    60,
    80,
    100,
    120
   ]
  },
  "stroke": "cv2.polylines over 400 points on the arc, LINE_AA, colour BGR (60,200,230) on white, thickness = thickness_px",
  "true_arc_px": "radius_px * radians(sweep_deg) + thickness_px",
  "true_width_px": "58.5, the anti-aliased raster of a nominal 56 px stroke, measured radially -- not the nominal value"
 },
 "shape_gate": {
  "accepts_between": [
   2.85,
   9.85
  ],
  "5_19_is_not_a_cut": "the regulation's two floors imply 5.19 and the gate is built around it at 0.55x and 1.9x. A finger at 5.19 is mid-range. Putting the uncertainty at 5.19 puts it in the wrong place",
  "slenderness_reads_low_pct": [
   -3.2,
   1.0
  ],
  "measured_over": "17 shapes, true slenderness 2.6 to 44, arc and width both known",
  "uncertain_when_measured_in": {
   "refused_but_might_be_one_finger": [
    2.76,
    2.85
   ],
   "accepted_but_might_not_be": [
    9.54,
    9.85
   ]
  },
  "only_one_of_those_is_expensive": "a refusal near the stout bound costs a reshoot. An acceptance near the slender bound reports a length for two fingers merged end to end, or for a stalk taken into the mask, and nothing downstream can tell. Responses in that range carry send_to_a_person: true",
  "demonstrated": "a band of true slenderness 10.49, past the 9.86 ceiling, measures 9.83 and is accepted. Locked in scripts/test_produce_vision.py so a change to the gate has to face it"
 },
 "not_a_photograph": "this scores geometry, not fruit. It bounds the measurement algorithm; it does not bound segmentation of a real photo, which is what is_plausibly_one_finger exists to catch"
}