{
 "about": {
  "method": "master-mix-preparation",
  "recordedOn": "2026-10-10",
  "script": "pipeline/lab-calculators/master_mix_reference.py",
  "scriptSha256": "205c29c09ba29a3a19e9467866ccf14465198997e5748f0a08bfa7553784c73c",
  "source": "Thermo Fisher MAN0025706 revision B pp. 12-13, read 10 October 2026, for the two reference compositions; every other case self-constructed",
  "tolerances": {
   "volumes": "within 1e-9 relative (nine significant figures)",
   "problems, line ids and warning operations": "exact"
  }
 },
 "oracle": {
  "name": "Python fractions and decimal",
  "version": "3.11.15"
 },
 "count": 14,
 "recordedOn": "2026-10-10",
 "cases": [
  {
   "name": "thermo-96-well-standard",
   "about": "MAN0025706 B pp. 12-13, 96-well standard plate: 10 + 1 + 7 uL mix, 2 uL template separate, 10% overage; 16 reactions (three samples and an NTC, four replicates each, the guide's recommendation)",
   "input": {
    "v": 1,
    "reactionCount": 16,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 10,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "TaqMan Fast Advanced Master Mix",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "TaqMan Assay",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "water",
      "name": "Nuclease-free water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     },
     {
      "id": "template",
      "name": "cDNA template or water (NTC)",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 2,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 18.0,
     "separatePerReaction": 2.0,
     "overage": 28.8,
     "dead": 0.0,
     "batch": 316.8,
     "minimumTransfer": null,
     "lines": [
      {
       "id": "master-mix",
       "addition": "mix",
       "perReaction": 10.0,
       "total": 176.0
      },
      {
       "id": "assay",
       "addition": "mix",
       "perReaction": 1.0,
       "total": 17.6
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 7.0,
       "total": 123.2
      },
      {
       "id": "template",
       "addition": "separate",
       "perReaction": 2.0,
       "total": 32.0
      }
     ],
     "warnings": []
    },
    "mixEquivalents": 17.6,
    "exact": {
     "batchMicrolitres": "1584/5",
     "mixEquivalents": "88/5"
    }
   }
  },
  {
   "name": "thermo-384-well-fast",
   "about": "MAN0025706 B pp. 12-13, 384-well or fast plate: 5.0 + 0.5 + 3.5 uL mix, 1.0 uL template separate, 10% overage; 4 reactions",
   "input": {
    "v": 1,
    "reactionCount": 4,
    "reactionVolume": {
     "value": 10,
     "unit": "µL"
    },
    "overagePercent": 10,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "TaqMan Fast Advanced Master Mix",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "TaqMan Assay",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "water",
      "name": "Nuclease-free water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     },
     {
      "id": "template",
      "name": "cDNA template or water (NTC)",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 1,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 9.0,
     "separatePerReaction": 1.0,
     "overage": 3.6,
     "dead": 0.0,
     "batch": 39.6,
     "minimumTransfer": null,
     "lines": [
      {
       "id": "master-mix",
       "addition": "mix",
       "perReaction": 5.0,
       "total": 22.0
      },
      {
       "id": "assay",
       "addition": "mix",
       "perReaction": 0.5,
       "total": 2.2
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 3.5,
       "total": 15.4
      },
      {
       "id": "template",
       "addition": "separate",
       "perReaction": 1.0,
       "total": 4.0
      }
     ],
     "warnings": []
    },
    "mixEquivalents": 4.4,
    "exact": {
     "batchMicrolitres": "198/5",
     "mixEquivalents": "22/5"
    }
   }
  },
  {
   "name": "thermo-96-well-with-dead-volume",
   "about": "The 96-well case with a user-entered 25 uL reservoir dead volume added after the overage (a user value, not a vendor figure)",
   "input": {
    "v": 1,
    "reactionCount": 16,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 10,
    "deadVolume": {
     "value": 25,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "TaqMan Fast Advanced Master Mix",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "TaqMan Assay",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "water",
      "name": "Nuclease-free water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     },
     {
      "id": "template",
      "name": "cDNA template or water (NTC)",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 2,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 18.0,
     "separatePerReaction": 2.0,
     "overage": 28.8,
     "dead": 25.0,
     "batch": 341.8,
     "minimumTransfer": null,
     "lines": [
      {
       "id": "master-mix",
       "addition": "mix",
       "perReaction": 10.0,
       "total": 189.88888888888889
      },
      {
       "id": "assay",
       "addition": "mix",
       "perReaction": 1.0,
       "total": 18.988888888888887
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 7.0,
       "total": 132.92222222222222
      },
      {
       "id": "template",
       "addition": "separate",
       "perReaction": 2.0,
       "total": 32.0
      }
     ],
     "warnings": []
    },
    "mixEquivalents": 18.988888888888887,
    "exact": {
     "batchMicrolitres": "1709/5",
     "mixEquivalents": "1709/90"
    }
   }
  },
  {
   "name": "no-extras",
   "about": "24 reactions, no overage and no dead volume: the batch is exactly 24 mixes",
   "input": {
    "v": 1,
    "reactionCount": 24,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "TaqMan Fast Advanced Master Mix",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "TaqMan Assay",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "water",
      "name": "Nuclease-free water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     },
     {
      "id": "template",
      "name": "cDNA template or water (NTC)",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 2,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 18.0,
     "separatePerReaction": 2.0,
     "overage": 0.0,
     "dead": 0.0,
     "batch": 432.0,
     "minimumTransfer": null,
     "lines": [
      {
       "id": "master-mix",
       "addition": "mix",
       "perReaction": 10.0,
       "total": 240.0
      },
      {
       "id": "assay",
       "addition": "mix",
       "perReaction": 1.0,
       "total": 24.0
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 7.0,
       "total": 168.0
      },
      {
       "id": "template",
       "addition": "separate",
       "perReaction": 2.0,
       "total": 48.0
      }
     ],
     "warnings": []
    },
    "mixEquivalents": 24.0,
    "exact": {
     "batchMicrolitres": "432/1",
     "mixEquivalents": "24/1"
    }
   }
  },
  {
   "name": "molar-primers-mixed-prefixes",
   "about": "Primers from 10 uM to 500 nM in 25 uL (1.25 uL each), one in mM and M; 2X reagent; 1 uL sample separate; 8 reactions, 10% overage, 12 uL user dead volume",
   "input": {
    "v": 1,
    "reactionCount": 8,
    "reactionVolume": {
     "value": 25,
     "unit": "µL"
    },
    "overagePercent": 10,
    "deadVolume": {
     "value": 12,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "reagent",
      "name": "2X reagent",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "forward",
      "name": "Forward primer",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 10,
        "unit": "µM"
       },
       "target": {
        "value": 500,
        "unit": "nM"
       }
      }
     },
     {
      "id": "reverse",
      "name": "Reverse primer",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 0.01,
        "unit": "mM"
       },
       "target": {
        "value": 5e-07,
        "unit": "M"
       }
      }
     },
     {
      "id": "sample",
      "name": "Sample",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 1,
        "unit": "µL"
       }
      }
     },
     {
      "id": "water",
      "name": "Water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 24.0,
     "separatePerReaction": 1.0,
     "overage": 19.2,
     "dead": 12.0,
     "batch": 223.2,
     "minimumTransfer": null,
     "lines": [
      {
       "id": "reagent",
       "addition": "mix",
       "perReaction": 12.5,
       "total": 116.25
      },
      {
       "id": "forward",
       "addition": "mix",
       "perReaction": 1.25,
       "total": 11.625
      },
      {
       "id": "reverse",
       "addition": "mix",
       "perReaction": 1.25,
       "total": 11.625
      },
      {
       "id": "sample",
       "addition": "separate",
       "perReaction": 1.0,
       "total": 8.0
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 9.0,
       "total": 83.7
      }
     ],
     "warnings": []
    },
    "mixEquivalents": 9.3,
    "exact": {
     "batchMicrolitres": "1116/5",
     "mixEquivalents": "93/10"
    }
   }
  },
  {
   "name": "mass-concentration-and-mL",
   "about": "A mass-concentration line (BSA 10 mg/mL to 100 ug/mL) in a 0.05 mL reaction, 3 reactions",
   "input": {
    "v": 1,
    "reactionCount": 3,
    "reactionVolume": {
     "value": 0.05,
     "unit": "mL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "bsa",
      "name": "BSA",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 10,
        "unit": "mg/mL"
       },
       "target": {
        "value": 100,
        "unit": "µg/mL"
       }
      }
     },
     {
      "id": "buffer",
      "name": "10X buffer",
      "addition": "mix",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 5,
        "unit": "µL"
       }
      }
     },
     {
      "id": "water",
      "name": "Water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 50.0,
     "separatePerReaction": 0.0,
     "overage": 0.0,
     "dead": 0.0,
     "batch": 150.0,
     "minimumTransfer": null,
     "lines": [
      {
       "id": "bsa",
       "addition": "mix",
       "perReaction": 0.5,
       "total": 1.5
      },
      {
       "id": "buffer",
       "addition": "mix",
       "perReaction": 5.0,
       "total": 15.0
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 44.5,
       "total": 133.5
      }
     ],
     "warnings": []
    },
    "mixEquivalents": 3.0,
    "exact": {
     "batchMicrolitres": "150/1",
     "mixEquivalents": "3/1"
    }
   }
  },
  {
   "name": "below-minimum-warnings",
   "about": "A 2 uL minimum transfer: the assay (1.1 uL) and dye (0.55 uL) batch additions and the 0.5 uL separate addition warn, the 11 uL master-mix addition does not; the plan is still given",
   "input": {
    "v": 1,
    "reactionCount": 2,
    "reactionVolume": {
     "value": 10,
     "unit": "µL"
    },
    "overagePercent": 10,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": {
     "value": 2,
     "unit": "µL"
    },
    "components": [
     {
      "id": "master-mix",
      "name": "2X master mix",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "20X assay",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "dye",
      "name": "40X dye",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 40,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "template",
      "name": "Template",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 0.5,
        "unit": "µL"
       }
      }
     },
     {
      "id": "water",
      "name": "Water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 9.5,
     "separatePerReaction": 0.5,
     "overage": 1.9,
     "dead": 0.0,
     "batch": 20.9,
     "minimumTransfer": 2.0,
     "lines": [
      {
       "id": "master-mix",
       "addition": "mix",
       "perReaction": 5.0,
       "total": 11.0
      },
      {
       "id": "assay",
       "addition": "mix",
       "perReaction": 0.5,
       "total": 1.1
      },
      {
       "id": "dye",
       "addition": "mix",
       "perReaction": 0.25,
       "total": 0.55
      },
      {
       "id": "template",
       "addition": "separate",
       "perReaction": 0.5,
       "total": 1.0
      },
      {
       "id": "water",
       "addition": "mix",
       "perReaction": 3.75,
       "total": 8.25
      }
     ],
     "warnings": [
      {
       "operation": "batch-addition",
       "lineId": "assay",
       "volume": 1.1
      },
      {
       "operation": "batch-addition",
       "lineId": "dye",
       "volume": 0.55
      },
      {
       "operation": "separate-addition",
       "lineId": "template",
       "volume": 0.5
      }
     ]
    },
    "mixEquivalents": 2.2,
    "exact": {
     "batchMicrolitres": "209/10",
     "mixEquivalents": "11/5"
    }
   }
  },
  {
   "name": "mix-dispense-below-minimum",
   "about": "A 1 uL shared mix per reaction below a 2 uL minimum warns on the dispense itself",
   "input": {
    "v": 1,
    "reactionCount": 10,
    "reactionVolume": {
     "value": 5,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": {
     "value": 2,
     "unit": "µL"
    },
    "components": [
     {
      "id": "enzyme",
      "name": "5X enzyme",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 5,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "sample",
      "name": "Sample",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 4,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": true,
    "microlitres": {
     "mixPerReaction": 1.0,
     "separatePerReaction": 4.0,
     "overage": 0.0,
     "dead": 0.0,
     "batch": 10.0,
     "minimumTransfer": 2.0,
     "lines": [
      {
       "id": "enzyme",
       "addition": "mix",
       "perReaction": 1.0,
       "total": 10.0
      },
      {
       "id": "sample",
       "addition": "separate",
       "perReaction": 4.0,
       "total": 40.0
      }
     ],
     "warnings": [
      {
       "operation": "mix-dispense",
       "volume": 1.0
      }
     ]
    },
    "mixEquivalents": 10.0,
    "exact": {
     "batchMicrolitres": "10/1",
     "mixEquivalents": "10/1"
    }
   }
  },
  {
   "name": "refused-exceeds-volume",
   "about": "Additions of 10 + 1 + 10 uL exceed a 20 uL reaction",
   "input": {
    "v": 1,
    "reactionCount": 4,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "2X",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "20X",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "template",
      "name": "Template",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 10,
        "unit": "µL"
       }
      }
     },
     {
      "id": "water",
      "name": "Water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     }
    ]
   },
   "expected": {
    "ok": false,
    "problem": "exceeds-volume"
   }
  },
  {
   "name": "refused-unfilled-volume",
   "about": "Additions of 10 + 1 + 2 uL leave 7 uL unfilled with no diluent named",
   "input": {
    "v": 1,
    "reactionCount": 4,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "2X",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "20X",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "template",
      "name": "Template",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 2,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": false,
    "problem": "unfilled-volume"
   }
  },
  {
   "name": "refused-incompatible-units",
   "about": "A molar stock with a mass-concentration target is never converted (no molecular weight is inferred)",
   "input": {
    "v": 1,
    "reactionCount": 4,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "primer",
      "name": "Primer",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 10,
        "unit": "µM"
       },
       "target": {
        "value": 50,
        "unit": "ng/µL"
       }
      }
     },
     {
      "id": "water",
      "name": "Water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     }
    ]
   },
   "expected": {
    "ok": false,
    "problem": "incompatible-units",
    "lineId": "primer"
   }
  },
  {
   "name": "refused-two-diluents",
   "about": "Two balancing diluents are ambiguous",
   "input": {
    "v": 1,
    "reactionCount": 4,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "2X",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "water",
      "name": "Water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     },
     {
      "id": "buffer",
      "name": "Buffer",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     }
    ]
   },
   "expected": {
    "ok": false,
    "problem": "multiple-diluents"
   }
  },
  {
   "name": "refused-empty-mix",
   "about": "Every addition separate: there is no shared mix to prepare",
   "input": {
    "v": 1,
    "reactionCount": 4,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "a",
      "name": "A",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 10,
        "unit": "µL"
       }
      }
     },
     {
      "id": "b",
      "name": "B",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 10,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": false,
    "problem": "empty-mix"
   }
  },
  {
   "name": "refused-fractional-count",
   "about": "A count of 2.5 reactions is not a count",
   "input": {
    "v": 1,
    "reactionCount": 2.5,
    "reactionVolume": {
     "value": 20,
     "unit": "µL"
    },
    "overagePercent": 10,
    "deadVolume": {
     "value": 0,
     "unit": "µL"
    },
    "minimumTransfer": null,
    "components": [
     {
      "id": "master-mix",
      "name": "TaqMan Fast Advanced Master Mix",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 2,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "assay",
      "name": "TaqMan Assay",
      "addition": "mix",
      "input": {
       "mode": "concentration",
       "stock": {
        "value": 20,
        "unit": "×"
       },
       "target": {
        "value": 1,
        "unit": "×"
       }
      }
     },
     {
      "id": "water",
      "name": "Nuclease-free water",
      "addition": "mix",
      "input": {
       "mode": "diluent"
      }
     },
     {
      "id": "template",
      "name": "cDNA template or water (NTC)",
      "addition": "separate",
      "input": {
       "mode": "volume",
       "volume": {
        "value": 2,
        "unit": "µL"
       }
      }
     }
    ]
   },
   "expected": {
    "ok": false,
    "problem": "reaction-count"
   }
  }
 ]
}
