{
 "about": {
  "method": "plasmid-dna-amounts@1.0.0 (ligationInsertNg)",
  "recordedOn": "2026-10-21",
  "script": "pipeline/lab-calculators/ligation_reference.py",
  "scriptSha256": "57ca57d03a8f4b3b27b1d9e4014d465afee0ba554c20dad8ae746a30a55b6d24",
  "source": "The CSO's Stage D rulings of 21 October 2026, item 2, and the 20 October Plasmid ruling on the ratio; every value self-constructed",
  "limits": "Uses lengths, not weights; vector length is the backbone you add.",
  "ratioGuidance": "Enter the ratio your protocol uses; this app recommends none.",
  "tolerances": {
   "values": "within 1e-9 relative",
   "refusals": "exact"
  }
 },
 "oracle": {
  "name": "Python fractions",
  "version": "3.13.16"
 },
 "count": 23,
 "recordedOn": "2026-10-21",
 "cases": [
  {
   "name": "a05-typed",
   "about": "amounts.json A05 as typed: 50 ng of a 2,686 bp vector, 720 bp insert, ratio 3",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "3"
   },
   "expect": "ok",
   "expected": {
    "insertNg": 40.20848845867461,
    "insertNgExact": "40.208488459"
   }
  },
  {
   "name": "a07-typed",
   "about": "amounts.json A07 as typed: 50 ng of 4,361 bp, 1,000 bp insert, ratio 5",
   "input": {
    "vectorNg": "50",
    "vectorBp": "4361",
    "insertBp": "1000",
    "ratio": "5"
   },
   "expect": "ok",
   "expected": {
    "insertNg": 57.32630130703967,
    "insertNgExact": "57.326301307"
   }
  },
  {
   "name": "fractional-ratio",
   "about": "A ratio below one, 0.5, typed with a leading point",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": ".5"
   },
   "expect": "ok",
   "expected": {
    "insertNg": 6.7014147431124345,
    "insertNgExact": "6.701414743"
   }
  },
  {
   "name": "exponent-mass",
   "about": "A vector mass in exponent notation, 5e1 ng",
   "input": {
    "vectorNg": "5e1",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "3"
   },
   "expect": "ok",
   "expected": {
    "insertNg": 40.20848845867461,
    "insertNgExact": "40.208488459"
   }
  },
  {
   "name": "ratio-empty",
   "about": "The ratio field as it opens, empty: no result, not an error",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": ""
   },
   "expect": "blank",
   "problem": "ratio-empty"
  },
  {
   "name": "ratio-spaces",
   "about": "A ratio of spaces only reads as empty",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "   "
   },
   "expect": "blank",
   "problem": "ratio-empty"
  },
  {
   "name": "ratio-zero",
   "about": "A ratio of 0",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "0"
   },
   "expect": "refused",
   "problem": "ratio-range"
  },
  {
   "name": "ratio-negative",
   "about": "A negative ratio",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "-3"
   },
   "expect": "refused",
   "problem": "ratio-range"
  },
  {
   "name": "ratio-nan",
   "about": "NaN typed as the ratio",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "NaN"
   },
   "expect": "refused",
   "problem": "ratio-number"
  },
  {
   "name": "ratio-infinity",
   "about": "Infinity typed as the ratio",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "Infinity"
   },
   "expect": "refused",
   "problem": "ratio-number"
  },
  {
   "name": "ratio-infinity-symbol",
   "about": "The infinity symbol as the ratio",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "∞"
   },
   "expect": "refused",
   "problem": "ratio-number"
  },
  {
   "name": "ratio-decimal-comma",
   "about": "A decimal comma is not a number here",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "3,5"
   },
   "expect": "refused",
   "problem": "ratio-number"
  },
  {
   "name": "insert-over-cap",
   "about": "An insert of 50,001 bp",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "50001",
    "ratio": "3"
   },
   "expect": "refused",
   "problem": "insert-length"
  },
  {
   "name": "insert-at-cap",
   "about": "An insert of 50,000 bp, the cap",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "50000",
    "ratio": "3"
   },
   "expect": "ok",
   "expected": {
    "insertNg": 2792.2561429635143,
    "insertNgExact": "2792.256142964"
   }
  },
  {
   "name": "insert-non-integer",
   "about": "An insert length of 720.5 bp",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "720.5",
    "ratio": "3"
   },
   "expect": "refused",
   "problem": "insert-length"
  },
  {
   "name": "insert-zero",
   "about": "An insert length of 0",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "0",
    "ratio": "3"
   },
   "expect": "refused",
   "problem": "insert-length"
  },
  {
   "name": "vector-length-empty",
   "about": "No vector length: blank, not an error",
   "input": {
    "vectorNg": "50",
    "vectorBp": "",
    "insertBp": "720",
    "ratio": "3"
   },
   "expect": "blank",
   "problem": "vector-length-empty"
  },
  {
   "name": "vector-length-empty-with-plasmid",
   "about": "No vector length beside a 2,686 bp plasmid: blank, never computed from the plasmid's length",
   "input": {
    "vectorNg": "50",
    "vectorBp": "",
    "insertBp": "720",
    "ratio": "3",
    "plasmidBp": "2686"
   },
   "expect": "blank",
   "problem": "vector-length-empty"
  },
  {
   "name": "insert-length-empty",
   "about": "The cold open: no insert length yet, blank",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2686",
    "insertBp": "",
    "ratio": "3"
   },
   "expect": "blank",
   "problem": "insert-length-empty"
  },
  {
   "name": "vector-mass-empty",
   "about": "No vector mass, blank",
   "input": {
    "vectorNg": "",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "3"
   },
   "expect": "blank",
   "problem": "vector-mass-empty"
  },
  {
   "name": "vector-mass-zero",
   "about": "A vector mass of 0 ng",
   "input": {
    "vectorNg": "0",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "3"
   },
   "expect": "refused",
   "problem": "vector-mass"
  },
  {
   "name": "vector-mass-infinity",
   "about": "Infinity ng of vector",
   "input": {
    "vectorNg": "Infinity",
    "vectorBp": "2686",
    "insertBp": "720",
    "ratio": "3"
   },
   "expect": "refused",
   "problem": "vector-mass"
  },
  {
   "name": "backbone-not-plasmid",
   "about": "A 2,686 bp plasmid digested to a 2,600 bp backbone: the backbone length is used, not the plasmid's",
   "input": {
    "vectorNg": "50",
    "vectorBp": "2600",
    "insertBp": "720",
    "ratio": "3",
    "plasmidBp": "2686"
   },
   "expect": "ok",
   "expected": {
    "insertNg": 41.53846153846154,
    "insertNgExact": "41.538461538"
   }
  }
 ]
}
