{
 "about": {
  "generatedBy": "pipeline/sequence-toolkit/sdm_primers.py",
  "scriptSha256": "29a64edaf0ecf16eaf5be716d5667bd54d81c53bc598f9972245b4212458bd88",
  "recordedOn": "2026-10-17",
  "contract": "docs/board/memos/2026-10-17-cso-sdm-primers-contract.md (the CSO's rulings of 17 October 2026, confirming item 5 of the Sequence-stage memo of 12 October)",
  "oracle": "Biopython 1.88 MeltingTemp.Tm_NN (DNA_NN3; the Owczarzy 2004 correction as saltcorr 6 and the 2008 correction as saltcorr 7; dnac1 = the oligo concentration, dnac2 = 0) for every melting temperature, and Bio.Seq.reverse_complement for every reverse complement; the mutant sequence, the windows, the matched flanks, GC, the ranking and the counts derived in this script from the rules below; one case per scheme worked by hand with a write-refusal guard",
  "margins": "The only Tm-decided rule is the back-to-back pair's ΔTm of at most 3 °C. A case is written only when every enumerated candidate's ΔTm lies at least 1e-06 °C from that limit and every ranking gap at the returned cut is 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.",
  "rules": {
   "templateMin": 2,
   "templateMax": 50000,
   "substitutionMax": 3,
   "indelMax": 12,
   "overlapMinLength": 25,
   "overlapMaxLength": 45,
   "overlapMinFlank": 10,
   "overlapPreferredFlank": [
    12,
    15
   ],
   "overlapMaxImbalance": 3,
   "overlapPreferredGc": [
    40,
    60
   ],
   "overlapRequiredGc": [
    30,
    70
   ],
   "backMinMatched": 18,
   "backMaxMatched": 30,
   "backMinThreePrime": 15,
   "backMaxLeading": 5,
   "backMaxDeltaTm": 3,
   "candidateCap": 5000,
   "returned": 5
  },
  "enumerationMaximum": "The published rules bound the enumeration below the cap: at most 45 starts by 21 ends, 945 windows, in the overlapping scheme, and at most 6 leading lengths by 16 matched segments by 13 partner lengths, 1,248 pairs, in the back-to-back scheme. The cap is a declared limit that these rules cannot reach, so no case here is capped; it is reported with every result all the same.",
  "conventions": [
   "Input: one A/C/G/T template of 2 to 50,000 bases (lower case and whitespace accepted, any other character refused with each offender's 1-based position) with explicit topology; one change, either a substitution of 1 to 3 contiguous bases, an insertion of 1 to 12 bases after a stated base, or a deletion of 1 to 12 contiguous bases; one scheme, overlapping-complementary or back-to-back; and the Tm conditions.",
   "The mutant: the changed span is replaced by the new bases, and mutant coordinate 1 is template position 1. For a change that crosses a circular template's origin the mutant is read from the first retained base after the changed span, so mutant coordinate 1 is that template position; the origin is reported with every result. A circular mutant is read around the circle, a linear one is not.",
   "The change's mutant coordinates: c1 is the first changed mutant base and c2 the last. For a substitution they are the outermost positions whose base actually differs from the template, so a 3-base substitution that leaves its middle base unchanged is a design of its outer two bases. For an insertion they are the inserted bases. For a deletion there is no changed base: c2 is the last mutant base before the junction and c1 the first after it, so c2 = c1 - 1.",
   "A window of the mutant from s to e contains the change when s <= c1 and e >= c2. Its matched flanks are left = c1 - s and right = e - c2: the perfectly matched mutant bases 5' of the first change and 3' of the last. Each primer's flanks are counted on that primer, so the reverse primer's 5' flank is the forward primer's 3' flank; a primer whose 3' matched flank is its whole length aligns to one contiguous run of the template, so it matches the template in full and one melting temperature applies to it: that is the back-to-back partner always, and the back-to-back forward primer of a deletion, which begins at the first base after the deleted segment. A window spanning a deletion junction is not fully matched, because its two flanks are not contiguous in the template. Inserted bases are never counted as a matched flank, and for a deletion the flanks are the bases either side of the junction.",
   "Scheme A, overlapping complementary: the forward primer is the mutant window itself and the reverse primer its exact reverse complement, with no separate search. A window is rejected under the first rule that applies, and counted: boundary (off a linear mutant, or longer than a circular one), length (outside 25 to 45 bases, measured on the mutant), flankShort (either matched flank below 10), offCentre (the flanks differing by more than 3), gc (GC percent outside 30 to 70).",
   "Every ranking term is compared at a published precision, so the order is decided between whole numbers: melting temperatures to 1e-6 °C and GC percentages to 1e-9. Two candidates equal at that precision are ordered by the exact terms that follow, and a set whose returned order would rest on a single step of either precision is refused by the oracle rather than published.",
   "Scheme A ranking, in this order: the flank imbalance |left - right|; whether both flanks lie in the preferred band of 12 to 15 bases, in before out; the GC percent's distance from the preferred band of 40 to 60, zero inside it; the length's distance from the midpoint of 25 to 45; then the lowest mutant start. The first 5 are returned.",
   "Scheme B, back-to-back: circular templates only. The forward primer carries the change at its 5' end: for a substitution the changed bases sit within its 5'-most 6 bases, so 0 to 5 perfectly matched bases may precede them; for an insertion the inserted bases are the 5' addition; for a deletion the primer begins at the first base after the deleted segment. The perfectly matched segment 3' of the last change is 15 bases or more, and the primer's total perfectly matched bases (the leading matched bases plus that segment) are 18 to 30. The partner primer is the reverse complement of the 18 to 30 mutant bases immediately 5' of the forward primer's first base, so the two 5' ends abut, and it matches the template exactly. Each primer's GC percent, over its whole sequence as it would be ordered, is 30 to 70 as in the overlapping scheme, with 40 to 60 preferred for the ranking (the CSO's build review of 17 October 2026, finding 4: GC is a property of the oligo that is synthesised, not of the scheme). Rejections are counted as boundary (a span off the mutant), abutment (the two primers together longer than the mutant), matched3PrimeShort, length (the total matched bases outside 18 to 30), gc and deltaTm. The matched3PrimeShort count is structurally zero, because the enumeration starts at the published minimum of 15; the rule and its count are kept so the shape states it.",
   "Scheme B ranking, in this order: the pair's ΔTm; the mean GC distance from 40 to 60; the two lengths' distance from the midpoint of 18 to 30; then the lowest forward start, the forward length and the partner length. The first 5 are returned. This order is beyond the CSO's rule 9, which covers scheme A, and is published with the method.",
   "Tm: every melting temperature is of a perfectly matched duplex. For each primer, the Tm of the whole primer against the mutant sequence it matches exactly, and the Tm of its longest perfectly matched 3' segment against the template. Where the primer matches the template in full, which is the back-to-back partner, the two are the same number and it is reported once. No Tm of a mismatched duplex is derived anywhere, and the only Tm-decided rule is the back-to-back pair's ΔTm of at most 3 °C, computed on each primer's matched annealing part: the matched segment 3' of the last change for the forward primer and the whole of the partner.",
   "Caps: the enumeration stops at 5,000 candidates per scheme and the count reached is reported; the candidates passing every rule are counted, not only the 5 returned. Nothing is relaxed to produce a result: when nothing passes, the counts by reason are the answer.",
   "No protocol advice is derived: no cycle number, extension time, polymerase, DpnI, phosphorylation, ligation or kit, and no amplification, mutagenesis efficiency or colony outcome. The back-to-back product is the linear whole-template amplicon of the mutant's length and requires circularisation."
  ],
  "notGated": "Secondary structure (hairpins, self- and cross-dimers) belongs to the structure method and its own fixtures; the overlapping scheme's two primers are complementary by design, so a cross-dimer number would describe the scheme rather than a defect, and none is recorded here.",
  "noProtocol": "No cycle number, extension time, polymerase, DpnI, phosphorylation, ligation or kit is derived, and no amplification, mutagenesis efficiency or colony outcome. Vendor and kit scheme names are held for the General Counsel (D-0010).",
  "templates": {
   "hand-25": "a 25-base sequence written for the hand-worked overlapping case",
   "hand-60": "five copies of the 12-base unit ACGTTGCAATCG",
   "hand-240-circular": "twenty copies of the 12-base unit ACGTTGCAATCG, read as circular where the case says so",
   "hand-228-gc": "a GC-rich stretch followed by an AT-rich one, written for this set",
   "hand-240-mixed": "twelve copies of ten AT-rich bases followed by ten GC-rich bases, written for this set"
  }
 },
 "cases": [
  {
   "id": "hand-substitution-overlap",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "Worked by hand in the script's HAND_WORKED block; the script refuses to write unless its derivation agrees.",
   "input": {
    "templateName": "hand-25",
    "template": "ACGTACGTACGTATGCATGCATGCA",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 13,
     "bases": "C"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 25,
    "mutantOrigin": 1,
    "mutant": "ACGTACGTACGTCTGCATGCATGCA",
    "changedMutantSpan": [
     13,
     13
    ],
    "wtBases": "A",
    "mutantBases": "C",
    "unchangedOffsets": [],
    "counts": {
     "windows": 735,
     "boundary": 734,
     "length": 0,
     "flankShort": 0,
     "offCentre": 0,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 1
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "ACGTACGTACGTCTGCATGCATGCA",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "TGCATGCATGCA",
       "matched3PrimeLength": 12,
       "tmMutant": 63.97414002616779,
       "tmMatched3Prime": 43.68297148422624,
       "mutantStart": 1,
       "mutantEnd": 25,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "TGCATGCATGCAGACGTACGTACGT",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "ACGTACGTACGT",
       "matched3PrimeLength": 12,
       "tmMutant": 63.97414002616779,
       "tmMatched3Prime": 40.47734247403321,
       "mutantStart": 25,
       "mutantEnd": 1,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       10.0,
       1,
       25
      ]
     }
    ]
   }
  },
  {
   "id": "hand-substitution-back-to-back",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "Worked by hand in the script's HAND_WORKED block: the candidate with no leading matched base and a 20-base matched 3' segment, with a 20-base partner. The script refuses to write unless that candidate appears with the hand-worked values.",
   "input": {
    "templateName": "hand-240-circular",
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "circular",
    "change": {
     "kind": "substitution",
     "position": 121,
     "bases": "G"
    },
    "scheme": "back-to-back",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "back-to-back",
    "mutantLength": 240,
    "mutantOrigin": 1,
    "mutant": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGGCGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "changedMutantSpan": [
     121,
     121
    ],
    "wtBases": "A",
    "mutantBases": "G",
    "unchangedOffsets": [],
    "counts": {
     "windows": 1248,
     "boundary": 0,
     "length": 273,
     "flankShort": 0,
     "offCentre": 0,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 612,
     "passed": 363
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "GCGTTGCAATCGACGTTGCAATCG",
       "length": 24,
       "gc": 54.166666666666664,
       "matchedLeft": 0,
       "matchedRight": 23,
       "matchedTotal": 23,
       "matched3PrimeSequence": "CGTTGCAATCGACGTTGCAATCG",
       "matched3PrimeLength": 23,
       "tmMutant": 63.18495948011389,
       "tmMatched3Prime": 60.883979022180824,
       "mutantStart": 121,
       "mutantEnd": 144,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTGCAACG",
       "length": 23,
       "gc": 52.17391304347826,
       "matchedLeft": 0,
       "matchedRight": 23,
       "matchedTotal": 23,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTGCAACG",
       "matched3PrimeLength": 23,
       "tmMutant": 60.88397902218088,
       "tmMatched3Prime": 60.88397902218088,
       "mutantStart": 120,
       "mutantEnd": 98,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 5.684341886080802e-14,
      "product": {
       "length": 240,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       2.0,
       121,
       24,
       23
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "GCGTTGCAATCGACGTTGCAATCGAC",
       "length": 26,
       "gc": 53.84615384615385,
       "matchedLeft": 0,
       "matchedRight": 25,
       "matchedTotal": 25,
       "matched3PrimeSequence": "CGTTGCAATCGACGTTGCAATCGAC",
       "matched3PrimeLength": 25,
       "tmMutant": 64.46458926382024,
       "tmMatched3Prime": 62.389926979708434,
       "mutantStart": 121,
       "mutantEnd": 146,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTGCAACGTC",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 0,
       "matchedRight": 25,
       "matchedTotal": 25,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTGCAACGTC",
       "matched3PrimeLength": 25,
       "tmMutant": 62.38992697970849,
       "tmMatched3Prime": 62.38992697970849,
       "mutantStart": 120,
       "mutantEnd": 96,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 5.684341886080802e-14,
      "product": {
       "length": 240,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       2.0,
       121,
       26,
       25
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "GGCGTTGCAATCGACGTTGCAATC",
       "length": 24,
       "gc": 54.166666666666664,
       "matchedLeft": 1,
       "matchedRight": 22,
       "matchedTotal": 23,
       "matched3PrimeSequence": "CGTTGCAATCGACGTTGCAATC",
       "matched3PrimeLength": 22,
       "tmMutant": 63.13694836720077,
       "tmMatched3Prime": 58.67864149139814,
       "mutantStart": 120,
       "mutantEnd": 143,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "partner": {
       "sequence": "GATTGCAACGTCGATTGCAACG",
       "length": 22,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 22,
       "matchedTotal": 22,
       "matched3PrimeSequence": "GATTGCAACGTCGATTGCAACG",
       "matched3PrimeLength": 22,
       "tmMutant": 58.678641491398196,
       "tmMatched3Prime": 58.678641491398196,
       "mutantStart": 119,
       "mutantEnd": 98,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 5.684341886080802e-14,
      "product": {
       "length": 240,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       3.0,
       120,
       24,
       22
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "GGCGTTGCAATCGACGTTGCAATCGAC",
       "length": 27,
       "gc": 55.55555555555556,
       "matchedLeft": 1,
       "matchedRight": 25,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CGTTGCAATCGACGTTGCAATCGAC",
       "matched3PrimeLength": 25,
       "tmMutant": 66.09861003813688,
       "tmMatched3Prime": 62.389926979708434,
       "mutantStart": 120,
       "mutantEnd": 146,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "partner": {
       "sequence": "GATTGCAACGTCGATTGCAACGTCG",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 0,
       "matchedRight": 25,
       "matchedTotal": 25,
       "matched3PrimeSequence": "GATTGCAACGTCGATTGCAACGTCG",
       "matched3PrimeLength": 25,
       "tmMutant": 62.38992697970849,
       "tmMatched3Prime": 62.38992697970849,
       "mutantStart": 119,
       "mutantEnd": 95,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 5.684341886080802e-14,
      "product": {
       "length": 240,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       3.0,
       120,
       27,
       25
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "CGGCGTTGCAATCGACGTTGCAAT",
       "length": 24,
       "gc": 54.166666666666664,
       "matchedLeft": 2,
       "matchedRight": 21,
       "matchedTotal": 23,
       "matched3PrimeSequence": "CGTTGCAATCGACGTTGCAAT",
       "matched3PrimeLength": 21,
       "tmMutant": 64.54541783758822,
       "tmMatched3Prime": 57.82641399046031,
       "mutantStart": 119,
       "mutantEnd": 142,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "partner": {
       "sequence": "ATTGCAACGTCGATTGCAACG",
       "length": 21,
       "gc": 47.61904761904762,
       "matchedLeft": 0,
       "matchedRight": 21,
       "matchedTotal": 21,
       "matched3PrimeSequence": "ATTGCAACGTCGATTGCAACG",
       "matched3PrimeLength": 21,
       "tmMutant": 57.82641399046037,
       "tmMatched3Prime": 57.82641399046037,
       "mutantStart": 118,
       "mutantEnd": 98,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 5.684341886080802e-14,
      "product": {
       "length": 240,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       4.0,
       119,
       24,
       21
      ]
     }
    ]
   }
  },
  {
   "id": "substitution-three-bases-middle-unchanged",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "A 3-base substitution whose middle base already matches the template: the changed span is the outer two bases and the flanks are counted from them (CSO rule 3).",
   "input": {
    "templateName": "hand-60",
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 25,
     "bases": "GCT"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 60,
    "mutantOrigin": 1,
    "mutant": "ACGTTGCAATCGACGTTGCAATCGGCTTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "changedMutantSpan": [
     25,
     27
    ],
    "wtBases": "ACG",
    "mutantBases": "GCT",
    "unchangedOffsets": [
     1
    ],
    "counts": {
     "windows": 693,
     "boundary": 216,
     "length": 0,
     "flankShort": 240,
     "offCentre": 164,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 73
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "TCGACGTTGCAATCGGCTTTGCAATCGACGTTG",
       "length": 33,
       "gc": 51.515151515151516,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "TTGCAATCGACGTTG",
       "matched3PrimeLength": 15,
       "tmMutant": 68.2625290385626,
       "tmMatched3Prime": 47.283701491940974,
       "mutantStart": 10,
       "mutantEnd": 42,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CAACGTCGATTGCAAAGCCGATTGCAACGTCGA",
       "length": 33,
       "gc": 51.515151515151516,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CGATTGCAACGTCGA",
       "matched3PrimeLength": 15,
       "tmMutant": 68.2625290385626,
       "tmMatched3Prime": 50.44828367441977,
       "mutantStart": 42,
       "mutantEnd": 10,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       2.0,
       10,
       33
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "CGACGTTGCAATCGGCTTTGCAATCGACGTT",
       "length": 31,
       "gc": 51.61290322580645,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "TTGCAATCGACGTT",
       "matched3PrimeLength": 14,
       "tmMutant": 67.49498327374988,
       "tmMatched3Prime": 44.63943904614081,
       "mutantStart": 11,
       "mutantEnd": 41,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "AACGTCGATTGCAAAGCCGATTGCAACGTCG",
       "length": 31,
       "gc": 51.61290322580645,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CGATTGCAACGTCG",
       "matched3PrimeLength": 14,
       "tmMutant": 67.49498327374988,
       "tmMatched3Prime": 48.74352838937551,
       "mutantStart": 41,
       "mutantEnd": 11,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       4.0,
       11,
       31
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "GACGTTGCAATCGGCTTTGCAATCGACGT",
       "length": 29,
       "gc": 51.724137931034484,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "TTGCAATCGACGT",
       "matched3PrimeLength": 13,
       "tmMutant": 66.35929841295359,
       "tmMatched3Prime": 43.55708482815197,
       "mutantStart": 12,
       "mutantEnd": 40,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "ACGTCGATTGCAAAGCCGATTGCAACGTC",
       "length": 29,
       "gc": 51.724137931034484,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CGATTGCAACGTC",
       "matched3PrimeLength": 13,
       "tmMutant": 66.35929841295359,
       "tmMatched3Prime": 44.03061337338079,
       "mutantStart": 40,
       "mutantEnd": 12,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       6.0,
       12,
       29
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "ACGTTGCAATCGGCTTTGCAATCGACG",
       "length": 27,
       "gc": 51.851851851851855,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "TTGCAATCGACG",
       "matched3PrimeLength": 12,
       "tmMutant": 65.33008949583456,
       "tmMatched3Prime": 40.65657245526046,
       "mutantStart": 13,
       "mutantEnd": 39,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CGTCGATTGCAAAGCCGATTGCAACGT",
       "length": 27,
       "gc": 51.851851851851855,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "CGATTGCAACGT",
       "matched3PrimeLength": 12,
       "tmMutant": 65.33008949583461,
       "tmMatched3Prime": 41.08814794571185,
       "mutantStart": 39,
       "mutantEnd": 13,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       8.0,
       13,
       27
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "ATCGACGTTGCAATCGGCTTTGCAATCGACGTTGC",
       "length": 35,
       "gc": 51.42857142857143,
       "matchedLeft": 16,
       "matchedRight": 16,
       "matchedTotal": 32,
       "matched3PrimeSequence": "TTGCAATCGACGTTGC",
       "matched3PrimeLength": 16,
       "tmMutant": 69.32090780144375,
       "tmMatched3Prime": 51.619781275102184,
       "mutantStart": 9,
       "mutantEnd": 43,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GCAACGTCGATTGCAAAGCCGATTGCAACGTCGAT",
       "length": 35,
       "gc": 51.42857142857143,
       "matchedLeft": 16,
       "matchedRight": 16,
       "matchedTotal": 32,
       "matched3PrimeSequence": "CGATTGCAACGTCGAT",
       "matched3PrimeLength": 16,
       "tmMutant": 69.32090780144375,
       "tmMatched3Prime": 50.72420281893568,
       "mutantStart": 43,
       "mutantEnd": 9,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       1,
       0,
       0.0,
       9,
       35
      ]
     }
    ]
   }
  },
  {
   "id": "insertion-twelve-bases",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "A 12-base insertion: the inserted bases count toward the primer's length and never toward a matched flank.",
   "input": {
    "templateName": "hand-240-circular",
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "linear",
    "change": {
     "kind": "insertion",
     "position": 120,
     "bases": "GGCCTTAAGGCC"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 252,
    "mutantOrigin": 1,
    "mutant": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGGGCCTTAAGGCCACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "changedMutantSpan": [
     121,
     132
    ],
    "wtBases": "",
    "mutantBases": "GGCCTTAAGGCC",
    "unchangedOffsets": [],
    "counts": {
     "windows": 504,
     "boundary": 0,
     "length": 0,
     "flankShort": 399,
     "offCentre": 60,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 45
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "ACGTTGCAATCGGGCCTTAAGGCCACGTTGCAATCG",
       "length": 36,
       "gc": 55.55555555555556,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "ACGTTGCAATCG",
       "matched3PrimeLength": 12,
       "tmMutant": 71.98365576639753,
       "tmMatched3Prime": 41.08814794571185,
       "mutantStart": 109,
       "mutantEnd": 144,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CGATTGCAACGTGGCCTTAAGGCCCGATTGCAACGT",
       "length": 36,
       "gc": 55.55555555555556,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "CGATTGCAACGT",
       "matched3PrimeLength": 12,
       "tmMutant": 71.98365576639742,
       "tmMatched3Prime": 41.08814794571185,
       "mutantStart": 144,
       "mutantEnd": 109,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       1.0,
       109,
       36
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "GACGTTGCAATCGGGCCTTAAGGCCACGTTGCAATCGA",
       "length": 38,
       "gc": 55.26315789473684,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "ACGTTGCAATCGA",
       "matched3PrimeLength": 13,
       "tmMutant": 72.30665148562917,
       "tmMatched3Prime": 43.55708482815197,
       "mutantStart": 108,
       "mutantEnd": 145,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "TCGATTGCAACGTGGCCTTAAGGCCCGATTGCAACGTC",
       "length": 38,
       "gc": 55.26315789473684,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CGATTGCAACGTC",
       "matched3PrimeLength": 13,
       "tmMutant": 72.30665148562917,
       "tmMatched3Prime": 44.03061337338079,
       "mutantStart": 145,
       "mutantEnd": 108,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       3.0,
       108,
       38
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "CGACGTTGCAATCGGGCCTTAAGGCCACGTTGCAATCGAC",
       "length": 40,
       "gc": 57.5,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "ACGTTGCAATCGAC",
       "matched3PrimeLength": 14,
       "tmMutant": 73.3953738375256,
       "tmMatched3Prime": 46.491499237911626,
       "mutantStart": 107,
       "mutantEnd": 146,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GTCGATTGCAACGTGGCCTTAAGGCCCGATTGCAACGTCG",
       "length": 40,
       "gc": 57.5,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CGATTGCAACGTCG",
       "matched3PrimeLength": 14,
       "tmMutant": 73.3953738375256,
       "tmMatched3Prime": 48.74352838937551,
       "mutantStart": 146,
       "mutantEnd": 107,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       5.0,
       107,
       40
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "TCGACGTTGCAATCGGGCCTTAAGGCCACGTTGCAATCGACG",
       "length": 42,
       "gc": 57.142857142857146,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "ACGTTGCAATCGACG",
       "matched3PrimeLength": 15,
       "tmMutant": 74.46167944101182,
       "tmMatched3Prime": 50.787770177839775,
       "mutantStart": 106,
       "mutantEnd": 147,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CGTCGATTGCAACGTGGCCTTAAGGCCCGATTGCAACGTCGA",
       "length": 42,
       "gc": 57.142857142857146,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CGATTGCAACGTCGA",
       "matched3PrimeLength": 15,
       "tmMutant": 74.46167944101171,
       "tmMatched3Prime": 50.44828367441977,
       "mutantStart": 147,
       "mutantEnd": 106,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       7.0,
       106,
       42
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "CGTTGCAATCGGGCCTTAAGGCCACGTTGCAATC",
       "length": 34,
       "gc": 55.88235294117647,
       "matchedLeft": 11,
       "matchedRight": 11,
       "matchedTotal": 22,
       "matched3PrimeSequence": "ACGTTGCAATC",
       "matched3PrimeLength": 11,
       "tmMutant": 70.43352019501839,
       "tmMatched3Prime": 34.62133210071789,
       "mutantStart": 110,
       "mutantEnd": 143,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GATTGCAACGTGGCCTTAAGGCCCGATTGCAACG",
       "length": 34,
       "gc": 55.88235294117647,
       "matchedLeft": 11,
       "matchedRight": 11,
       "matchedTotal": 22,
       "matched3PrimeSequence": "CGATTGCAACG",
       "matched3PrimeLength": 11,
       "tmMutant": 70.43352019501839,
       "tmMatched3Prime": 37.8882061876601,
       "mutantStart": 143,
       "mutantEnd": 110,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       1,
       0,
       1.0,
       110,
       34
      ]
     }
    ]
   }
  },
  {
   "id": "deletion-twelve-bases-crossing-origin",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "A 12-base deletion crossing a circular origin: the mutant is read from the first retained base after the deleted span, so the junction sits at the mutant's ends and every window crosses the origin.",
   "input": {
    "templateName": "hand-240-circular",
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "circular",
    "change": {
     "kind": "deletion",
     "position": 235,
     "length": 12
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 228,
    "mutantOrigin": 7,
    "mutant": "CAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTG",
    "changedMutantSpan": [
     229,
     228
    ],
    "wtBases": "ACGTTGCAATCG",
    "mutantBases": "",
    "unchangedOffsets": [],
    "counts": {
     "windows": 754,
     "boundary": 0,
     "length": 0,
     "flankShort": 418,
     "offCentre": 262,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 74
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "TTGCAATCGACGTTGCAATCGACGTTGCAA",
       "length": 30,
       "gc": 46.666666666666664,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CAATCGACGTTGCAA",
       "matched3PrimeLength": 15,
       "tmMutant": 65.41790291895029,
       "tmMatched3Prime": 47.28370149194103,
       "mutantStart": 214,
       "mutantEnd": 15,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "TTGCAACGTCGATTGCAACGTCGATTGCAA",
       "length": 30,
       "gc": 46.666666666666664,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CAACGTCGATTGCAA",
       "matched3PrimeLength": 15,
       "tmMutant": 65.41790291895029,
       "tmMatched3Prime": 47.28370149194103,
       "mutantStart": 15,
       "mutantEnd": 214,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       5.0,
       214,
       30
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "TGCAATCGACGTTGCAATCGACGTTGCA",
       "length": 28,
       "gc": 50.0,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CAATCGACGTTGCA",
       "matched3PrimeLength": 14,
       "tmMutant": 65.90357251456385,
       "tmMatched3Prime": 46.49057965542249,
       "mutantStart": 215,
       "mutantEnd": 14,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "TGCAACGTCGATTGCAACGTCGATTGCA",
       "length": 28,
       "gc": 50.0,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CAACGTCGATTGCA",
       "matched3PrimeLength": 14,
       "tmMutant": 65.9035725145639,
       "tmMatched3Prime": 46.49057965542249,
       "mutantStart": 14,
       "mutantEnd": 215,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       7.0,
       215,
       28
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "GCAATCGACGTTGCAATCGACGTTGC",
       "length": 26,
       "gc": 53.84615384615385,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CAATCGACGTTGC",
       "matched3PrimeLength": 13,
       "tmMutant": 64.46458926382019,
       "tmMatched3Prime": 44.03061337338079,
       "mutantStart": 216,
       "mutantEnd": 13,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GCAACGTCGATTGCAACGTCGATTGC",
       "length": 26,
       "gc": 53.84615384615385,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CAACGTCGATTGC",
       "matched3PrimeLength": 13,
       "tmMutant": 64.46458926382019,
       "tmMatched3Prime": 44.03061337338079,
       "mutantStart": 13,
       "mutantEnd": 216,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       9.0,
       216,
       26
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
       "length": 36,
       "gc": 50.0,
       "matchedLeft": 18,
       "matchedRight": 18,
       "matchedTotal": 36,
       "matched3PrimeSequence": "CAATCGACGTTGCAATCG",
       "matched3PrimeLength": 18,
       "tmMutant": 68.8222534053611,
       "tmMatched3Prime": 52.92788113295046,
       "mutantStart": 211,
       "mutantEnd": 18,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CGATTGCAACGTCGATTGCAACGTCGATTGCAACGT",
       "length": 36,
       "gc": 50.0,
       "matchedLeft": 18,
       "matchedRight": 18,
       "matchedTotal": 36,
       "matched3PrimeSequence": "CAACGTCGATTGCAACGT",
       "matched3PrimeLength": 18,
       "tmMutant": 68.82225340536098,
       "tmMatched3Prime": 54.658507075670855,
       "mutantStart": 18,
       "mutantEnd": 211,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       1,
       0,
       1.0,
       211,
       36
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "CGTTGCAATCGACGTTGCAATCGACGTTGCAATC",
       "length": 34,
       "gc": 50.0,
       "matchedLeft": 17,
       "matchedRight": 17,
       "matchedTotal": 34,
       "matched3PrimeSequence": "CAATCGACGTTGCAATC",
       "matched3PrimeLength": 17,
       "tmMutant": 67.148832835917,
       "tmMatched3Prime": 49.55450268551789,
       "mutantStart": 212,
       "mutantEnd": 17,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GATTGCAACGTCGATTGCAACGTCGATTGCAACG",
       "length": 34,
       "gc": 50.0,
       "matchedLeft": 17,
       "matchedRight": 17,
       "matchedTotal": 34,
       "matched3PrimeSequence": "CAACGTCGATTGCAACG",
       "matched3PrimeLength": 17,
       "tmMutant": 67.14883283591706,
       "tmMatched3Prime": 53.102400981426854,
       "mutantStart": 17,
       "mutantEnd": 212,
       "crossesOrigin": true,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       1,
       0,
       1.0,
       212,
       34
      ]
     }
    ]
   }
  },
  {
   "id": "deletion-back-to-back",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "A deletion in the back-to-back scheme: the forward primer begins at the first base after the deleted segment, so it carries no leading matched base and matches the mutant in full.",
   "input": {
    "templateName": "hand-240-circular",
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "circular",
    "change": {
     "kind": "deletion",
     "position": 121,
     "length": 6
    },
    "scheme": "back-to-back",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "back-to-back",
    "mutantLength": 234,
    "mutantOrigin": 1,
    "mutant": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "changedMutantSpan": [
     121,
     120
    ],
    "wtBases": "ACGTTG",
    "mutantBases": "",
    "unchangedOffsets": [],
    "counts": {
     "windows": 208,
     "boundary": 0,
     "length": 39,
     "flankShort": 0,
     "offCentre": 0,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 93,
     "passed": 76
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "CAATCGACGTTGCAATCGACGTTGC",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 0,
       "matchedRight": 25,
       "matchedTotal": 25,
       "matched3PrimeSequence": "CAATCGACGTTGCAATCGACGTTGC",
       "matched3PrimeLength": 25,
       "tmMutant": 62.38992697970849,
       "tmMatched3Prime": 62.38992697970849,
       "mutantStart": 121,
       "mutantEnd": 145,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTGCAACGTC",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 0,
       "matchedRight": 25,
       "matchedTotal": 25,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTGCAACGTC",
       "matched3PrimeLength": 25,
       "tmMutant": 62.38992697970849,
       "tmMatched3Prime": 62.38992697970849,
       "mutantStart": 120,
       "mutantEnd": 96,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 0.0,
      "product": {
       "length": 234,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       2.0,
       121,
       25,
       25
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "CAATCGACGTTGCAATCG",
       "length": 18,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 18,
       "matchedTotal": 18,
       "matched3PrimeSequence": "CAATCGACGTTGCAATCG",
       "matched3PrimeLength": 18,
       "tmMutant": 52.92788113295046,
       "tmMatched3Prime": 52.92788113295046,
       "mutantStart": 121,
       "mutantEnd": 138,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTG",
       "length": 18,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 18,
       "matchedTotal": 18,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTG",
       "matched3PrimeLength": 18,
       "tmMutant": 52.92788113295046,
       "tmMatched3Prime": 52.92788113295046,
       "mutantStart": 120,
       "mutantEnd": 103,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 0.0,
      "product": {
       "length": 234,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       12.0,
       121,
       18,
       18
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "CAATCGACGTTGCAATCGACGTTGCAATCG",
       "length": 30,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 30,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CAATCGACGTTGCAATCGACGTTGCAATCG",
       "matched3PrimeLength": 30,
       "tmMutant": 64.7693111976372,
       "tmMatched3Prime": 64.7693111976372,
       "mutantStart": 121,
       "mutantEnd": 150,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTGCAACGTCGATTG",
       "length": 30,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 30,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTGCAACGTCGATTG",
       "matched3PrimeLength": 30,
       "tmMutant": 64.7693111976372,
       "tmMatched3Prime": 64.7693111976372,
       "mutantStart": 120,
       "mutantEnd": 91,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 0.0,
      "product": {
       "length": 234,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       0,
       0,
       12.0,
       121,
       30,
       30
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "CAATCGACGTTGCAATCGACGTTGCAATCG",
       "length": 30,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 30,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CAATCGACGTTGCAATCGACGTTGCAATCG",
       "matched3PrimeLength": 30,
       "tmMutant": 64.7693111976372,
       "tmMatched3Prime": 64.7693111976372,
       "mutantStart": 121,
       "mutantEnd": 150,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTGCAACGTCGA",
       "length": 27,
       "gc": 51.851851851851855,
       "matchedLeft": 0,
       "matchedRight": 27,
       "matchedTotal": 27,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTGCAACGTCGA",
       "matched3PrimeLength": 27,
       "tmMutant": 64.74746048376153,
       "tmMatched3Prime": 64.74746048376153,
       "mutantStart": 120,
       "mutantEnd": 94,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 0.02185071387566495,
      "product": {
       "length": 234,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       21851,
       0,
       9.0,
       121,
       30,
       27
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "CAATCGACGTTGCAATCGACGTTGCAATCG",
       "length": 30,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 30,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CAATCGACGTTGCAATCGACGTTGCAATCG",
       "matched3PrimeLength": 30,
       "tmMutant": 64.7693111976372,
       "tmMatched3Prime": 64.7693111976372,
       "mutantStart": 121,
       "mutantEnd": 150,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "partner": {
       "sequence": "CGATTGCAACGTCGATTGCAACGTCGAT",
       "length": 28,
       "gc": 50.0,
       "matchedLeft": 0,
       "matchedRight": 28,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CGATTGCAACGTCGATTGCAACGTCGAT",
       "matched3PrimeLength": 28,
       "tmMutant": 64.4409016282109,
       "tmMatched3Prime": 64.4409016282109,
       "mutantStart": 120,
       "mutantEnd": 93,
       "crossesOrigin": false,
       "fullyMatched": true
      },
      "deltaTm": 0.32840956942629873,
      "product": {
       "length": 234,
       "topology": "linear",
       "needsCircularisation": true
      },
      "rankTerms": [
       328410,
       0,
       10.0,
       121,
       30,
       28
      ]
     }
    ]
   }
  },
  {
   "id": "gc-rich-refuses-outside-thirty-to-seventy",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "A substitution inside a GC-rich stretch: every window above 70 percent GC is rejected under the hard rule and counted, and nothing is relaxed.",
   "input": {
    "templateName": "hand-228-gc",
    "template": "GCCGGCCGCGGCCGCGCCGGCGCGGCCGCGGCCGCCGGCGCGGCCGCGGCCGCGCCGGCCGGCCGCGGCCGCGCCGGCGCGGCCGCGGCCGCCGGCGCGGCCGCGGCCGCGCCGATTTAAATCAATTAAGCTAATTTAAACGATTTAAATCAATTAAGCTAATTTAAACGAATTTAAATCAATTAAGCTAATTTAAACGATTTAAATCAATTAAGCTAATTTAAACGA",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 40,
     "bases": "A"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 228,
    "mutantOrigin": 1,
    "mutant": "GCCGGCCGCGGCCGCGCCGGCGCGGCCGCGGCCGCCGGCACGGCCGCGGCCGCGCCGGCCGGCCGCGGCCGCGCCGGCGCGGCCGCGGCCGCCGGCGCGGCCGCGGCCGCGCCGATTTAAATCAATTAAGCTAATTTAAACGATTTAAATCAATTAAGCTAATTTAAACGAATTTAAATCAATTAAGCTAATTTAAACGATTTAAATCAATTAAGCTAATTTAAACGA",
    "changedMutantSpan": [
     40,
     40
    ],
    "wtBases": "G",
    "mutantBases": "A",
    "unchangedOffsets": [],
    "counts": {
     "windows": 735,
     "boundary": 15,
     "length": 0,
     "flankShort": 405,
     "offCentre": 242,
     "gc": 73,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 0
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": []
   }
  },
  {
   "id": "mixed-composition-preferred-band",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "A substitution in a template of alternating AT-rich and GC-rich runs: the windows span the preferred GC band, so the band's place in the order can be read.",
   "input": {
    "templateName": "hand-240-mixed",
    "template": "ATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGC",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 120,
     "bases": "A"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 240,
    "mutantOrigin": 1,
    "mutant": "ATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGAATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGCATTAATTAATGCCGGCCGGC",
    "changedMutantSpan": [
     120,
     120
    ],
    "wtBases": "C",
    "mutantBases": "A",
    "unchangedOffsets": [],
    "counts": {
     "windows": 735,
     "boundary": 0,
     "length": 0,
     "flankShort": 420,
     "offCentre": 242,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 73
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "ATTAATGCCGGCCGGAATTAATTAATGCCGG",
       "length": 31,
       "gc": 45.16129032258065,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "ATTAATTAATGCCGG",
       "matched3PrimeLength": 15,
       "tmMutant": 63.51422598754249,
       "tmMatched3Prime": 38.56638852305963,
       "mutantStart": 105,
       "mutantEnd": 135,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CCGGCATTAATTAATTCCGGCCGGCATTAAT",
       "length": 31,
       "gc": 45.16129032258065,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CCGGCCGGCATTAAT",
       "matched3PrimeLength": 15,
       "tmMutant": 63.5142259875426,
       "tmMatched3Prime": 53.98471894179181,
       "mutantStart": 135,
       "mutantEnd": 105,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       4.0,
       105,
       31
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "TTAATGCCGGCCGGAATTAATTAATGCCG",
       "length": 29,
       "gc": 44.827586206896555,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "ATTAATTAATGCCG",
       "matched3PrimeLength": 14,
       "tmMutant": 62.163374869851054,
       "tmMatched3Prime": 33.77763181369676,
       "mutantStart": 106,
       "mutantEnd": 134,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CGGCATTAATTAATTCCGGCCGGCATTAA",
       "length": 29,
       "gc": 44.827586206896555,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CCGGCCGGCATTAA",
       "matched3PrimeLength": 14,
       "tmMutant": 62.16337486985128,
       "tmMatched3Prime": 53.8825486395304,
       "mutantStart": 134,
       "mutantEnd": 106,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       6.0,
       106,
       29
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "TAATGCCGGCCGGAATTAATTAATGCC",
       "length": 27,
       "gc": 44.44444444444444,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "ATTAATTAATGCC",
       "matched3PrimeLength": 13,
       "tmMutant": 60.47248899811211,
       "tmMatched3Prime": 27.50205091483241,
       "mutantStart": 107,
       "mutantEnd": 133,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GGCATTAATTAATTCCGGCCGGCATTA",
       "length": 27,
       "gc": 44.44444444444444,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CCGGCCGGCATTA",
       "matched3PrimeLength": 13,
       "tmMutant": 60.47248899811217,
       "tmMatched3Prime": 53.497377604693725,
       "mutantStart": 133,
       "mutantEnd": 107,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       8.0,
       107,
       27
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "AATGCCGGCCGGAATTAATTAATGC",
       "length": 25,
       "gc": 44.0,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "ATTAATTAATGC",
       "matched3PrimeLength": 12,
       "tmMutant": 59.19415542110215,
       "tmMatched3Prime": 21.1312699848408,
       "mutantStart": 108,
       "mutantEnd": 132,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GCATTAATTAATTCCGGCCGGCATT",
       "length": 25,
       "gc": 44.0,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "CCGGCCGGCATT",
       "matched3PrimeLength": 12,
       "tmMutant": 59.194155421102266,
       "tmMatched3Prime": 54.37785775007973,
       "mutantStart": 132,
       "mutantEnd": 108,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       10.0,
       108,
       25
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "TAATTAATGCCGGCCGGAATTAATTAATGCCGGCC",
       "length": 35,
       "gc": 45.714285714285715,
       "matchedLeft": 17,
       "matchedRight": 17,
       "matchedTotal": 34,
       "matched3PrimeSequence": "ATTAATTAATGCCGGCC",
       "matched3PrimeLength": 17,
       "tmMutant": 65.71619467502859,
       "tmMatched3Prime": 47.35169947902489,
       "mutantStart": 103,
       "mutantEnd": 137,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GGCCGGCATTAATTAATTCCGGCCGGCATTAATTA",
       "length": 35,
       "gc": 45.714285714285715,
       "matchedLeft": 17,
       "matchedRight": 17,
       "matchedTotal": 34,
       "matched3PrimeSequence": "CCGGCCGGCATTAATTA",
       "matched3PrimeLength": 17,
       "tmMutant": 65.71619467502859,
       "tmMatched3Prime": 53.63492749238145,
       "mutantStart": 137,
       "mutantEnd": 103,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       1,
       0,
       0.0,
       103,
       35
      ]
     }
    ]
   }
  },
  {
   "id": "substitution-short-linear-unequal-flanks",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "The CSO's counter-example of 17 October 2026 (build review, finding 2): on a 25-base linear template the ends leave one window, so the returned candidate carries unequal flanks (11 and 13) inside the 3-base tolerance, and the reverse primer's flanks are the forward primer's the other way round.",
   "input": {
    "templateName": "hand-25",
    "template": "ACGTACGTACGTATGCATGCATGCA",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 12,
     "bases": "C"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 25,
    "mutantOrigin": 1,
    "mutant": "ACGTACGTACGCATGCATGCATGCA",
    "changedMutantSpan": [
     12,
     12
    ],
    "wtBases": "T",
    "mutantBases": "C",
    "unchangedOffsets": [],
    "counts": {
     "windows": 735,
     "boundary": 734,
     "length": 0,
     "flankShort": 0,
     "offCentre": 0,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 1
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "ACGTACGTACGCATGCATGCATGCA",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 11,
       "matchedRight": 13,
       "matchedTotal": 24,
       "matched3PrimeSequence": "ATGCATGCATGCA",
       "matched3PrimeLength": 13,
       "tmMutant": 64.6518668266786,
       "tmMatched3Prime": 44.55806569025361,
       "mutantStart": 1,
       "mutantEnd": 25,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "TGCATGCATGCATGCGTACGTACGT",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 13,
       "matchedRight": 11,
       "matchedTotal": 24,
       "matched3PrimeSequence": "CGTACGTACGT",
       "matched3PrimeLength": 11,
       "tmMutant": 64.65186682667866,
       "tmMatched3Prime": 37.17730909169137,
       "mutantStart": 25,
       "mutantEnd": 1,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       2,
       1,
       0,
       10.0,
       1,
       25
      ]
     }
    ]
   }
  },
  {
   "id": "substitution-overlap-magnesium",
   "oracle": "sdm_primers.py (Biopython MeltingTemp.Tm_NN for every Tm and reverse complement; the mutant, windows, flanks, GC, ranking and counts derived in the script)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17",
   "notes": "The same change with Mg2+ and dNTPs in the conditions, so the Owczarzy 2008 correction is the one the Tm carries.",
   "input": {
    "templateName": "hand-240-circular",
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "circular",
    "change": {
     "kind": "substitution",
     "position": 121,
     "bases": "G"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 1.5,
     "dntp_mM": 0.2,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2008"
    }
   },
   "expected": {
    "method": "sdm-primers-v1",
    "scheme": "overlapping-complementary",
    "mutantLength": 240,
    "mutantOrigin": 1,
    "mutant": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGGCGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "changedMutantSpan": [
     121,
     121
    ],
    "wtBases": "A",
    "mutantBases": "G",
    "unchangedOffsets": [],
    "counts": {
     "windows": 735,
     "boundary": 0,
     "length": 0,
     "flankShort": 420,
     "offCentre": 242,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 73
    },
    "candidateCap": 5000,
    "capped": false,
    "candidates": [
     {
      "rank": 1,
      "forward": {
       "sequence": "TCGACGTTGCAATCGGCGTTGCAATCGACGT",
       "length": 31,
       "gc": 54.83870967741935,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CGTTGCAATCGACGT",
       "matched3PrimeLength": 15,
       "tmMutant": 76.69244853349102,
       "tmMatched3Prime": 56.631078400913964,
       "mutantStart": 106,
       "mutantEnd": 136,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "ACGTCGATTGCAACGCCGATTGCAACGTCGA",
       "length": 31,
       "gc": 54.83870967741935,
       "matchedLeft": 15,
       "matchedRight": 15,
       "matchedTotal": 30,
       "matched3PrimeSequence": "CGATTGCAACGTCGA",
       "matched3PrimeLength": 15,
       "tmMutant": 76.69244853349102,
       "tmMatched3Prime": 56.27924052173739,
       "mutantStart": 136,
       "mutantEnd": 106,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       4.0,
       106,
       31
      ]
     },
     {
      "rank": 2,
      "forward": {
       "sequence": "CGACGTTGCAATCGGCGTTGCAATCGACG",
       "length": 29,
       "gc": 58.62068965517241,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CGTTGCAATCGACG",
       "matched3PrimeLength": 14,
       "tmMutant": 75.3650727337021,
       "tmMatched3Prime": 54.1637052258601,
       "mutantStart": 107,
       "mutantEnd": 135,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CGTCGATTGCAACGCCGATTGCAACGTCG",
       "length": 29,
       "gc": 58.62068965517241,
       "matchedLeft": 14,
       "matchedRight": 14,
       "matchedTotal": 28,
       "matched3PrimeSequence": "CGATTGCAACGTCG",
       "matched3PrimeLength": 14,
       "tmMutant": 75.3650727337021,
       "tmMatched3Prime": 54.16370522586021,
       "mutantStart": 135,
       "mutantEnd": 107,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       6.0,
       107,
       29
      ]
     },
     {
      "rank": 3,
      "forward": {
       "sequence": "GACGTTGCAATCGGCGTTGCAATCGAC",
       "length": 27,
       "gc": 55.55555555555556,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CGTTGCAATCGAC",
       "matched3PrimeLength": 13,
       "tmMutant": 72.56346982859611,
       "tmMatched3Prime": 49.51031875463144,
       "mutantStart": 108,
       "mutantEnd": 134,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "GTCGATTGCAACGCCGATTGCAACGTC",
       "length": 27,
       "gc": 55.55555555555556,
       "matchedLeft": 13,
       "matchedRight": 13,
       "matchedTotal": 26,
       "matched3PrimeSequence": "CGATTGCAACGTC",
       "matched3PrimeLength": 13,
       "tmMutant": 72.56346982859617,
       "tmMatched3Prime": 49.5103187546315,
       "mutantStart": 134,
       "mutantEnd": 108,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       8.0,
       108,
       27
      ]
     },
     {
      "rank": 4,
      "forward": {
       "sequence": "ACGTTGCAATCGGCGTTGCAATCGA",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "CGTTGCAATCGA",
       "matched3PrimeLength": 12,
       "tmMutant": 71.88371978346237,
       "tmMatched3Prime": 46.26835155470434,
       "mutantStart": 109,
       "mutantEnd": 133,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "TCGATTGCAACGCCGATTGCAACGT",
       "length": 25,
       "gc": 52.0,
       "matchedLeft": 12,
       "matchedRight": 12,
       "matchedTotal": 24,
       "matched3PrimeSequence": "CGATTGCAACGT",
       "matched3PrimeLength": 12,
       "tmMutant": 71.88371978346242,
       "tmMatched3Prime": 46.71551172354424,
       "mutantStart": 133,
       "mutantEnd": 109,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       0,
       0,
       10.0,
       109,
       25
      ]
     },
     {
      "rank": 5,
      "forward": {
       "sequence": "AATCGACGTTGCAATCGGCGTTGCAATCGACGTTG",
       "length": 35,
       "gc": 51.42857142857143,
       "matchedLeft": 17,
       "matchedRight": 17,
       "matchedTotal": 34,
       "matched3PrimeSequence": "CGTTGCAATCGACGTTG",
       "matched3PrimeLength": 17,
       "tmMutant": 76.23828819758643,
       "tmMatched3Prime": 59.12649937284374,
       "mutantStart": 104,
       "mutantEnd": 138,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "reverse": {
       "sequence": "CAACGTCGATTGCAACGCCGATTGCAACGTCGATT",
       "length": 35,
       "gc": 51.42857142857143,
       "matchedLeft": 17,
       "matchedRight": 17,
       "matchedTotal": 34,
       "matched3PrimeSequence": "CGATTGCAACGTCGATT",
       "matched3PrimeLength": 17,
       "tmMutant": 76.23828819758648,
       "tmMatched3Prime": 57.619475398155316,
       "mutantStart": 138,
       "mutantEnd": 104,
       "crossesOrigin": false,
       "fullyMatched": false
      },
      "rankTerms": [
       0,
       1,
       0,
       0.0,
       104,
       35
      ]
     }
    ]
   }
  },
  {
   "id": "refuse-template-letter",
   "input": {
    "template": "ACGTACGTACGTNTGCATGCATGCA",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 13,
     "bases": "C"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "template",
    "messagePattern": "A, C, G",
    "message": "template: not A, C, G or T: N at 13"
   },
   "notes": "An N in the template refuses before any enumeration; nothing is dropped or guessed.",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-no-change",
   "input": {
    "template": "ACGTACGTACGTATGCATGCATGCA",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 13,
     "bases": "A"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "bases",
    "messagePattern": "already match",
    "message": "bases: these bases already match the template at this position, so this is not a change"
   },
   "notes": "A substitution identical to the template at every position is not a change (CSO rule 3).",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-position-outside",
   "input": {
    "template": "ACGTACGTACGTATGCATGCATGCA",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 99,
     "bases": "C"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "position",
    "messagePattern": "outside the template",
    "message": "position: base 99 is outside the template (1 to 25)"
   },
   "notes": "A position beyond the template refuses, naming the range.",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-insertion-too-long",
   "input": {
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "linear",
    "change": {
     "kind": "insertion",
     "position": 120,
     "bases": "GGCCTTAAGGCCT"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "bases",
    "messagePattern": "1 to 12",
    "message": "bases: an insertion adds 1 to 12 bases of A, C, G or T"
   },
   "notes": "An insertion of 13 bases is over the published limit and is refused, not truncated.",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-deletion-too-long",
   "input": {
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "circular",
    "change": {
     "kind": "deletion",
     "position": 120,
     "length": 13
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "length",
    "messagePattern": "1 to 12",
    "message": "length: a deletion removes 1 to 12 bases"
   },
   "notes": "A deletion of 13 bases is over the published limit.",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-template-too-short",
   "input": {
    "template": "A",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 1,
     "bases": "C"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "template",
    "messagePattern": "2 to 50,000",
    "message": "template: a template of 2 to 50,000 bases is the design ceiling"
   },
   "notes": "A template below the floor is refused before any enumeration (the CSO's rule 20).",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-back-to-back-linear",
   "input": {
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 121,
     "bases": "G"
    },
    "scheme": "back-to-back",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": true,
    "field": "scheme",
    "messagePattern": "circular template",
    "message": "scheme: back-to-back primers copy the whole molecule for circularisation, so this design needs a circular template"
   },
   "notes": "The back-to-back scheme copies the whole molecule for circularisation, so a linear template is refused (CSO rule 13).",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  },
  {
   "id": "refuse-linear-end-no-flank",
   "input": {
    "template": "ACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCGACGTTGCAATCG",
    "topology": "linear",
    "change": {
     "kind": "substitution",
     "position": 3,
     "bases": "A"
    },
    "scheme": "overlapping-complementary",
    "conditions": {
     "oligo_nM": 250,
     "na_mM": 50,
     "mg_mM": 0,
     "dntp_mM": 0,
     "model": "primer-excess",
     "saltCorrection": "owczarzy-2004"
    }
   },
   "expected": {
    "refused": false,
    "noDesign": true,
    "field": "flankShort",
    "counts": {
     "windows": 735,
     "boundary": 672,
     "length": 0,
     "flankShort": 63,
     "offCentre": 0,
     "gc": 0,
     "abutment": 0,
     "matched3PrimeShort": 0,
     "deltaTm": 0,
     "passed": 0
    },
    "mutantLength": 240
   },
   "notes": "A change three bases from a linear template's end leaves no 10-base 5' flank: no design under these rules, with the counts by reason, and nothing relaxed.",
   "oracle": "sdm_primers.py (the refusal derived from the published rules)",
   "oracleVersion": "Biopython 1.88",
   "recordedOn": "2026-10-17"
  }
 ]
}
