{
 "about": {
  "method": "a280-beer-lambert",
  "recordedOn": "2026-10-17",
  "script": "pipeline/lab-calculators/a280_reference.py",
  "scriptSha256": "999a2d942ee0c2487e9dd013277be9693dcafdec467324db9d6e19b7489661a7",
  "source": "The CSO's ruling of 17 October 2026 on SCI-149 (docs/board/memos/2026-10-17-cso-a280-ratio-refusals.md): the cases and the order of the refusals; ε280 and the molar mass are inputs, so the set is independent of the ε280 engine (checked by extinction.json)",
  "tolerances": {
   "values": "within 1e-9 relative",
   "refusals": "exact, by problem code"
  }
 },
 "oracle": {
  "name": "Python fractions and decimal",
  "version": "3.13.16"
 },
 "count": 14,
 "recordedOn": "2026-10-17",
 "cases": [
  {
   "name": "unit-test-example",
   "about": "The unit tests' example (the insulin precursor's reduced ε280 and mass, as inputs): 0.5 AU, ε 16960, 1 cm, 11980.91 g/mol gives 29.48 µM and 0.3532 mg/mL. A worked example, not a claim about a protein",
   "input": {
    "a280": "0.5",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "ok",
    "molar": 2.94811320754717e-05,
    "micromolar": 29.4811320754717,
    "massConcentration": 0.35321079009433964,
    "exact": {
     "molar": "1/33920",
     "massConcentration": "1198091/3392000"
    }
   }
  },
  {
   "name": "unit-test-example-half-cm",
   "about": "The same reading in a 0.5 cm path doubles the concentration",
   "input": {
    "a280": "0.5",
    "extinction": 16960,
    "pathLengthCm": "0.5",
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "ok",
    "molar": 5.89622641509434e-05,
    "micromolar": 58.9622641509434,
    "massConcentration": 0.7064215801886793,
    "exact": {
     "molar": "1/16960",
     "massConcentration": "1198091/1696000"
    }
   }
  },
  {
   "name": "synthetic",
   "about": "A synthetic case: 1.234 AU, ε 55000, 0.1 cm, 50000 g/mol",
   "input": {
    "a280": "1.234",
    "extinction": 55000,
    "pathLengthCm": "0.1",
    "molarMass": 50000
   },
   "expected": {
    "expect": "ok",
    "molar": 0.00022436363636363637,
    "micromolar": 224.36363636363637,
    "massConcentration": 11.218181818181819,
    "exact": {
     "molar": "617/2750000",
     "massConcentration": "617/55"
    }
   }
  },
  {
   "name": "smallest-accepted",
   "about": "The smallest reading the field accepts, 0.0001 AU, is not refused",
   "input": {
    "a280": "0.0001",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "ok",
    "molar": 5.896226415094339e-09,
    "micromolar": 0.00589622641509434,
    "massConcentration": 7.064215801886792e-05,
    "exact": {
     "molar": "1/169600000",
     "massConcentration": "1198091/16960000000"
    }
   }
  },
  {
   "name": "refused-reading-zero",
   "about": "A reading at the blank means not detected",
   "input": {
    "a280": 0,
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-positive"
   }
  },
  {
   "name": "refused-reading-negative",
   "about": "A reading below the blank is noise, not a concentration",
   "input": {
    "a280": "-0.01",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-positive"
   }
  },
  {
   "name": "refused-reading-nan",
   "about": "A reading that is not a number",
   "input": {
    "a280": "NaN",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-finite"
   }
  },
  {
   "name": "refused-reading-infinity",
   "about": "An infinite reading",
   "input": {
    "a280": "Infinity",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-finite"
   }
  },
  {
   "name": "refused-reading-minus-infinity",
   "about": "A negative infinite reading",
   "input": {
    "a280": "-Infinity",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "reading-not-finite"
   }
  },
  {
   "name": "refused-path-zero",
   "about": "A path length of zero",
   "input": {
    "a280": "0.5",
    "extinction": 16960,
    "pathLengthCm": 0,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "path-not-positive"
   }
  },
  {
   "name": "refused-path-infinity",
   "about": "An infinite path length is not a path",
   "input": {
    "a280": "0.5",
    "extinction": 16960,
    "pathLengthCm": "Infinity",
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "path-not-positive"
   }
  },
  {
   "name": "refused-extinction-zero",
   "about": "ε280 of zero (no tryptophan or tyrosine): no reading gives a concentration",
   "input": {
    "a280": "0.5",
    "extinction": 0,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "extinction-not-positive"
   }
  },
  {
   "name": "refused-molar-mass-zero",
   "about": "A molar mass of zero",
   "input": {
    "a280": "0.5",
    "extinction": 16960,
    "pathLengthCm": 1,
    "molarMass": 0
   },
   "expected": {
    "expect": "refused",
    "problem": "molar-mass-not-positive"
   }
  },
  {
   "name": "refused-order-extinction-first",
   "about": "ε280 of zero and a negative reading: the sequence's reason comes first",
   "input": {
    "a280": "-0.1",
    "extinction": 0,
    "pathLengthCm": 1,
    "molarMass": "11980.91"
   },
   "expected": {
    "expect": "refused",
    "problem": "extinction-not-positive"
   }
  }
 ]
}
