{
 "about": {
  "method": "antibody-dilution 1.1.0 (batch with Wave 1's overage and dead-volume rule)",
  "recordedOn": "2026-10-10",
  "script": "pipeline/lab-calculators/antibody_batch_reference.py",
  "scriptSha256": "16790604c9056e65fd739ffe40fd042990c3c2f57946eb49abcbb55b9a405277",
  "source": "docs/design/master-mix-increment.md (the allowance rule); calc.md C4 (the dilution); every case self-constructed",
  "tolerances": {
   "values": "within 1e-9 relative",
   "refusals": "exact"
  }
 },
 "oracle": {
  "name": "Python fractions and decimal",
  "version": "3.13.16"
 },
 "count": 10,
 "recordedOn": "2026-10-10",
 "cases": [
  {
   "name": "plate-24-wells-10-percent",
   "about": "0.5 mg/mL to 1 µg/mL, 0.2 mL in each of 24 wells, 10% overage: batch 5.28 mL, stock 10.56 µL",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 0.5,
     "unit": "mg/mL"
    },
    "target": {
     "value": 1,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 0.2,
     "unit": "mL"
    },
    "vessels": 24,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 10,
    "deadVolume": {
     "value": 0,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 24.0,
     "finalPerVessel": 0.0002,
     "finalVolume": 0.0048,
     "dilutionFactor": 500.0,
     "stockVolume": 1.056e-05,
     "diluentVolume": 0.00526944,
     "overageVolume": 0.00048,
     "deadVolume": 0.0,
     "batchVolume": 0.00528,
     "finalConcentration": 0.001
    }
   }
  },
  {
   "name": "dead-volume-only",
   "about": "The same with 0.5 mL of reservoir dead volume and no overage: batch 5.3 mL",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 0.5,
     "unit": "mg/mL"
    },
    "target": {
     "value": 1,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 0.2,
     "unit": "mL"
    },
    "vessels": 24,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 0,
    "deadVolume": {
     "value": 0.5,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 24.0,
     "finalPerVessel": 0.0002,
     "finalVolume": 0.0048,
     "dilutionFactor": 500.0,
     "stockVolume": 1.06e-05,
     "diluentVolume": 0.0052894,
     "overageVolume": 0.0,
     "deadVolume": 0.0005,
     "batchVolume": 0.0053,
     "finalConcentration": 0.001
    }
   }
  },
  {
   "name": "overage-and-dead-volume",
   "about": "10% overage and 500 µL dead volume, charged once each on the batch",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 0.5,
     "unit": "mg/mL"
    },
    "target": {
     "value": 1,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 0.2,
     "unit": "mL"
    },
    "vessels": 24,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 10,
    "deadVolume": {
     "value": 500,
     "unit": "µL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 24.0,
     "finalPerVessel": 0.0002,
     "finalVolume": 0.0048,
     "dilutionFactor": 500.0,
     "stockVolume": 1.156e-05,
     "diluentVolume": 0.00576844,
     "overageVolume": 0.00048,
     "deadVolume": 0.0005,
     "batchVolume": 0.00578,
     "finalConcentration": 0.001
    }
   }
  },
  {
   "name": "ratio-with-overage",
   "about": "1:1,000 for 12 slides of 0.5 mL with 15% overage",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "ratio",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": 1000,
    "volume": {
     "value": 0.5,
     "unit": "mL"
    },
    "vessels": 12,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 15,
    "deadVolume": {
     "value": 0,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 12.0,
     "finalPerVessel": 0.0005,
     "finalVolume": 0.006,
     "dilutionFactor": 1000.0,
     "stockVolume": 6.9e-06,
     "diluentVolume": 0.0068931,
     "overageVolume": 0.0009,
     "deadVolume": 0.0,
     "batchVolume": 0.0069,
     "finalConcentration": 0.001
    }
   }
  },
  {
   "name": "ratio-without-stock",
   "about": "1:500 with no stock concentration: volumes only",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "ratio",
    "stock": {
     "value": null,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": 500,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 5,
    "deadVolume": {
     "value": 0,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 1.0,
     "finalPerVessel": 0.01,
     "finalVolume": 0.01,
     "dilutionFactor": 500.0,
     "stockVolume": 2.1e-05,
     "diluentVolume": 0.010479,
     "overageVolume": 0.0005,
     "deadVolume": 0.0,
     "batchVolume": 0.0105
    }
   }
  },
  {
   "name": "calc-md-unchanged",
   "about": "calc.md C4 with no allowances: 20 µL, as antibody-dilution 1.0.0",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 0,
    "deadVolume": {
     "value": 0,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 1.0,
     "finalPerVessel": 0.01,
     "finalVolume": 0.01,
     "dilutionFactor": 500.0,
     "stockVolume": 2e-05,
     "diluentVolume": 0.00998,
     "finalConcentration": 0.002
    }
   }
  },
  {
   "name": "molar-with-dead-volume",
   "about": "6.7 µM to 10 nM, 1 mL in 8 tubes, 200 µL dead volume",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 6.7,
     "unit": "µM"
    },
    "target": {
     "value": 10,
     "unit": "nM"
    },
    "factor": null,
    "volume": {
     "value": 1,
     "unit": "mL"
    },
    "vessels": 8,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 0,
    "deadVolume": {
     "value": 200,
     "unit": "µL"
    }
   },
   "expected": {
    "expect": "ok",
    "rows": {
     "vessels": 8.0,
     "finalPerVessel": 0.001,
     "finalVolume": 0.008,
     "dilutionFactor": 670.0,
     "stockVolume": 1.2238805970149253e-05,
     "diluentVolume": 0.008187761194029851,
     "overageVolume": 0.0,
     "deadVolume": 0.0002,
     "batchVolume": 0.0082,
     "finalConcentration": 1e-08
    }
   }
  },
  {
   "name": "refused-negative-overage",
   "about": "An overage below zero",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": -5,
    "deadVolume": {
     "value": 0,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "refused",
    "problem": "overage"
   }
  },
  {
   "name": "refused-overage-above-1000",
   "about": "An overage above 1,000 percent",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 1500,
    "deadVolume": {
     "value": 0,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "refused",
    "problem": "overage"
   }
  },
  {
   "name": "refused-negative-dead-volume",
   "about": "A negative dead volume",
   "input": {
    "v": 1,
    "kind": "antibody",
    "mode": "concentration",
    "stock": {
     "value": 1,
     "unit": "mg/mL"
    },
    "target": {
     "value": 2,
     "unit": "µg/mL"
    },
    "factor": null,
    "volume": {
     "value": 10,
     "unit": "mL"
    },
    "vessels": 1,
    "minimumTransfer": null,
    "clone": "",
    "catalogue": "",
    "lot": "",
    "assay": "",
    "sourceNote": "",
    "intermediate": null,
    "overagePercent": 0,
    "deadVolume": {
     "value": -0.1,
     "unit": "mL"
    }
   },
   "expected": {
    "expect": "refused",
    "problem": "dead-volume"
   }
  }
 ]
}
