{
  "about": {
    "title": "Primer-design v2 retained qualification contract proposal",
    "recordedOn": "2026-10-11",
    "oracle": "Biopython",
    "oracleVersion": "1.88",
    "scriptSha256": "379a69993c91f4183772571403223d4290d33b23b3358142ec0fd1e822a2b591",
    "sourceFixture": {
      "path": "public/verification/sequence-toolkit/0.5.0/primer-design.json",
      "sha256": "ce1239c060a57c39399d12362e625221081484a761e367c48bf60cd69983c6ec",
      "method": "bounded-flanks-v1"
    },
    "method": "bounded-flanks-v2",
    "tmTolerance_C": 1e-06,
    "rankingTolerance": 1e-06,
    "gcTolerance": 1e-09,
    "boundary": "Computational agreement and declared disclosure policy only. No experimental accuracy, amplification, fitted-range validation or genome-specificity claim.",
    "independence": "No TypeScript is executed/imported. Existing immutable Python-derived v1 fixture supplies unchanged candidate/count/product/ranking expectations; every retained temperature is independently recalculated by Biopython. Display policy is manually transcribed, not experimentally validated.",
    "recordScope": "Reader examples are hand-authored structural records with declared dispositions, not secondary-structure or design-engine outputs. Consistency checks must not rerun Tm or inject missing historical metadata.",
    "integration": "Publish in a new unused fixture version before changing readers. Preserve immutable v1 file and its existing tight numerical assertions. For v1 compatibility assert pinned old method and current v2 separately; do not weaken method matching to arbitrary union.",
    "numericalTemperaturesChecked": 62
  },
  "declarationPolicy": {
    "measuredMonovalentRange_mM": [
      69,
      1020
    ],
    "monovalentNoExtraWarningRange_mM": [
      20,
      1020
    ],
    "recalledUnverifiedFreeMagnesiumRange_mM": [
      0.5,
      600
    ],
    "limitText": {
      "owczarzy-2004": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
      "owczarzy-2008": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
      "santalucia-1998": "Entropy correction: SantaLucia 1998. Its fitted range has not yet been read against the paper."
    }
  },
  "designCases": [
    {
      "id": "design-hand-unique",
      "input": {
        "templateName": "hand-24",
        "template": "ATGACCTAGCTATTCGCTAGTCAC",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 9,
            "end": 16
          },
          "excluded": [],
          "forwardTail": "AA",
          "reverseTail": "CG",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 0,
          "minLength": 8,
          "maxLength": 8,
          "targetLength": 8,
          "minTm": 0,
          "maxTm": 100,
          "targetTm": 40,
          "maxDeltaTm": 30,
          "minGc": 0,
          "maxGc": 100,
          "minProduct": 24,
          "maxProduct": 30
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "2e921837395a2a3194a559cbbef1cea25f272da48e86448e889d2a93ada8e2bc",
        "topology": "linear",
        "templateLength": 24,
        "pairs": [
          {
            "id": "+:1:8|-:24:17",
            "forward": {
              "annealing": "ATGACCTA",
              "tail": "AA",
              "start": 1,
              "end": 8,
              "tm": 8.925696836801308,
              "gc": 37.5,
              "penalty": 31.074303163198692,
              "tmReview": {
                "value": 8.925696836801308,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GTGACTAG",
              "tail": "CG",
              "start": 24,
              "end": 17,
              "tm": 12.24154515770067,
              "gc": 50.0,
              "penalty": 27.75845484229933,
              "tmReview": {
                "value": 12.24154515770067,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:1:8|-:24:17",
              "sequence": "AAATGACCTAGCTATTCGCTAGTCACCG",
              "length": 28,
              "templateLength": 24,
              "templateSpan": 24,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 1,
                "end": 8,
                "length": 8
              },
              "reverse": {
                "strand": "-",
                "start": 24,
                "end": 17,
                "length": 8
              }
            },
            "ranking": {
              "tmDeviation": 58.83275800549802,
              "lengthDeviation": 0.0,
              "deltaTm": 3.315848320899363,
              "total": 62.148606326397385
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 2,
          "boundary": 0,
          "excluded": 0,
          "gc": 0,
          "tm": 0,
          "validForward": 1,
          "validReverse": 1,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 1,
          "exactChecked": 1,
          "exactRefused": 0
        },
        "capped": false
      }
    },
    {
      "id": "design-lac-linear",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 50,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 59.95,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 180,
          "maxProduct": 420
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [
          {
            "id": "+:158:177|-:428:409",
            "forward": {
              "annealing": "CCAGCCACGTTTCTGCGAAA",
              "tail": "",
              "start": 158,
              "end": 177,
              "tm": 59.99861335790035,
              "gc": 55.0,
              "penalty": 0.04861335790035071,
              "tmReview": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:158:177|-:428:409",
              "sequence": "CCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCA",
              "length": 271,
              "templateLength": 600,
              "templateSpan": 271,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 158,
                "end": 177,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:158:178|-:428:409",
            "forward": {
              "annealing": "CCAGCCACGTTTCTGCGAAAA",
              "tail": "",
              "start": 158,
              "end": 178,
              "tm": 59.93537222125224,
              "gc": 52.38095238095238,
              "penalty": 0.21462777874776579,
              "tmReview": {
                "value": 59.93537222125224,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:158:178|-:428:409",
              "sequence": "CCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCA",
              "length": 271,
              "templateLength": 600,
              "templateSpan": 271,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 158,
                "end": 178,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.03063762466058506,
              "lengthDeviation": 0.2,
              "deltaTm": 0.03063762466058506,
              "total": 0.26127524932117013
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:178:197|-:428:409",
            "forward": {
              "annealing": "ACGCGGGAAAAAGTGGAAGC",
              "tail": "",
              "start": 178,
              "end": 197,
              "tm": 60.09860053729648,
              "gc": 55.0,
              "penalty": 0.14860053729647404,
              "tmReview": {
                "value": 60.09860053729648,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:178:197|-:428:409",
              "sequence": "ACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCA",
              "length": 251,
              "templateLength": 600,
              "templateSpan": 251,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 178,
                "end": 197,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.16461038320929333,
              "lengthDeviation": 0.0,
              "deltaTm": 0.13259069138365476,
              "total": 0.2972010745929481
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:177:197|-:428:409",
            "forward": {
              "annealing": "AACGCGGGAAAAAGTGGAAGC",
              "tail": "",
              "start": 177,
              "end": 197,
              "tm": 60.03263800822515,
              "gc": 52.38095238095238,
              "penalty": 0.2826380082251461,
              "tmReview": {
                "value": 60.03263800822515,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:177:197|-:428:409",
              "sequence": "AACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCA",
              "length": 252,
              "templateLength": 600,
              "templateSpan": 252,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 177,
                "end": 197,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.0986478541379654,
              "lengthDeviation": 0.2,
              "deltaTm": 0.06662816231232682,
              "total": 0.36527601645029223
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:158:177|-:422:404",
            "forward": {
              "annealing": "CCAGCCACGTTTCTGCGAAA",
              "tail": "",
              "start": 158,
              "end": 177,
              "tm": 59.99861335790035,
              "gc": 55.0,
              "penalty": 0.04861335790035071,
              "tmReview": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGAAGATTGTGCACCGCCG",
              "tail": "",
              "start": 422,
              "end": 404,
              "tm": 59.914723905422534,
              "gc": 57.89473684210526,
              "penalty": 0.23527609457746906,
              "tmReview": {
                "value": 59.914723905422534,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:158:177|-:422:404",
              "sequence": "CCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCT",
              "length": 265,
              "templateLength": 600,
              "templateSpan": 265,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 158,
                "end": 177,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 422,
                "end": 404,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.08388945247781976,
              "lengthDeviation": 0.2,
              "deltaTm": 0.08388945247781976,
              "total": 0.36777890495563953
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 918,
          "boundary": 0,
          "excluded": 0,
          "gc": 40,
          "tm": 234,
          "validForward": 353,
          "validReverse": 291,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 576,
          "exactChecked": 5,
          "exactRefused": 0
        },
        "capped": true
      }
    },
    {
      "id": "design-lac-excluded",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [
            {
              "start": 120,
              "end": 170
            },
            {
              "start": 420,
              "end": 470
            }
          ],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 50,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 62.0,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 180,
          "maxProduct": 420
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [
          {
            "id": "+:172:194|-:419:401",
            "forward": {
              "annealing": "GCGAAAACGCGGGAAAAAGTGGA",
              "tail": "",
              "start": 172,
              "end": 194,
              "tm": 62.14537329359223,
              "gc": 52.17391304347826,
              "penalty": 0.745373293592229,
              "tmReview": {
                "value": 62.14537329359223,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGATTGTGCACCGCCGCTT",
              "tail": "",
              "start": 419,
              "end": 401,
              "tm": 62.113664810140506,
              "gc": 57.89473684210526,
              "penalty": 0.3136648101405058,
              "tmReview": {
                "value": 62.113664810140506,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:172:194|-:419:401",
              "sequence": "GCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCT",
              "length": 248,
              "templateLength": 600,
              "templateSpan": 248,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 172,
                "end": 194,
                "length": 23
              },
              "reverse": {
                "strand": "-",
                "start": 419,
                "end": 401,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.2590381037327347,
              "lengthDeviation": 0.8,
              "deltaTm": 0.03170848345172317,
              "total": 1.090746587184458
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:176:198|-:419:401",
            "forward": {
              "annealing": "AAACGCGGGAAAAAGTGGAAGCG",
              "tail": "",
              "start": 176,
              "end": 198,
              "tm": 62.18249482665317,
              "gc": 52.17391304347826,
              "penalty": 0.7824948266531693,
              "tmReview": {
                "value": 62.18249482665317,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGATTGTGCACCGCCGCTT",
              "tail": "",
              "start": 419,
              "end": 401,
              "tm": 62.113664810140506,
              "gc": 57.89473684210526,
              "penalty": 0.3136648101405058,
              "tmReview": {
                "value": 62.113664810140506,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:176:198|-:419:401",
              "sequence": "AAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCT",
              "length": 244,
              "templateLength": 600,
              "templateSpan": 244,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 176,
                "end": 198,
                "length": 23
              },
              "reverse": {
                "strand": "-",
                "start": 419,
                "end": 401,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.29615963679367496,
              "lengthDeviation": 0.8,
              "deltaTm": 0.0688300165126634,
              "total": 1.1649896533063384
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:175:198|-:419:401",
            "forward": {
              "annealing": "AAAACGCGGGAAAAAGTGGAAGCG",
              "tail": "",
              "start": 175,
              "end": 198,
              "tm": 62.03527481139599,
              "gc": 50.0,
              "penalty": 0.8352748113959934,
              "tmReview": {
                "value": 62.03527481139599,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGATTGTGCACCGCCGCTT",
              "tail": "",
              "start": 419,
              "end": 401,
              "tm": 62.113664810140506,
              "gc": 57.89473684210526,
              "penalty": 0.3136648101405058,
              "tmReview": {
                "value": 62.113664810140506,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:175:198|-:419:401",
              "sequence": "AAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCT",
              "length": 245,
              "templateLength": 600,
              "templateSpan": 245,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 175,
                "end": 198,
                "length": 24
              },
              "reverse": {
                "strand": "-",
                "start": 419,
                "end": 401,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.1489396215364991,
              "lengthDeviation": 1.0,
              "deltaTm": 0.07838999874451247,
              "total": 1.2273296202810116
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:172:195|-:419:401",
            "forward": {
              "annealing": "GCGAAAACGCGGGAAAAAGTGGAA",
              "tail": "",
              "start": 172,
              "end": 195,
              "tm": 61.99935292676395,
              "gc": 50.0,
              "penalty": 0.8006470732360527,
              "tmReview": {
                "value": 61.99935292676395,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGATTGTGCACCGCCGCTT",
              "tail": "",
              "start": 419,
              "end": 401,
              "tm": 62.113664810140506,
              "gc": 57.89473684210526,
              "penalty": 0.3136648101405058,
              "tmReview": {
                "value": 62.113664810140506,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:172:195|-:419:401",
              "sequence": "GCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCT",
              "length": 248,
              "templateLength": 600,
              "templateSpan": 248,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 172,
                "end": 195,
                "length": 24
              },
              "reverse": {
                "strand": "-",
                "start": 419,
                "end": 401,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.1143118833765584,
              "lengthDeviation": 1.0,
              "deltaTm": 0.1143118833765584,
              "total": 1.2286237667531168
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:177:198|-:419:401",
            "forward": {
              "annealing": "AACGCGGGAAAAAGTGGAAGCG",
              "tail": "",
              "start": 177,
              "end": 198,
              "tm": 62.34357931563284,
              "gc": 54.54545454545455,
              "penalty": 0.7435793156328373,
              "tmReview": {
                "value": 62.34357931563284,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGATTGTGCACCGCCGCTT",
              "tail": "",
              "start": 419,
              "end": 401,
              "tm": 62.113664810140506,
              "gc": 57.89473684210526,
              "penalty": 0.3136648101405058,
              "tmReview": {
                "value": 62.113664810140506,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:177:198|-:419:401",
              "sequence": "AACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCT",
              "length": 243,
              "templateLength": 600,
              "templateSpan": 243,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 177,
                "end": 198,
                "length": 22
              },
              "reverse": {
                "strand": "-",
                "start": 419,
                "end": 401,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.45724412577334306,
              "lengthDeviation": 0.6000000000000001,
              "deltaTm": 0.2299145054923315,
              "total": 1.2871586312656746
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 918,
          "boundary": 0,
          "excluded": 834,
          "gc": 0,
          "tm": 6,
          "validForward": 75,
          "validReverse": 3,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 72,
          "exactChecked": 5,
          "exactRefused": 0
        },
        "capped": true
      }
    },
    {
      "id": "design-lac-tails",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [],
          "forwardTail": "GCGAATTC",
          "reverseTail": "GCAAGCTT",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 50,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 59.95,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 190,
          "maxProduct": 440
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [
          {
            "id": "+:158:177|-:428:409",
            "forward": {
              "annealing": "CCAGCCACGTTTCTGCGAAA",
              "tail": "GCGAATTC",
              "start": 158,
              "end": 177,
              "tm": 59.99861335790035,
              "gc": 55.0,
              "penalty": 0.04861335790035071,
              "tmReview": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "GCAAGCTT",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:158:177|-:428:409",
              "sequence": "GCGAATTCCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAAAGCTTGC",
              "length": 287,
              "templateLength": 600,
              "templateSpan": 271,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 158,
                "end": 177,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:158:178|-:428:409",
            "forward": {
              "annealing": "CCAGCCACGTTTCTGCGAAAA",
              "tail": "GCGAATTC",
              "start": 158,
              "end": 178,
              "tm": 59.93537222125224,
              "gc": 52.38095238095238,
              "penalty": 0.21462777874776579,
              "tmReview": {
                "value": 59.93537222125224,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "GCAAGCTT",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:158:178|-:428:409",
              "sequence": "GCGAATTCCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAAAGCTTGC",
              "length": 287,
              "templateLength": 600,
              "templateSpan": 271,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 158,
                "end": 178,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.03063762466058506,
              "lengthDeviation": 0.2,
              "deltaTm": 0.03063762466058506,
              "total": 0.26127524932117013
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:178:197|-:428:409",
            "forward": {
              "annealing": "ACGCGGGAAAAAGTGGAAGC",
              "tail": "GCGAATTC",
              "start": 178,
              "end": 197,
              "tm": 60.09860053729648,
              "gc": 55.0,
              "penalty": 0.14860053729647404,
              "tmReview": {
                "value": 60.09860053729648,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "GCAAGCTT",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:178:197|-:428:409",
              "sequence": "GCGAATTCACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAAAGCTTGC",
              "length": 267,
              "templateLength": 600,
              "templateSpan": 251,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 178,
                "end": 197,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.16461038320929333,
              "lengthDeviation": 0.0,
              "deltaTm": 0.13259069138365476,
              "total": 0.2972010745929481
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:177:197|-:428:409",
            "forward": {
              "annealing": "AACGCGGGAAAAAGTGGAAGC",
              "tail": "GCGAATTC",
              "start": 177,
              "end": 197,
              "tm": 60.03263800822515,
              "gc": 52.38095238095238,
              "penalty": 0.2826380082251461,
              "tmReview": {
                "value": 60.03263800822515,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "TGCGCGAGAAGATTGTGCAC",
              "tail": "GCAAGCTT",
              "start": 428,
              "end": 409,
              "tm": 59.96600984591282,
              "gc": 55.0,
              "penalty": 0.016009845912819287,
              "tmReview": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:177:197|-:428:409",
              "sequence": "GCGAATTCAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAAAGCTTGC",
              "length": 268,
              "templateLength": 600,
              "templateSpan": 252,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 177,
                "end": 197,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 428,
                "end": 409,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.0986478541379654,
              "lengthDeviation": 0.2,
              "deltaTm": 0.06662816231232682,
              "total": 0.36527601645029223
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:158:177|-:422:404",
            "forward": {
              "annealing": "CCAGCCACGTTTCTGCGAAA",
              "tail": "GCGAATTC",
              "start": 158,
              "end": 177,
              "tm": 59.99861335790035,
              "gc": 55.0,
              "penalty": 0.04861335790035071,
              "tmReview": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGAAGATTGTGCACCGCCG",
              "tail": "GCAAGCTT",
              "start": 422,
              "end": 404,
              "tm": 59.914723905422534,
              "gc": 57.89473684210526,
              "penalty": 0.23527609457746906,
              "tmReview": {
                "value": 59.914723905422534,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:158:177|-:422:404",
              "sequence": "GCGAATTCCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTAAGCTTGC",
              "length": 281,
              "templateLength": 600,
              "templateSpan": 265,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 158,
                "end": 177,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 422,
                "end": 404,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.08388945247781976,
              "lengthDeviation": 0.2,
              "deltaTm": 0.08388945247781976,
              "total": 0.36777890495563953
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 918,
          "boundary": 0,
          "excluded": 0,
          "gc": 40,
          "tm": 234,
          "validForward": 353,
          "validReverse": 291,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 576,
          "exactChecked": 5,
          "exactRefused": 0
        },
        "capped": true
      }
    },
    {
      "id": "design-lac-mg",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 1.5,
            "dntp_mM": 0.2,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2008"
          },
          "flank": 50,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 60.95,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 180,
          "maxProduct": 420
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [
          {
            "id": "+:176:193|-:469:450",
            "forward": {
              "annealing": "AAACGCGGGAAAAAGTGG",
              "tail": "",
              "start": 176,
              "end": 193,
              "tm": 61.15758568510165,
              "gc": 50.0,
              "penalty": 0.6075856851016482,
              "tmReview": {
                "value": 61.15758568510165,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GGTCATCCAGCGGATAGTTA",
              "tail": "",
              "start": 469,
              "end": 450,
              "tm": 61.11705567100347,
              "gc": 50.0,
              "penalty": 0.1670556710034674,
              "tmReview": {
                "value": 61.11705567100347,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "product": {
              "id": "+:176:193|-:469:450",
              "sequence": "AAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACC",
              "length": 294,
              "templateLength": 600,
              "templateSpan": 294,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 176,
                "end": 193,
                "length": 18
              },
              "reverse": {
                "strand": "-",
                "start": 469,
                "end": 450,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.3746413561051156,
              "lengthDeviation": 0.4,
              "deltaTm": 0.0405300140981808,
              "total": 0.8151713702032964
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:176:193|-:454:434",
            "forward": {
              "annealing": "AAACGCGGGAAAAAGTGG",
              "tail": "",
              "start": 176,
              "end": 193,
              "tm": 61.15758568510165,
              "gc": 50.0,
              "penalty": 0.6075856851016482,
              "tmReview": {
                "value": 61.15758568510165,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "AGTTAATGATCAGCCCACTGA",
              "tail": "",
              "start": 454,
              "end": 434,
              "tm": 60.991115029483694,
              "gc": 42.857142857142854,
              "penalty": 0.2411150294836915,
              "tmReview": {
                "value": 60.991115029483694,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "product": {
              "id": "+:176:193|-:454:434",
              "sequence": "AAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACT",
              "length": 279,
              "templateLength": 600,
              "templateSpan": 279,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 176,
                "end": 193,
                "length": 18
              },
              "reverse": {
                "strand": "-",
                "start": 454,
                "end": 434,
                "length": 21
              }
            },
            "ranking": {
              "tmDeviation": 0.2487007145853397,
              "lengthDeviation": 0.6000000000000001,
              "deltaTm": 0.1664706556179567,
              "total": 1.0151713702032965
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:182:199|-:469:450",
            "forward": {
              "annealing": "GGGAAAAAGTGGAAGCGG",
              "tail": "",
              "start": 182,
              "end": 199,
              "tm": 61.293900774555254,
              "gc": 55.55555555555556,
              "penalty": 0.7439007745552516,
              "tmReview": {
                "value": 61.293900774555254,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GGTCATCCAGCGGATAGTTA",
              "tail": "",
              "start": 469,
              "end": 450,
              "tm": 61.11705567100347,
              "gc": 50.0,
              "penalty": 0.1670556710034674,
              "tmReview": {
                "value": 61.11705567100347,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "product": {
              "id": "+:182:199|-:469:450",
              "sequence": "GGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACC",
              "length": 288,
              "templateLength": 600,
              "templateSpan": 288,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 182,
                "end": 199,
                "length": 18
              },
              "reverse": {
                "strand": "-",
                "start": 469,
                "end": 450,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.510956445558719,
              "lengthDeviation": 0.4,
              "deltaTm": 0.17684510355178418,
              "total": 1.087801549110503
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:161:178|-:469:450",
            "forward": {
              "annealing": "GCCACGTTTCTGCGAAAA",
              "tail": "",
              "start": 161,
              "end": 178,
              "tm": 61.3660651215726,
              "gc": 50.0,
              "penalty": 0.8160651215726006,
              "tmReview": {
                "value": 61.3660651215726,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GGTCATCCAGCGGATAGTTA",
              "tail": "",
              "start": 469,
              "end": 450,
              "tm": 61.11705567100347,
              "gc": 50.0,
              "penalty": 0.1670556710034674,
              "tmReview": {
                "value": 61.11705567100347,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "product": {
              "id": "+:161:178|-:469:450",
              "sequence": "GCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACC",
              "length": 309,
              "templateLength": 600,
              "templateSpan": 309,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 161,
                "end": 178,
                "length": 18
              },
              "reverse": {
                "strand": "-",
                "start": 469,
                "end": 450,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.583120792576068,
              "lengthDeviation": 0.4,
              "deltaTm": 0.24900945056913315,
              "total": 1.232130243145201
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:176:193|-:453:433",
            "forward": {
              "annealing": "AAACGCGGGAAAAAGTGG",
              "tail": "",
              "start": 176,
              "end": 193,
              "tm": 61.15758568510165,
              "gc": 50.0,
              "penalty": 0.6075856851016482,
              "tmReview": {
                "value": 61.15758568510165,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GTTAATGATCAGCCCACTGAC",
              "tail": "",
              "start": 453,
              "end": 433,
              "tm": 60.81993868631338,
              "gc": 47.61904761904762,
              "penalty": 0.33006131368662467,
              "tmReview": {
                "value": 60.81993868631338,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2008",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 1.5,
                  "dntp_mM": 0.2,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2008"
                },
                "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
                "outside": []
              }
            },
            "product": {
              "id": "+:176:193|-:453:433",
              "sequence": "AAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAAC",
              "length": 278,
              "templateLength": 600,
              "templateSpan": 278,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 176,
                "end": 193,
                "length": 18
              },
              "reverse": {
                "strand": "-",
                "start": 453,
                "end": 433,
                "length": 21
              }
            },
            "ranking": {
              "tmDeviation": 0.33764699878827287,
              "lengthDeviation": 0.6000000000000001,
              "deltaTm": 0.33764699878827287,
              "total": 1.2752939975765458
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 918,
          "boundary": 0,
          "excluded": 0,
          "gc": 40,
          "tm": 507,
          "validForward": 141,
          "validReverse": 230,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 576,
          "exactChecked": 5,
          "exactRefused": 0
        },
        "capped": true
      }
    },
    {
      "id": "design-lac-capped",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 200,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 61.05,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 180,
          "maxProduct": 800
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [
          {
            "id": "+:12:31|-:586:567",
            "forward": {
              "annealing": "ATGGCGCAAAACCTTTCGCG",
              "tail": "",
              "start": 12,
              "end": 31,
              "tm": 61.065643199402075,
              "gc": 55.0,
              "penalty": 0.015643199402077812,
              "tmReview": {
                "value": 61.065643199402075,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CCAGTCGCGTACCGTCTTCA",
              "tail": "",
              "start": 586,
              "end": 567,
              "tm": 61.0566792127554,
              "gc": 60.0,
              "penalty": 0.006679212755400954,
              "tmReview": {
                "value": 61.0566792127554,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:12:31|-:586:567",
              "sequence": "ATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGG",
              "length": 575,
              "templateLength": 600,
              "templateSpan": 575,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 12,
                "end": 31,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 586,
                "end": 567,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.022322412157478766,
              "lengthDeviation": 0.0,
              "deltaTm": 0.008963986646676858,
              "total": 0.031286398804155624
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:12:31|-:475:456",
            "forward": {
              "annealing": "ATGGCGCAAAACCTTTCGCG",
              "tail": "",
              "start": 12,
              "end": 31,
              "tm": 61.065643199402075,
              "gc": 55.0,
              "penalty": 0.015643199402077812,
              "tmReview": {
                "value": 61.065643199402075,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CATCCTGGTCATCCAGCGGA",
              "tail": "",
              "start": 475,
              "end": 456,
              "tm": 61.04745311032701,
              "gc": 60.0,
              "penalty": 0.0025468896729847756,
              "tmReview": {
                "value": 61.04745311032701,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:12:31|-:475:456",
              "sequence": "ATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATG",
              "length": 464,
              "templateLength": 600,
              "templateSpan": 464,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 12,
                "end": 31,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 475,
                "end": 456,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.018190089075062588,
              "lengthDeviation": 0.0,
              "deltaTm": 0.018190089075062588,
              "total": 0.036380178150125175
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:12:31|-:512:493",
            "forward": {
              "annealing": "ATGGCGCAAAACCTTTCGCG",
              "tail": "",
              "start": 12,
              "end": 31,
              "tm": 61.065643199402075,
              "gc": 55.0,
              "penalty": 0.015643199402077812,
              "tmReview": {
                "value": 61.065643199402075,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GCCGGAACATTAGTGCAGGC",
              "tail": "",
              "start": 512,
              "end": 493,
              "tm": 60.94050494377336,
              "gc": 60.0,
              "penalty": 0.1094950562266348,
              "tmReview": {
                "value": 60.94050494377336,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:12:31|-:512:493",
              "sequence": "ATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGC",
              "length": 501,
              "templateLength": 600,
              "templateSpan": 501,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 12,
                "end": 31,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 512,
                "end": 493,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.1251382556287126,
              "lengthDeviation": 0.0,
              "deltaTm": 0.1251382556287126,
              "total": 0.2502765112574252
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:98:118|-:586:567",
            "forward": {
              "annealing": "ACGATGTCGCAGAGTATGCCG",
              "tail": "",
              "start": 98,
              "end": 118,
              "tm": 61.09416535585274,
              "gc": 57.142857142857146,
              "penalty": 0.24416535585274063,
              "tmReview": {
                "value": 61.09416535585274,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CCAGTCGCGTACCGTCTTCA",
              "tail": "",
              "start": 586,
              "end": 567,
              "tm": 61.0566792127554,
              "gc": 60.0,
              "penalty": 0.006679212755400954,
              "tmReview": {
                "value": 61.0566792127554,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:98:118|-:586:567",
              "sequence": "ACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGG",
              "length": 489,
              "templateLength": 600,
              "templateSpan": 489,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 98,
                "end": 118,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 586,
                "end": 567,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.05084456860814157,
              "lengthDeviation": 0.2,
              "deltaTm": 0.037486143097339664,
              "total": 0.28833071170548125
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:98:118|-:475:456",
            "forward": {
              "annealing": "ACGATGTCGCAGAGTATGCCG",
              "tail": "",
              "start": 98,
              "end": 118,
              "tm": 61.09416535585274,
              "gc": 57.142857142857146,
              "penalty": 0.24416535585274063,
              "tmReview": {
                "value": 61.09416535585274,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CATCCTGGTCATCCAGCGGA",
              "tail": "",
              "start": 475,
              "end": 456,
              "tm": 61.04745311032701,
              "gc": 60.0,
              "penalty": 0.0025468896729847756,
              "tmReview": {
                "value": 61.04745311032701,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:98:118|-:475:456",
              "sequence": "ACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATG",
              "length": 378,
              "templateLength": 600,
              "templateSpan": 378,
              "orientation": "+",
              "crossesOrigin": false,
              "forward": {
                "strand": "+",
                "start": 98,
                "end": 118,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 475,
                "end": 456,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.04671224552572539,
              "lengthDeviation": 0.2,
              "deltaTm": 0.04671224552572539,
              "total": 0.2934244910514508
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 3618,
          "boundary": 396,
          "excluded": 0,
          "gc": 94,
          "tm": 962,
          "validForward": 1172,
          "validReverse": 994,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 576,
          "exactChecked": 5,
          "exactRefused": 0
        },
        "capped": true
      }
    },
    {
      "id": "design-puc19-origin",
      "input": {
        "templateName": "L09137.2 (pUC19, circular)",
        "template": "TCGCGCGTTTCGGTGATGACGGTGAAAACCTCTGACACATGCAGCTCCCGGAGACGGTCACAGCTTGTCTGTAAGCGGATGCCGGGAGCAGACAAGCCCGTCAGGGCGCGTCAGCGGGTGTTGGCGGGTGTCGGGGCTGGCTTAACTATGCGGCATCAGAGCAGATTGTACTGAGAGTGCACCATATGCGGTGTGAAATACCGCACAGATGCGTAAGGAGAAAATACCGCATCAGGCGCCATTCGCCATTCAGGCTGCGCAACTGTTGGGAAGGGCGATCGGTGCGGGCCTCTTCGCTATTACGCCAGCTGGCGAAAGGGGGATGTGCTGCAAGGCGATTAAGTTGGGTAACGCCAGGGTTTTCCCAGTCACGACGTTGTAAAACGACGGCCAGTGAATTCGAGCTCGGTACCCGGGGATCCTCTAGAGTCGACCTGCAGGCATGCAAGCTTGGCGTAATCATGGTCATAGCTGTTTCCTGTGTGAAATTGTTATCCGCTCACAATTCCACACAACATACGAGCCGGAAGCATAAAGTGTAAAGCCTGGGGTGCCTAATGAGTGAGCTAACTCACATTAATTGCGTTGCGCTCACTGCCCGCTTTCCAGTCGGGAAACCTGTCGTGCCAGCTGCATTAATGAATCGGCCAACGCGCGGGGAGAGGCGGTTTGCGTATTGGGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGCGGCGAGCGGTATCAGCTCACTCAAAGGCGGTAATACGGTTATCCACAGAATCAGGGGATAACGCAGGAAAGAACATGTGAGCAAAAGGCCAGCAAAAGGCCAGGAACCGTAAAAAGGCCGCGTTGCTGGCGTTTTTCCATAGGCTCCGCCCCCCTGACGAGCATCACAAAAATCGACGCTCAAGTCAGAGGTGGCGAAACCCGACAGGACTATAAAGATACCAGGCGTTTCCCCCTGGAAGCTCCCTCGTGCGCTCTCCTGTTCCGACCCTGCCGCTTACCGGATACCTGTCCGCCTTTCTCCCTTCGGGAAGCGTGGCGCTTTCTCATAGCTCACGCTGTAGGTATCTCAGTTCGGTGTAGGTCGTTCGCTCCAAGCTGGGCTGTGTGCACGAACCCCCCGTTCAGCCCGACCGCTGCGCCTTATCCGGTAACTATCGTCTTGAGTCCAACCCGGTAAGACACGACTTATCGCCACTGGCAGCAGCCACTGGTAACAGGATTAGCAGAGCGAGGTATGTAGGCGGTGCTACAGAGTTCTTGAAGTGGTGGCCTAACTACGGCTACACTAGAAGAACAGTATTTGGTATCTGCGCTCTGCTGAAGCCAGTTACCTTCGGAAAAAGAGTTGGTAGCTCTTGATCCGGCAAACAAACCACCGCTGGTAGCGGTGGTTTTTTTGTTTGCAAGCAGCAGATTACGCGCAGAAAAAAAGGATCTCAAGAAGATCCTTTGATCTTTTCTACGGGGTCTGACGCTCAGTGGAACGAAAACTCACGTTAAGGGATTTTGGTCATGAGATTATCAAAAAGGATCTTCACCTAGATCCTTTTAAATTAAAAATGAAGTTTTAAATCAATCTAAAGTATATATGAGTAAACTTGGTCTGACAGTTACCAATGCTTAATCAGTGAGGCACCTATCTCAGCGATCTGTCTATTTCGTTCATCCATAGTTGCCTGACTCCCCGTCGTGTAGATAACTACGATACGGGAGGGCTTACCATCTGGCCCCAGTGCTGCAATGATACCGCGAGACCCACGCTCACCGGCTCCAGATTTATCAGCAATAAACCAGCCAGCCGGAAGGGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCGCCTCCATCCAGTCTATTAATTGTTGCCGGGAAGCTAGAGTAAGTAGTTCGCCAGTTAATAGTTTGCGCAACGTTGTTGCCATTGCTACAGGCATCGTGGTGTCACGCTCGTCGTTTGGTATGGCTTCATTCAGCTCCGGTTCCCAACGATCAAGGCGAGTTACATGATCCCCCATGTTGTGCAAAAAAGCGGTTAGCTCCTTCGGTCCTCCGATCGTTGTCAGAAGTAAGTTGGCCGCAGTGTTATCACTCATGGTTATGGCAGCACTGCATAATTCTCTTACTGTCATGCCATCCGTAAGATGCTTTTCTGTGACTGGTGAGTACTCAACCAAGTCATTCTGAGAATAGTGTATGCGGCGACCGAGTTGCTCTTGCCCGGCGTCAATACGGGATAATACCGCGCCACATAGCAGAACTTTAAAAGTGCTCATCATTGGAAAACGTTCTTCGGGGCGAAAACTCTCAAGGATCTTACCGCTGTTGAGATCCAGTTCGATGTAACCCACTCGTGCACCCAACTGATCTTCAGCATCTTTTACTTTCACCAGCGTTTCTGGGTGAGCAAAAACAGGAAGGCAAAATGCCGCAAAAAAGGGAATAAGGGCGACACGGAAATGTTGAATACTCATACTCTTCCTTTTTCAATATTATTGAAGCATTTATCAGGGTTATTGTCTCATGAGCGGATACATATTTGAATGTATTTAGAAAAATAAACAAATAGGGGTTCCGCGCACATTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTC",
        "topology": "circular",
        "settings": {
          "target": {
            "start": 2660,
            "end": 40
          },
          "excluded": [],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 60,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 60.05,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 120,
          "maxProduct": 400
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "8a205af08518dae1b0045c7b098986dca18824ef654e75233603602ab89cad04",
        "topology": "circular",
        "templateLength": 2686,
        "pairs": [
          {
            "id": "+:2589:2609|-:84:64",
            "forward": {
              "annealing": "GCGCACATTTCCCCGAAAAGT",
              "tail": "",
              "start": 2589,
              "end": 2609,
              "tm": 60.09908493176272,
              "gc": 52.38095238095238,
              "penalty": 0.2490849317627209,
              "tmReview": {
                "value": 60.09908493176272,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CGGCATCCGCTTACAGACAAG",
              "tail": "",
              "start": 84,
              "end": 64,
              "tm": 59.961942060960894,
              "gc": 57.142857142857146,
              "penalty": 0.28805793903910343,
              "tmReview": {
                "value": 59.961942060960894,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:2589:2609|-:84:64",
              "sequence": "GCGCACATTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTCGCGCGTTTCGGTGATGACGGTGAAAACCTCTGACACATGCAGCTCCCGGAGACGGTCACAGCTTGTCTGTAAGCGGATGCCG",
              "length": 182,
              "templateLength": 2686,
              "templateSpan": 182,
              "orientation": "+",
              "crossesOrigin": true,
              "forward": {
                "strand": "+",
                "start": 2589,
                "end": 2609,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 84,
                "end": 64,
                "length": 21
              }
            },
            "ranking": {
              "tmDeviation": 0.1371428708018243,
              "lengthDeviation": 0.4,
              "deltaTm": 0.1371428708018243,
              "total": 0.6742857416036486
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:2596:2615|-:69:50",
            "forward": {
              "annealing": "TTTCCCCGAAAAGTGCCACC",
              "tail": "",
              "start": 2596,
              "end": 2615,
              "tm": 59.731633561719605,
              "gc": 55.0,
              "penalty": 0.31836643828039257,
              "tmReview": {
                "value": 59.731633561719605,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "GACAAGCTGTGACCGTCTCC",
              "tail": "",
              "start": 69,
              "end": 50,
              "tm": 59.67973345994426,
              "gc": 60.0,
              "penalty": 0.3702665400557379,
              "tmReview": {
                "value": 59.67973345994426,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:2596:2615|-:69:50",
              "sequence": "TTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTCGCGCGTTTCGGTGATGACGGTGAAAACCTCTGACACATGCAGCTCCCGGAGACGGTCACAGCTTGTC",
              "length": 160,
              "templateLength": 2686,
              "templateSpan": 160,
              "orientation": "+",
              "crossesOrigin": true,
              "forward": {
                "strand": "+",
                "start": 2596,
                "end": 2615,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 69,
                "end": 50,
                "length": 20
              }
            },
            "ranking": {
              "tmDeviation": 0.6886329783361305,
              "lengthDeviation": 0.0,
              "deltaTm": 0.05190010177534532,
              "total": 0.7405330801114758
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:2589:2609|-:67:49",
            "forward": {
              "annealing": "GCGCACATTTCCCCGAAAAGT",
              "tail": "",
              "start": 2589,
              "end": 2609,
              "tm": 60.09908493176272,
              "gc": 52.38095238095238,
              "penalty": 0.2490849317627209,
              "tmReview": {
                "value": 60.09908493176272,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CAAGCTGTGACCGTCTCCG",
              "tail": "",
              "start": 67,
              "end": 49,
              "tm": 60.22135733315076,
              "gc": 63.1578947368421,
              "penalty": 0.3713573331507661,
              "tmReview": {
                "value": 60.22135733315076,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:2589:2609|-:67:49",
              "sequence": "GCGCACATTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTCGCGCGTTTCGGTGATGACGGTGAAAACCTCTGACACATGCAGCTCCCGGAGACGGTCACAGCTTG",
              "length": 165,
              "templateLength": 2686,
              "templateSpan": 165,
              "orientation": "+",
              "crossesOrigin": true,
              "forward": {
                "strand": "+",
                "start": 2589,
                "end": 2609,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 67,
                "end": 49,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.22044226491348695,
              "lengthDeviation": 0.4,
              "deltaTm": 0.12227240138804518,
              "total": 0.7427146663015322
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:2596:2615|-:84:64",
            "forward": {
              "annealing": "TTTCCCCGAAAAGTGCCACC",
              "tail": "",
              "start": 2596,
              "end": 2615,
              "tm": 59.731633561719605,
              "gc": 55.0,
              "penalty": 0.31836643828039257,
              "tmReview": {
                "value": 59.731633561719605,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CGGCATCCGCTTACAGACAAG",
              "tail": "",
              "start": 84,
              "end": 64,
              "tm": 59.961942060960894,
              "gc": 57.142857142857146,
              "penalty": 0.28805793903910343,
              "tmReview": {
                "value": 59.961942060960894,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:2596:2615|-:84:64",
              "sequence": "TTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTCGCGCGTTTCGGTGATGACGGTGAAAACCTCTGACACATGCAGCTCCCGGAGACGGTCACAGCTTGTCTGTAAGCGGATGCCG",
              "length": 175,
              "templateLength": 2686,
              "templateSpan": 175,
              "orientation": "+",
              "crossesOrigin": true,
              "forward": {
                "strand": "+",
                "start": 2596,
                "end": 2615,
                "length": 20
              },
              "reverse": {
                "strand": "-",
                "start": 84,
                "end": 64,
                "length": 21
              }
            },
            "ranking": {
              "tmDeviation": 0.406424377319496,
              "lengthDeviation": 0.2,
              "deltaTm": 0.23030849924128916,
              "total": 0.8367328765607851
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          },
          {
            "id": "+:2602:2622|-:67:49",
            "forward": {
              "annealing": "CGAAAAGTGCCACCTGACGTC",
              "tail": "",
              "start": 2602,
              "end": 2622,
              "tm": 60.27949512360135,
              "gc": 57.142857142857146,
              "penalty": 0.42949512360135317,
              "tmReview": {
                "value": 60.27949512360135,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "reverse": {
              "annealing": "CAAGCTGTGACCGTCTCCG",
              "tail": "",
              "start": 67,
              "end": 49,
              "tm": 60.22135733315076,
              "gc": 63.1578947368421,
              "penalty": 0.3713573331507661,
              "tmReview": {
                "value": 60.22135733315076,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            },
            "product": {
              "id": "+:2602:2622|-:67:49",
              "sequence": "CGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTATCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTCGCGCGTTTCGGTGATGACGGTGAAAACCTCTGACACATGCAGCTCCCGGAGACGGTCACAGCTTG",
              "length": 152,
              "templateLength": 2686,
              "templateSpan": 152,
              "orientation": "+",
              "crossesOrigin": true,
              "forward": {
                "strand": "+",
                "start": 2602,
                "end": 2622,
                "length": 21
              },
              "reverse": {
                "strand": "-",
                "start": 67,
                "end": 49,
                "length": 19
              }
            },
            "ranking": {
              "tmDeviation": 0.4008524567521192,
              "lengthDeviation": 0.4,
              "deltaTm": 0.05813779045058709,
              "total": 0.8589902472027063
            },
            "exactSites": {
              "forward": 1,
              "reverse": 1
            },
            "exactProducts": 1
          }
        ],
        "counts": {
          "windows": 1098,
          "boundary": 0,
          "excluded": 0,
          "gc": 321,
          "tm": 193,
          "validForward": 281,
          "validReverse": 303,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 576,
          "exactChecked": 5,
          "exactRefused": 0
        },
        "capped": true
      }
    },
    {
      "id": "design-lac-no-window",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 50,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 80,
          "maxTm": 95,
          "targetTm": 85,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 180,
          "maxProduct": 420
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [],
        "counts": {
          "windows": 918,
          "boundary": 0,
          "excluded": 0,
          "gc": 40,
          "tm": 878,
          "validForward": 0,
          "validReverse": 0,
          "productSize": 0,
          "deltaTm": 0,
          "eligiblePairs": 0,
          "exactChecked": 0,
          "exactRefused": 0
        },
        "capped": false
      }
    },
    {
      "id": "design-lac-no-product",
      "input": {
        "templateName": "J01636.1 1..600",
        "template": "GACACCATCGAATGGCGCAAAACCTTTCGCGGTATGGCATGATAGCGCCCGGAAGAGAGTCAATTCAGGGTGGTGAATGTGAAACCAGTAACGTTATACGATGTCGCAGAGTATGCCGGTGTCTCTTATCAGACCGTTTCCCGCGTGGTGAACCAGGCCAGCCACGTTTCTGCGAAAACGCGGGAAAAAGTGGAAGCGGCGATGGCGGAGCTGAATTACATTCCCAACCGCGTGGCACAACAACTGGCGGGCAAACAGTCGTTGCTGATTGGCGTTGCCACCTCCAGTCTGGCCCTGCACGCGCCGTCGCAAATTGTCGCGGCGATTAAATCTCGCGCCGATCAACTGGGTGCCAGCGTGGTGGTGTCGATGGTAGAACGAAGCGGCGTCGAAGCCTGTAAAGCGGCGGTGCACAATCTTCTCGCGCAACGCGTCAGTGGGCTGATCATTAACTATCCGCTGGATGACCAGGATGCCATTGCTGTGGAAGCTGCCTGCACTAATGTTCCGGCGTTATTTCTTGATGTCTCTGACCAGACACCCATCAACAGTATTATTTTCTCCCATGAAGACGGTACGCGACTGGGCGTGGAGCATCTG",
        "topology": "linear",
        "settings": {
          "target": {
            "start": 201,
            "end": 400
          },
          "excluded": [],
          "forwardTail": "",
          "reverseTail": "",
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "flank": 50,
          "minLength": 18,
          "maxLength": 26,
          "targetLength": 20,
          "minTm": 55,
          "maxTm": 68,
          "targetTm": 60,
          "maxDeltaTm": 3,
          "minGc": 30,
          "maxGc": 70,
          "minProduct": 900,
          "maxProduct": 1000
        }
      },
      "expected": {
        "method": "bounded-flanks-v2",
        "pcrMethod": "exact-pair-v1",
        "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
        "topology": "linear",
        "templateLength": 600,
        "pairs": [],
        "counts": {
          "windows": 918,
          "boundary": 0,
          "excluded": 0,
          "gc": 40,
          "tm": 234,
          "validForward": 353,
          "validReverse": 291,
          "productSize": 576,
          "deltaTm": 0,
          "eligiblePairs": 0,
          "exactChecked": 0,
          "exactRefused": 0
        },
        "capped": true
      }
    }
  ],
  "tmCases": [
    {
      "id": "tm-default-50",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {}
      },
      "expected": {
        "value": 60.373395091885016,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2004",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2004"
        },
        "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "50 mM is below the measured 69 mM floor; the limit text qualifies it, with no separate outside note under the declared 20 mM warning threshold."
    },
    {
      "id": "tm-measured-69",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "na_mM": 69
        }
      },
      "expected": {
        "value": 62.871149879529696,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2004",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 69,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2004"
        },
        "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "At the stated lower measured Na boundary; no outside warning."
    },
    {
      "id": "tm-low-na-10",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "na_mM": 10
        }
      },
      "expected": {
        "value": 45.434929699142685,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2004",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 10,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2004"
        },
        "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
        "outside": [
          "Salt correction outside its fitted range: Owczarzy 2004 was fitted at 69 mM to 1.02 M Na⁺; 10 mM monovalent is an extrapolation."
        ]
      },
      "expectedOutsideFit": [
        {
          "code": "owczarzy-2004-monovalent",
          "parameter": "monovalent",
          "value_mM": 10.0,
          "range_mM": [
            69,
            1020
          ],
          "unverified": false
        }
      ],
      "qualification": "Accepted numerical extrapolation with explicit outside warning; no experimental accuracy claim."
    },
    {
      "id": "tm-warning-boundary-20",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "na_mM": 20
        }
      },
      "expected": {
        "value": 52.332538579391894,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2004",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 20,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2004"
        },
        "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "Warning threshold inclusive; still qualified as extrapolation in the limit text."
    },
    {
      "id": "tm-magnesium",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "mg_mM": 1.5,
          "dntp_mM": 0.2
        }
      },
      "expected": {
        "value": 66.56372428190372,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2008",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 1.5,
          "dntp_mM": 0.2,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2008"
        },
        "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "Mixed cations; retained magnesium range remains explicitly Unverified."
    },
    {
      "id": "tm-santalucia",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "saltCorrection": "santalucia-1998"
        }
      },
      "expected": {
        "value": 60.357173382208316,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "santalucia-1998",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "santalucia-1998"
        },
        "limit": "Entropy correction: SantaLucia 1998. Its fitted range has not yet been read against the paper.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "Alternative salt correction; fitted range remains unread, not invented."
    },
    {
      "id": "tm-magnesium-overrides-santalucia",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "mg_mM": 1.5,
          "dntp_mM": 0.2,
          "saltCorrection": "santalucia-1998"
        }
      },
      "expected": {
        "value": 66.56372428190372,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2008",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 1.5,
          "dntp_mM": 0.2,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2008"
        },
        "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "Effective Mg correction is Owczarzy 2008 even if another correction was requested."
    },
    {
      "id": "tm-low-magnesium",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "mg_mM": 0.2
        }
      },
      "expected": {
        "value": 61.693473502150255,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2008",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0.2,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2008"
        },
        "limit": "Magnesium correction: Owczarzy 2008. Its free Mg²⁺ range, recalled as 0.5 to 600 mM, is Unverified: not yet checked against Owczarzy 2008.",
        "outside": [
          "Free Mg²⁺ 0.2 mM: outside 0.5 to 600 mM, the range recalled for Owczarzy 2008. Unverified: not yet checked against Owczarzy 2008."
        ]
      },
      "expectedOutsideFit": [
        {
          "code": "owczarzy-2008-free-mg",
          "parameter": "free-mg",
          "value_mM": 0.2,
          "range_mM": [
            0.5,
            600
          ],
          "unverified": true
        }
      ],
      "qualification": "Free Mg below recalled range, in the divalent regime, with Unverified outside note."
    },
    {
      "id": "tm-trace-magnesium-monovalent",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "mg_mM": 0.01
        }
      },
      "expected": {
        "value": 60.373395091885016,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2008",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0.01,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2008"
        },
        "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "Selected correction remains Owczarzy 2008 but low R uses the monovalent equation and its limit text."
    },
    {
      "id": "tm-no-magnesium-normalizes-2008",
      "input": {
        "sequence": "ACGTTAGCGATCCGATGCCA",
        "conditions": {
          "saltCorrection": "owczarzy-2008"
        }
      },
      "expected": {
        "value": 60.373395091885016,
        "method": "oligo-tm-nearest-neighbour",
        "version": "1.0.0",
        "saltCorrection": "owczarzy-2004",
        "conditions": {
          "oligo_nM": 250,
          "na_mM": 50,
          "k_mM": 0,
          "tris_mM": 0,
          "mg_mM": 0,
          "dntp_mM": 0,
          "model": "primer-excess",
          "saltCorrection": "owczarzy-2004"
        },
        "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
        "outside": []
      },
      "expectedOutsideFit": [],
      "qualification": "No Mg uses Owczarzy 2004; normalized output names the effective correction."
    }
  ],
  "recordCases": [
    {
      "id": "record-v2-valid",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": true,
      "reason": "Sparse settings and explicit normalized retained conditions are semantically consistent; retained data must survive unchanged.",
      "expectedRead": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ]
    },
    {
      "id": "record-v2-explicit-defaults",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "k_mM": 0,
            "tris_mM": 0,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "k_mM": 0,
                "tris_mM": 0,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": true,
      "reason": "Explicit zero K/Tris and defaults in settings are equivalent to normalized retained conditions.",
      "expectedRead": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "k_mM": 0,
            "tris_mM": 0,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "k_mM": 0,
                "tris_mM": 0,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ]
    },
    {
      "id": "record-v2-wrong-forward-na",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 10,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Forward retained Tm conditions contradict saved conditions."
    },
    {
      "id": "record-v2-wrong-reverse-na",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 10,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Reverse retained Tm conditions contradict saved conditions."
    },
    {
      "id": "record-v2-balanced-settings-na",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 10,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 10,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Entry and settings both changed to 10 mM, preserving their mutual equality, but both retained Tm records still say 50 mM."
    },
    {
      "id": "record-v2-balanced-temperatures-na",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 10,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 10,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Both retained Tm records changed consistently with one another to 10 mM but contradict saved settings."
    },
    {
      "id": "record-v2-wrong-correction-label",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "santalucia-1998",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Top-level retained correction contradicts its own normalized conditions."
    },
    {
      "id": "record-v2-balanced-correction-labels",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "santalucia-1998",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "santalucia-1998"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "santalucia-1998",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "santalucia-1998"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Both retained top-level and nested corrections changed to SantaLucia; still contradict the saved design conditions."
    },
    {
      "id": "record-v2-wrong-concentration",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 500,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Retained concentration contradicts saved concentration."
    },
    {
      "id": "record-v2-wrong-model",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "equal-strands",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "Retained concentration model contradicts saved model."
    },
    {
      "id": "record-v2-missing-temperatures",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ]
          }
        }
      ],
      "expectedAccepted": false,
      "reason": "v2 requires its qualification block."
    },
    {
      "id": "record-historical-v1-no-injection",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v1",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ]
          }
        }
      ],
      "expectedAccepted": true,
      "reason": "Historical v1 without temperatures reads byte-equivalent JSON data; reader must not inject present-day Tm qualifications.",
      "expectedRead": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v1",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ]
          }
        }
      ]
    },
    {
      "id": "record-v2-historical-text-retained",
      "input": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Historical qualification as saved.",
                "outside": [
                  "Historical outside note as saved."
                ]
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ],
      "expectedAccepted": true,
      "reason": "Reader preserves bounded saved qualification text and version; it must not replace historical text with current copy or claim to recompute Tm.",
      "expectedRead": [
        {
          "v": 1,
          "id": "oracle-primer-set",
          "label": "Independent record contract example",
          "createdAt": "2026-10-11T00:00:00.000Z",
          "notes": "",
          "forward": {
            "annealing": "CCAGCCACGTTTCTGCGAAA",
            "tail": ""
          },
          "reverse": {
            "annealing": "TGCGCGAGAAGATTGTGCAC",
            "tail": ""
          },
          "conditions": {
            "oligo_nM": 250,
            "na_mM": 50,
            "mg_mM": 0,
            "dntp_mM": 0,
            "model": "primer-excess",
            "saltCorrection": "owczarzy-2004"
          },
          "witness": {
            "templateHash": "fd182829946e68ba90d7c14906883ef31f663537dade5f617f804b8ce46dc316",
            "templateLength": 600,
            "topology": "linear",
            "coordinates": "1-based-inclusive-5prime-to-3prime",
            "forward": {
              "strand": "+",
              "start": 158,
              "end": 177,
              "length": 20
            },
            "reverse": {
              "strand": "-",
              "start": 428,
              "end": 409,
              "length": 20
            },
            "productId": "+:158:177|-:428:409",
            "method": "exact-pair-v1"
          },
          "design": {
            "method": "bounded-flanks-v2",
            "target": {
              "start": 201,
              "end": 400
            },
            "capped": true,
            "ranking": {
              "tmDeviation": 0.06462320381317,
              "lengthDeviation": 0.0,
              "deltaTm": 0.03260351198753142,
              "total": 0.09722671580070141
            },
            "counts": {
              "windows": 918,
              "boundary": 0,
              "excluded": 0,
              "gc": 40,
              "tm": 234,
              "validForward": 353,
              "validReverse": 291,
              "productSize": 0,
              "deltaTm": 0,
              "eligiblePairs": 576,
              "exactChecked": 5,
              "exactRefused": 0
            },
            "settings": {
              "target": {
                "start": 201,
                "end": 400
              },
              "excluded": [],
              "forwardTail": "",
              "reverseTail": "",
              "conditions": {
                "oligo_nM": 250,
                "na_mM": 50,
                "mg_mM": 0,
                "dntp_mM": 0,
                "model": "primer-excess",
                "saltCorrection": "owczarzy-2004"
              },
              "flank": 50,
              "minLength": 18,
              "maxLength": 26,
              "targetLength": 20,
              "minTm": 55,
              "maxTm": 68,
              "targetTm": 59.95,
              "maxDeltaTm": 3,
              "minGc": 30,
              "maxGc": 70,
              "minProduct": 180,
              "maxProduct": 420
            },
            "structures": [
              {
                "kind": "forward hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse hairpin",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "forward self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "reverse self-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              },
              {
                "kind": "cross-dimer",
                "evaluated": false,
                "dG37": null,
                "detail": "Not evaluated in this hand-authored reader-contract example."
              }
            ],
            "limitations": [
              "Reader-contract fixture: no secondary structure calculation is represented."
            ],
            "temperatures": {
              "forward": {
                "value": 59.99861335790035,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Historical qualification as saved.",
                "outside": [
                  "Historical outside note as saved."
                ]
              },
              "reverse": {
                "value": 59.96600984591282,
                "method": "oligo-tm-nearest-neighbour",
                "version": "1.0.0",
                "saltCorrection": "owczarzy-2004",
                "conditions": {
                  "oligo_nM": 250,
                  "na_mM": 50,
                  "k_mM": 0,
                  "tris_mM": 0,
                  "mg_mM": 0,
                  "dntp_mM": 0,
                  "model": "primer-excess",
                  "saltCorrection": "owczarzy-2004"
                },
                "limit": "Monovalent correction: Owczarzy 2004, fitted at 69 mM to 1.02 M Na⁺. It is also used from 20 to 69 mM, an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) where this equation applies.",
                "outside": []
              }
            }
          }
        }
      ]
    }
  ]
}
