{
 "about": {
  "generatedBy": "pipeline/sequence-toolkit/primer_design.py",
  "scriptSha256": "5f4daeed831507adfce10b9eb07abd3adeded576b461e94890da43709a389971",
  "recordedOn": "2026-10-11",
  "oracle": "Biopython 1.88 MeltingTemp.Tm_NN (DNA_NN3; Owczarzy 2004 as saltcorr 6, Owczarzy 2008 as saltcorr 7; dnac1 = the oligo concentration, dnac2 = 0) for every Tm; the windows, GC, penalties, caps and counts derived in this script from the conventions below; exact sites and products by pipeline/sequence-toolkit/exact_matches.py (reverse complements by Biopython, every window tested directly); one case worked by hand with a write-refusal guard",
  "margins": "A case is written only when every eligible window's Tm is at least 1e-06 °C from the Tm bounds, every pair's ΔTm at least 1e-06 °C from its limit, and every ranking gap at a cap or between returned pairs at least 1e-06: the engine's Tm agrees with Biopython's within 0.1 °C, so no decision here can turn on that tolerance.",
  "conventions": [
   "Input: one A/C/G/T template of 1 to 50,000 bases with explicit topology; a target region (1-based, inclusive, crossing the origin only on a circular template); up to 100 excluded regions; the flank searched beyond each target edge (0 to 200 bases); annealing length bounds and preferred length (8 to 40); Tm bounds and preferred Tm; the pair's maximum ΔTm (0 to 30 °C); GC bounds (percent); product length bounds including both tails (16 to template length + 400); optional 5′ tails of A/C/G/T up to 200 bases each; and the Tm conditions.",
   "Refused before any enumeration, with a message naming the field: a template outside the alphabet, length or topology; target or excluded coordinates outside 1..n, or a target crossing the origin of a linear template; a constraint outside its range or inconsistent with another; a tail outside A/C/G/T or over 200 bases. Nothing is relaxed.",
   "Forward windows: for each gap 0..flank and each length minLength..maxLength, the window whose 3′ end sits gap bases before the target's first base; reverse windows the mirror, whose 3′ end (on the bottom strand) sits gap bases after the target's last base; both read around the circle when circular. Windows are counted in this order of rejection, the first reason counting: boundary (off a linear template, or longer than the template), excluded (any base inside the target or an excluded region), gc (outside the GC bounds), tm (outside the Tm bounds, or refused by the Tm engine).",
   "A window's annealing sequence is the top strand for a forward window and the reverse complement for a reverse window, 5′ to 3′. Its start and end are the primer's 5′ and 3′ ends on the top strand, 1-based, so a reverse window has start > end unless it crosses the origin. GC is G + C over the annealing length, in percent. Tm is the nearest-neighbour Tm of the annealing part alone (the tail never counts), under the recorded conditions, with the primer in excess.",
   "A window's penalty is |Tm − preferred Tm| + 0.2 × |length − preferred length|. Each side is sorted by penalty, then start, then length, and cut to the first 24 (perSide).",
   "Pairs: every forward window with every reverse window of the kept sides. The template span runs from the forward 5′ end to the reverse 5′ end inclusive; a span longer than the template, or a product length (span plus both tails) outside the product bounds, counts productSize; |Tm_f − Tm_r| over the ΔTm limit counts deltaTm. The remaining pairs (eligiblePairs) are ranked by total = (|Tm_f − preferred| + |Tm_r − preferred|) + 0.2 × (|len_f − preferred| + |len_r − preferred|) + |Tm_f − Tm_r|, then forward start, then reverse start.",
   "The first 24 ranked pairs (evaluatedPairs) are each checked by the exact-pair method on the whole template: exactChecked counts them, exactRefused those the exact method refuses or whose own product is not among its candidates. exactSites are the exact method's site counts per primer on both strands; exactProducts its candidate count. The first 5 pairs that pass are returned (returnedPairs).",
   "capped is true when either side had more than 24 eligible windows or fewer pairs were checked than were eligible: the search is then not exhaustive, and the returned pairs are the best among those evaluated.",
   "No Tm of a tailed oligo, no annealing temperature, no genome specificity, no mismatched binding and no amplification outcome is derived: exact binding is checked only within the supplied template, and a returned pair is a sequence design, not evidence that it amplifies."
  ],
  "notGated": "Secondary-structure checks (hairpins, self- and cross-dimers at 37 °C) are the structure method's and are gated by its own fixtures (hairpin-dimer.json); they are not recorded here.",
  "primer3": "Primer3 (primer3-py 2.3.1, GPL-2.0-or-later) was run offline on the real-template cases as a comparison, recorded under docs/science/evidence/primer-design-2026-10-11/; it is not an oracle of this set and nothing from it is shipped.",
  "templates": {
   "hand-24": "a 24-base sequence written for the hand-worked case",
   "J01636.1 1..600": "GenBank J01636.1 (E. coli lac operon), bases 1 to 600, from pipeline/plasmid-map/records (NCBI; no restrictions, depositor terms may apply)",
   "L09137.2 (pUC19, circular)": "GenBank L09137.2 (cloning vector pUC19c), 2,686 bp, circular, from pipeline/plasmid-map/records"
  },
  "limits": {
   "template": 50000,
   "flank": 200,
   "perSide": 24,
   "evaluatedPairs": 24,
   "returnedPairs": 5
  }
 },
 "cases": [
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "GTGACTAG",
       "tail": "CG",
       "start": 24,
       "end": 17,
       "tm": 12.24154515770067,
       "gc": 50.0,
       "penalty": 27.75845484229933
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "Worked by hand in the script's HAND_WORKED block; the script refuses to write unless its derivation agrees with the hand work."
  },
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "AGAAGATTGTGCACCGCCG",
       "tail": "",
       "start": 422,
       "end": 404,
       "tm": 59.914723905422534,
       "gc": 57.89473684210526,
       "penalty": 0.23527609457746906
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "The panel's default constraints on the first 600 bases of the E. coli lac operon, target 201..400."
  },
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "AGATTGTGCACCGCCGCTT",
       "tail": "",
       "start": 419,
       "end": 401,
       "tm": 62.113664810140506,
       "gc": 57.89473684210526,
       "penalty": 0.3136648101405058
      },
      "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
      },
      "reverse": {
       "annealing": "AGATTGTGCACCGCCGCTT",
       "tail": "",
       "start": 419,
       "end": 401,
       "tm": 62.113664810140506,
       "gc": 57.89473684210526,
       "penalty": 0.3136648101405058
      },
      "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
      },
      "reverse": {
       "annealing": "AGATTGTGCACCGCCGCTT",
       "tail": "",
       "start": 419,
       "end": 401,
       "tm": 62.113664810140506,
       "gc": 57.89473684210526,
       "penalty": 0.3136648101405058
      },
      "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
      },
      "reverse": {
       "annealing": "AGATTGTGCACCGCCGCTT",
       "tail": "",
       "start": 419,
       "end": 401,
       "tm": 62.113664810140506,
       "gc": 57.89473684210526,
       "penalty": 0.3136648101405058
      },
      "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
      },
      "reverse": {
       "annealing": "AGATTGTGCACCGCCGCTT",
       "tail": "",
       "start": 419,
       "end": 401,
       "tm": 62.113664810140506,
       "gc": 57.89473684210526,
       "penalty": 0.3136648101405058
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "As design-lac-linear with two excluded regions inside the flanks: every window touching one is counted under excluded, never relaxed."
  },
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "GCAAGCTT",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "GCAAGCTT",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "GCAAGCTT",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "TGCGCGAGAAGATTGTGCAC",
       "tail": "GCAAGCTT",
       "start": 428,
       "end": 409,
       "tm": 59.96600984591282,
       "gc": 55.0,
       "penalty": 0.016009845912819287
      },
      "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
      },
      "reverse": {
       "annealing": "AGAAGATTGTGCACCGCCG",
       "tail": "GCAAGCTT",
       "start": 422,
       "end": 404,
       "tm": 59.914723905422534,
       "gc": 57.89473684210526,
       "penalty": 0.23527609457746906
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "As design-lac-linear with 5′ tails (an EcoRI and a HindIII site behind a GC clamp): the tails count towards the product length and never towards Tm or GC; the product carries the forward tail first and the reverse tail reverse complemented last."
  },
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "GGTCATCCAGCGGATAGTTA",
       "tail": "",
       "start": 469,
       "end": 450,
       "tm": 61.11705567100347,
       "gc": 50.0,
       "penalty": 0.1670556710034674
      },
      "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
      },
      "reverse": {
       "annealing": "AGTTAATGATCAGCCCACTGA",
       "tail": "",
       "start": 454,
       "end": 434,
       "tm": 60.991115029483694,
       "gc": 42.857142857142854,
       "penalty": 0.2411150294836915
      },
      "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
      },
      "reverse": {
       "annealing": "GGTCATCCAGCGGATAGTTA",
       "tail": "",
       "start": 469,
       "end": 450,
       "tm": 61.11705567100347,
       "gc": 50.0,
       "penalty": 0.1670556710034674
      },
      "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
      },
      "reverse": {
       "annealing": "GGTCATCCAGCGGATAGTTA",
       "tail": "",
       "start": 469,
       "end": 450,
       "tm": 61.11705567100347,
       "gc": 50.0,
       "penalty": 0.1670556710034674
      },
      "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
      },
      "reverse": {
       "annealing": "GTTAATGATCAGCCCACTGAC",
       "tail": "",
       "start": 453,
       "end": 433,
       "tm": 60.81993868631338,
       "gc": 47.61904761904762,
       "penalty": 0.33006131368662467
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "As design-lac-linear under 1.5 mM Mg²⁺ and 0.2 mM dNTPs: the Owczarzy 2008 correction (Biopython saltcorr 7), so the Tm bounds select different windows."
  },
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "CCAGTCGCGTACCGTCTTCA",
       "tail": "",
       "start": 586,
       "end": 567,
       "tm": 61.0566792127554,
       "gc": 60.0,
       "penalty": 0.006679212755400954
      },
      "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
      },
      "reverse": {
       "annealing": "CATCCTGGTCATCCAGCGGA",
       "tail": "",
       "start": 475,
       "end": 456,
       "tm": 61.04745311032701,
       "gc": 60.0,
       "penalty": 0.0025468896729847756
      },
      "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
      },
      "reverse": {
       "annealing": "GCCGGAACATTAGTGCAGGC",
       "tail": "",
       "start": 512,
       "end": 493,
       "tm": 60.94050494377336,
       "gc": 60.0,
       "penalty": 0.1094950562266348
      },
      "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
      },
      "reverse": {
       "annealing": "CCAGTCGCGTACCGTCTTCA",
       "tail": "",
       "start": 586,
       "end": 567,
       "tm": 61.0566792127554,
       "gc": 60.0,
       "penalty": 0.006679212755400954
      },
      "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
      },
      "reverse": {
       "annealing": "CATCCTGGTCATCCAGCGGA",
       "tail": "",
       "start": 475,
       "end": 456,
       "tm": 61.04745311032701,
       "gc": 60.0,
       "penalty": 0.0025468896729847756
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "A 200-base flank on each side gives more than 24 eligible windows a side: the sides are cut to 24 by penalty and the search is capped."
  },
  {
   "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-v1",
    "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
      },
      "reverse": {
       "annealing": "CGGCATCCGCTTACAGACAAG",
       "tail": "",
       "start": 84,
       "end": 64,
       "tm": 59.961942060960894,
       "gc": 57.142857142857146,
       "penalty": 0.28805793903910343
      },
      "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
      },
      "reverse": {
       "annealing": "GACAAGCTGTGACCGTCTCC",
       "tail": "",
       "start": 69,
       "end": 50,
       "tm": 59.67973345994426,
       "gc": 60.0,
       "penalty": 0.3702665400557379
      },
      "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
      },
      "reverse": {
       "annealing": "CAAGCTGTGACCGTCTCCG",
       "tail": "",
       "start": 67,
       "end": 49,
       "tm": 60.22135733315076,
       "gc": 63.1578947368421,
       "penalty": 0.3713573331507661
      },
      "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
      },
      "reverse": {
       "annealing": "CGGCATCCGCTTACAGACAAG",
       "tail": "",
       "start": 84,
       "end": 64,
       "tm": 59.961942060960894,
       "gc": 57.142857142857146,
       "penalty": 0.28805793903910343
      },
      "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
      },
      "reverse": {
       "annealing": "CAAGCTGTGACCGTCTCCG",
       "tail": "",
       "start": 67,
       "end": 49,
       "tm": 60.22135733315076,
       "gc": 63.1578947368421,
       "penalty": 0.3713573331507661
      },
      "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "A circular template with the target across the origin (2660..40): the reverse windows wrap, and the product crosses the origin."
  },
  {
   "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-v1",
    "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "Tm bounds no window of 18 to 26 bases reaches under these conditions: every window is counted under tm, no pair exists, nothing is relaxed."
  },
  {
   "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-v1",
    "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
   },
   "method": "bounded-flanks-v1",
   "oracle": "primer_design.py (Biopython MeltingTemp.Tm_NN for Tm; windows, GC, ranking and caps derived in the script; exact binding by exact_matches.py)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-11",
   "notes": "Eligible windows on both sides, but no product can reach 900 bases on a 600-base template: every pair counts under productSize and none is returned."
  },
  {
   "id": "refuse-template-letter",
   "input": {
    "template": "ATGACCTAGCTATTCGCTAGTCAN",
    "topology": "linear",
    "settings": {
     "target": {
      "start": 9,
      "end": 16
     },
     "excluded": [],
     "forwardTail": "",
     "reverseTail": "",
     "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": {
    "refused": true,
    "field": "template",
    "messagePattern": "ACGT"
   },
   "notes": "An N in the template refuses before enumeration; nothing is dropped or guessed."
  },
  {
   "id": "refuse-linear-crossing",
   "input": {
    "template": "ATGACCTAGCTATTCGCTAGTCAC",
    "topology": "linear",
    "settings": {
     "target": {
      "start": 20,
      "end": 5
     },
     "excluded": [],
     "forwardTail": "",
     "reverseTail": "",
     "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": {
    "refused": true,
    "field": "target",
    "messagePattern": "coordinates"
   },
   "notes": "A target with start > end crosses the origin, which a linear template has not."
  },
  {
   "id": "refuse-constraint-range",
   "input": {
    "template": "ATGACCTAGCTATTCGCTAGTCAC",
    "topology": "linear",
    "settings": {
     "target": {
      "start": 9,
      "end": 16
     },
     "excluded": [],
     "forwardTail": "",
     "reverseTail": "",
     "conditions": {
      "oligo_nM": 250,
      "na_mM": 50,
      "mg_mM": 0,
      "dntp_mM": 0,
      "model": "primer-excess",
      "saltCorrection": "owczarzy-2004"
     },
     "flank": 0,
     "minLength": 5,
     "maxLength": 8,
     "targetLength": 8,
     "minTm": 0,
     "maxTm": 100,
     "targetTm": 40,
     "maxDeltaTm": 30,
     "minGc": 0,
     "maxGc": 100,
     "minProduct": 24,
     "maxProduct": 30
    }
   },
   "expected": {
    "refused": true,
    "field": "constraints",
    "messagePattern": "constraints"
   },
   "notes": "A minimum annealing length below 8 is outside the supported range and is refused, not clamped."
  },
  {
   "id": "refuse-tail-letter",
   "input": {
    "template": "ATGACCTAGCTATTCGCTAGTCAC",
    "topology": "linear",
    "settings": {
     "target": {
      "start": 9,
      "end": 16
     },
     "excluded": [],
     "forwardTail": "ACGN",
     "reverseTail": "",
     "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": {
    "refused": true,
    "field": "tails",
    "messagePattern": "Tails"
   },
   "notes": "A tail outside A/C/G/T is refused."
  }
 ]
}
