{
 "about": {
  "generatedBy": "pipeline/sequence-toolkit/reference.py",
  "scriptSha256": "1bc66633d1a780a7f255b02743e9258652769ed35b770f193c5d74e0070410d6",
  "recordedOn": "2026-10-06",
  "python": "3.11.15",
  "oracle": "primer3-py 2.3.1 (calc_hairpin, calc_homodimer, calc_heterodimer: the ntthal thermodynamic alignment of libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
  "oracleLicence": "GPL-2.0-or-later: build-time oracle only, never shipped; its primer3_config parameter files are never copied",
  "rule": "No value in this file comes from the Drybench engine under test.",
  "fixture": "Hairpin and dimer dG at 37 C, 20 cases (brief section 4.3 (3))",
  "tolerance": "Brief: dG = ntthal within 0.1 kcal/mol",
  "units": "dG and dH in cal/mol as ntthal reports them, dG also in kcal/mol; dS in cal/(K mol); structureTm_C is the structure's melting temperature",
  "noStructure": "When ntthal finds no structure it reports structureFound false with dG, dH, dS and Tm all 0. CSO ruling: those cases assert that the engine reports no structure with dG below -0.1 kcal/mol.",
  "conditions": "mv = monovalent cations (mM), dv = divalent cations (mM), dNTP (mM), dna = strand concentration (nM)",
  "saltMethod": "Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method.",
  "sodiumEquivalentConfirmedOn": [
   "H01",
   "H04",
   "H05",
   "H06",
   "H08",
   "D01",
   "D02",
   "D03",
   "D04",
   "D06",
   "X01",
   "X02",
   "X03",
   "X04",
   "X05",
   "X06"
  ],
  "crossCheck": "Each case is rerun through the ntthal command-line program bundled in the primer3-py package (same library) where present; ntthalCli null means it was not found."
 },
 "cases": [
  {
   "id": "H01",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "CCCCCATCCGATCAGGGGG"
    ],
    "lengths": [
     19
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -3.1769186867678436,
    "dG_cal_per_mol": -3176.9186867678436,
    "dH_cal_per_mol": -36300.0,
    "dS_cal_per_K_mol": -106.7969734426315,
    "structureTm_C": 66.7472726460212,
    "asciiStructure": [
     "SEQ\t/////---------\\\\\\\\\\",
     "STR\tCCCCCATCCGATCAGGGGG"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -3176.92,
     "dh_cal_per_mol": -36300.0,
     "ds_cal_per_K_mol": -106.797,
     "tm_C": 66.7473,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 CCCCCATCCGATCAGGGGG"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -3176.9186867678436,
     "dH_cal_per_mol": -36300.0,
     "dS_cal_per_K_mol": -106.7969734426315,
     "structureTm_C": 66.7472726460212,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('CCCCCATCCGATCAGGGGG', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "GC stem, 9-nt loop"
  },
  {
   "id": "H02",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "GCGCGAAAAAACGCGC"
    ],
    "lengths": [
     16
    ],
    "monovalent_mM": 50,
    "divalent_mM": 0,
    "dNTP_mM": 0,
    "sodiumEquivalent_mM": 50,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -4.790555993437483,
    "dG_cal_per_mol": -4790.555993437483,
    "dH_cal_per_mol": -48800.0,
    "dS_cal_per_K_mol": -141.8972884299936,
    "structureTm_C": 70.7607296548232,
    "asciiStructure": [
     "SEQ\t/////------\\\\\\\\\\",
     "STR\tGCGCGAAAAAACGCGC"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -4790.56,
     "dh_cal_per_mol": -48800.0,
     "ds_cal_per_K_mol": -141.897,
     "tm_C": 70.7607,
     "command": "ntthal -mv 50 -dv 0 -n 0 -d 50 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 GCGCGAAAAAACGCGC"
    },
    "sodiumEquivalentRerun": null
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('GCGCGAAAAAACGCGC', mv_conc=50, dv_conc=0, dntp_conc=0, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "GC stem, A6 loop, no Mg2+ or dNTP"
  },
  {
   "id": "H03",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "ATATATTTTTTATATAT"
    ],
    "lengths": [
     17
    ],
    "monovalent_mM": 50,
    "divalent_mM": 0,
    "dNTP_mM": 0,
    "sodiumEquivalent_mM": 50,
    "dna_nM": 250,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": false,
    "dG_kcal_per_mol": 0.0,
    "dG_cal_per_mol": 0.0,
    "dH_cal_per_mol": 0.0,
    "dS_cal_per_K_mol": 0.0,
    "structureTm_C": 0.0,
    "asciiStructure": [],
    "noStructureBelow_kcal_per_mol": -0.1,
    "assert": "the engine reports no structure with dG below -0.1 kcal/mol (CSO ruling, 6 October 2026)"
   },
   "crossCheck": {
    "ntthalCli": {
     "structureFound": false,
     "output": "No secondary structure could be calculated",
     "command": "ntthal -mv 50 -dv 0 -n 0 -d 250 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 ATATATTTTTTATATAT"
    },
    "sodiumEquivalentRerun": null
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('ATATATTTTTTATATAT', mv_conc=50, dv_conc=0, dntp_conc=0, dna_conc=250, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "AT palindromic stem too weak to report: no structure"
  },
  {
   "id": "H04",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "ACTGCAGGCTTGCGATTTTCGCAAGCC"
    ],
    "lengths": [
     27
    ],
    "monovalent_mM": 50,
    "divalent_mM": 2.0,
    "dNTP_mM": 0.8,
    "sodiumEquivalent_mM": 181.45341380123986,
    "dna_nM": 250,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -9.208836173278076,
    "dG_cal_per_mol": -9208.836173278076,
    "dH_cal_per_mol": -72100.0,
    "dS_cal_per_K_mol": -202.77660430992077,
    "structureTm_C": 82.4137014702319,
    "asciiStructure": [
     "SEQ\t------/////////---\\\\\\\\\\\\\\\\\\",
     "STR\tACTGCAGGCTTGCGATTTTCGCAAGCC"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -9208.84,
     "dh_cal_per_mol": -72100.0,
     "ds_cal_per_K_mol": -202.777,
     "tm_C": 82.4137,
     "command": "ntthal -mv 50 -dv 2.0 -n 0.8 -d 250 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 ACTGCAGGCTTGCGATTTTCGCAAGCC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 181.45341380123986,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -9208.836173278076,
     "dH_cal_per_mol": -72100.0,
     "dS_cal_per_K_mol": -202.77660430992077,
     "structureTm_C": 82.4137014702319,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('ACTGCAGGCTTGCGATTTTCGCAAGCC', mv_conc=50, dv_conc=2.0, dntp_conc=0.8, dna_conc=250, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "3' hairpin with a 9-bp stem"
  },
  {
   "id": "H05",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "TTTTTTTTTTTTTTTTTTTT"
    ],
    "lengths": [
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": false,
    "dG_kcal_per_mol": 0.0,
    "dG_cal_per_mol": 0.0,
    "dH_cal_per_mol": 0.0,
    "dS_cal_per_K_mol": 0.0,
    "structureTm_C": 0.0,
    "asciiStructure": [],
    "noStructureBelow_kcal_per_mol": -0.1,
    "assert": "the engine reports no structure with dG below -0.1 kcal/mol (CSO ruling, 6 October 2026)"
   },
   "crossCheck": {
    "ntthalCli": {
     "structureFound": false,
     "output": "No secondary structure could be calculated",
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 TTTTTTTTTTTTTTTTTTTT"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": 0.0,
     "dH_cal_per_mol": 0.0,
     "dS_cal_per_K_mol": 0.0,
     "structureTm_C": 0.0,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('TTTTTTTTTTTTTTTTTTTT', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "poly(dT): no structure"
  },
  {
   "id": "H06",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "GAATTTATTGAAAACAATAAATTC"
    ],
    "lengths": [
     24
    ],
    "monovalent_mM": 50,
    "divalent_mM": 3.0,
    "dNTP_mM": 0.2,
    "sodiumEquivalent_mM": 250.79840636817812,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -3.616759080749798,
    "dG_cal_per_mol": -3616.759080749798,
    "dH_cal_per_mol": -67400.0,
    "dS_cal_per_K_mol": -205.65288060374078,
    "structureTm_C": 54.58671733715562,
    "asciiStructure": [
     "SEQ\t/////////------\\\\\\\\\\\\\\\\\\",
     "STR\tGAATTTATTGAAAACAATAAATTC"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -3616.76,
     "dh_cal_per_mol": -67400.0,
     "ds_cal_per_K_mol": -205.653,
     "tm_C": 54.5867,
     "command": "ntthal -mv 50 -dv 3.0 -n 0.2 -d 50 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 GAATTTATTGAAAACAATAAATTC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 250.79840636817812,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -3616.759080749798,
     "dH_cal_per_mol": -67400.0,
     "dS_cal_per_K_mol": -205.65288060374078,
     "structureTm_C": 54.58671733715562,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('GAATTTATTGAAAACAATAAATTC', mv_conc=50, dv_conc=3.0, dntp_conc=0.2, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "AT-rich 9-bp stem that is reported"
  },
  {
   "id": "H07",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "GGATCCGAATTCGGATCC"
    ],
    "lengths": [
     18
    ],
    "monovalent_mM": 50,
    "divalent_mM": 0,
    "dNTP_mM": 0,
    "sodiumEquivalent_mM": 50,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -5.1207304890604135,
    "dG_cal_per_mol": -5120.730489060414,
    "dH_cal_per_mol": -56200.0,
    "dS_cal_per_K_mol": -164.6921473833293,
    "structureTm_C": 68.09274224922007,
    "asciiStructure": [
     "SEQ\t///////----\\\\\\\\\\\\\\",
     "STR\tGGATCCGAATTCGGATCC"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -5120.73,
     "dh_cal_per_mol": -56200.0,
     "ds_cal_per_K_mol": -164.692,
     "tm_C": 68.0927,
     "command": "ntthal -mv 50 -dv 0 -n 0 -d 50 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 GGATCCGAATTCGGATCC"
    },
    "sodiumEquivalentRerun": null
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('GGATCCGAATTCGGATCC', mv_conc=50, dv_conc=0, dntp_conc=0, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "palindromic restriction-site primer"
  },
  {
   "id": "H08",
   "input": {
    "kind": "hairpin",
    "sequences": [
     "TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC"
    ],
    "lengths": [
     44
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 500,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -11.416979018137397,
    "dG_cal_per_mol": -11416.979018137397,
    "dH_cal_per_mol": -91700.0,
    "dS_cal_per_K_mol": -258.8522359563521,
    "structureTm_C": 81.10616341001025,
    "asciiStructure": [
     "SEQ\t---////////////----------\\\\\\\\\\\\\\\\\\\\\\\\-------",
     "STR\tTTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -11417.0,
     "dh_cal_per_mol": -91700.0,
     "ds_cal_per_K_mol": -258.852,
     "tm_C": 81.1062,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 500 -t 37 -a HAIRPIN -maxloop 30 -path <primer3_config>/ -s1 TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -11416.979018137397,
     "dH_cal_per_mol": -91700.0,
     "dS_cal_per_K_mol": -258.8522359563521,
     "structureTm_C": 81.10616341001025,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_hairpin",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_hairpin('TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=500, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "44-mer with an internal 12-bp stem"
  },
  {
   "id": "D01",
   "input": {
    "kind": "homodimer",
    "sequences": [
     "GCGAATTCGCATGCAAGCTT"
    ],
    "lengths": [
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -12.063251060300448,
    "dG_cal_per_mol": -12063.251060300448,
    "dH_cal_per_mol": -91800.0,
    "dS_cal_per_K_mol": -257.0909203279044,
    "structureTm_C": 39.89020509635009,
    "asciiStructure": [
     "SEQ\t                    ATGCAAGCTT",
     "SEQ\t          GCGAATTCGC",
     "STR\t          CGCTTAAGCG",
     "STR\tTTCGAACGTA          ----------"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -12063.3,
     "dh_cal_per_mol": -91800.0,
     "ds_cal_per_K_mol": -257.091,
     "tm_C": 39.8902,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 GCGAATTCGCATGCAAGCTT -s2 GCGAATTCGCATGCAAGCTT"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -12063.251060300448,
     "dH_cal_per_mol": -91800.0,
     "dS_cal_per_K_mol": -257.0909203279044,
     "structureTm_C": 39.89020509635009,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_homodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_homodimer('GCGAATTCGCATGCAAGCTT', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "EcoRI and SphI/HindIII palindromes"
  },
  {
   "id": "D02",
   "input": {
    "kind": "homodimer",
    "sequences": [
     "TTGCCAGTCAAGTCAGCATGC"
    ],
    "lengths": [
     21
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 250,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -6.453686144614119,
    "dG_cal_per_mol": -6453.686144614119,
    "dH_cal_per_mol": -51000.0,
    "dS_cal_per_K_mol": -143.62828907104912,
    "structureTm_C": 15.651043100431934,
    "asciiStructure": [
     "SEQ\tTTGCCAGTCAAGTCA      ---------------",
     "SEQ\t               GCATGC",
     "STR\t               CGTACG",
     "STR\t                     ACTGAACTGACCGTT"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -6453.69,
     "dh_cal_per_mol": -51000.0,
     "ds_cal_per_K_mol": -143.628,
     "tm_C": 15.651,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 250 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 TTGCCAGTCAAGTCAGCATGC -s2 TTGCCAGTCAAGTCAGCATGC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -6453.686144614119,
     "dH_cal_per_mol": -51000.0,
     "dS_cal_per_K_mol": -143.62828907104912,
     "structureTm_C": 15.651043100431934,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_homodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_homodimer('TTGCCAGTCAAGTCAGCATGC', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=250, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "3'-end self-dimer (GCATGC)"
  },
  {
   "id": "D03",
   "input": {
    "kind": "homodimer",
    "sequences": [
     "AAAAAAAAAAAAAAAAAAAA"
    ],
    "lengths": [
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": false,
    "dG_kcal_per_mol": 0.0,
    "dG_cal_per_mol": 0.0,
    "dH_cal_per_mol": 0.0,
    "dS_cal_per_K_mol": 0.0,
    "structureTm_C": 0.0,
    "asciiStructure": [],
    "noStructureBelow_kcal_per_mol": -0.1,
    "assert": "the engine reports no structure with dG below -0.1 kcal/mol (CSO ruling, 6 October 2026)"
   },
   "crossCheck": {
    "ntthalCli": {
     "structureFound": false,
     "output": "",
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 AAAAAAAAAAAAAAAAAAAA -s2 AAAAAAAAAAAAAAAAAAAA"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": 0.0,
     "dH_cal_per_mol": 0.0,
     "dS_cal_per_K_mol": 0.0,
     "structureTm_C": 0.0,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_homodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_homodimer('AAAAAAAAAAAAAAAAAAAA', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "poly(dA): no structure"
  },
  {
   "id": "D04",
   "input": {
    "kind": "homodimer",
    "sequences": [
     "CTGACGTAAGCTTACGTCAG"
    ],
    "lengths": [
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 3.0,
    "dNTP_mM": 0.8,
    "sodiumEquivalent_mM": 227.9887636902959,
    "dna_nM": 500,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -21.10962508516581,
    "dG_cal_per_mol": -21109.62508516581,
    "dH_cal_per_mol": -159200.0,
    "dS_cal_per_K_mol": -445.2373848616289,
    "structureTm_C": 62.66610170561444,
    "asciiStructure": [
     "SEQ\t",
     "SEQ\tCTGACGTAAGCTTACGTCAG",
     "STR\tGACTGCATTCGAATGCAGTC",
     "STR\t"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -21109.6,
     "dh_cal_per_mol": -159200.0,
     "ds_cal_per_K_mol": -445.237,
     "tm_C": 62.6661,
     "command": "ntthal -mv 50 -dv 3.0 -n 0.8 -d 500 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 CTGACGTAAGCTTACGTCAG -s2 CTGACGTAAGCTTACGTCAG"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 227.9887636902959,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -21109.62508516581,
     "dH_cal_per_mol": -159200.0,
     "dS_cal_per_K_mol": -445.2373848616289,
     "structureTm_C": 62.66610170561444,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_homodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_homodimer('CTGACGTAAGCTTACGTCAG', mv_conc=50, dv_conc=3.0, dntp_conc=0.8, dna_conc=500, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "fully self-complementary 20-mer"
  },
  {
   "id": "D05",
   "input": {
    "kind": "homodimer",
    "sequences": [
     "TAATACGACTCACTATAGGG"
    ],
    "lengths": [
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 0,
    "dNTP_mM": 0,
    "sodiumEquivalent_mM": 50,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -3.802312489063508,
    "dG_cal_per_mol": -3802.312489063508,
    "dH_cal_per_mol": -57400.0,
    "dS_cal_per_K_mol": -172.81214738331934,
    "structureTm_C": 1.5249329576598711,
    "asciiStructure": [
     "SEQ\tTAATACGACTCA      GG----------",
     "SEQ\t            CTATAG",
     "STR\t            GATATC",
     "STR\t          GG      ACTCAGCATAAT"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -3802.31,
     "dh_cal_per_mol": -57400.0,
     "ds_cal_per_K_mol": -172.812,
     "tm_C": 1.52493,
     "command": "ntthal -mv 50 -dv 0 -n 0 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 TAATACGACTCACTATAGGG -s2 TAATACGACTCACTATAGGG"
    },
    "sodiumEquivalentRerun": null
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_homodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_homodimer('TAATACGACTCACTATAGGG', mv_conc=50, dv_conc=0, dntp_conc=0, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "T7 promoter primer self-dimer"
  },
  {
   "id": "D06",
   "input": {
    "kind": "homodimer",
    "sequences": [
     "GGCCATTAGTCAGTACGGCC"
    ],
    "lengths": [
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 2.0,
    "dNTP_mM": 0.2,
    "sodiumEquivalent_mM": 210.99689437998487,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -3.5573715701965996,
    "dG_cal_per_mol": -3557.3715701965994,
    "dH_cal_per_mol": -75400.0,
    "dS_cal_per_K_mol": -231.63833122619187,
    "structureTm_C": 8.402896419512615,
    "asciiStructure": [
     "SEQ\t    ATTAGTCA    --------",
     "SEQ\tGGCC        GTAC        GGCC",
     "STR\tCCGG        CATG        CCGG",
     "STR\t    --------    ACTGATTA"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -3557.37,
     "dh_cal_per_mol": -75400.0,
     "ds_cal_per_K_mol": -231.638,
     "tm_C": 8.4029,
     "command": "ntthal -mv 50 -dv 2.0 -n 0.2 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 GGCCATTAGTCAGTACGGCC -s2 GGCCATTAGTCAGTACGGCC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 210.99689437998487,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -3557.3715701965994,
     "dH_cal_per_mol": -75400.0,
     "dS_cal_per_K_mol": -231.63833122619187,
     "structureTm_C": 8.402896419512615,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_homodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_homodimer('GGCCATTAGTCAGTACGGCC', mv_conc=50, dv_conc=2.0, dntp_conc=0.2, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "weak self-dimer with GGCC ends"
  },
  {
   "id": "X01",
   "input": {
    "kind": "heterodimer",
    "sequences": [
     "TAATACGACTCACTATAGGG",
     "CCCTATAGTGAGTCGTATTA"
    ],
    "lengths": [
     20,
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -17.312683349513186,
    "dG_cal_per_mol": -17312.683349513187,
    "dH_cal_per_mol": -148800.0,
    "dS_cal_per_K_mol": -423.94749847005266,
    "structureTm_C": 50.251175823530104,
    "asciiStructure": [
     "SEQ\t",
     "SEQ\tTAATACGACTCACTATAGGG",
     "STR\tATTATGCTGAGTGATATCCC",
     "STR\t"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -17312.7,
     "dh_cal_per_mol": -148800.0,
     "ds_cal_per_K_mol": -423.947,
     "tm_C": 50.2512,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 TAATACGACTCACTATAGGG -s2 CCCTATAGTGAGTCGTATTA"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -17312.683349513187,
     "dH_cal_per_mol": -148800.0,
     "dS_cal_per_K_mol": -423.94749847005266,
     "structureTm_C": 50.251175823530104,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_heterodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_heterodimer('TAATACGACTCACTATAGGG', 'CCCTATAGTGAGTCGTATTA', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "perfect 20-bp duplex"
  },
  {
   "id": "X02",
   "input": {
    "kind": "heterodimer",
    "sequences": [
     "AGCTTGACCTGAAGGCATGC",
     "TCAGTCCATGGATGGCATGC"
    ],
    "lengths": [
     20,
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 250,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -6.295416144614115,
    "dG_cal_per_mol": -6295.416144614115,
    "dH_cal_per_mol": -51400.0,
    "dS_cal_per_K_mol": -145.42828907104914,
    "structureTm_C": 14.979254174241419,
    "asciiStructure": [
     "SEQ\tAGCTTGACCTGAAG      --------------",
     "SEQ\t              GCATGC",
     "STR\t              CGTACG",
     "STR\t                    GTAGGTACCTGACT"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -6295.42,
     "dh_cal_per_mol": -51400.0,
     "ds_cal_per_K_mol": -145.428,
     "tm_C": 14.9793,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 250 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 AGCTTGACCTGAAGGCATGC -s2 TCAGTCCATGGATGGCATGC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -6295.416144614115,
     "dH_cal_per_mol": -51400.0,
     "dS_cal_per_K_mol": -145.42828907104914,
     "structureTm_C": 14.979254174241419,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_heterodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_heterodimer('AGCTTGACCTGAAGGCATGC', 'TCAGTCCATGGATGGCATGC', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=250, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "primer pair with complementary 3' ends"
  },
  {
   "id": "X03",
   "input": {
    "kind": "heterodimer",
    "sequences": [
     "AAAAAAAAAAAAAAAAAAAA",
     "CCCCCCCCCCCCCCCCCCCC"
    ],
    "lengths": [
     20,
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": false,
    "dG_kcal_per_mol": 0.0,
    "dG_cal_per_mol": 0.0,
    "dH_cal_per_mol": 0.0,
    "dS_cal_per_K_mol": 0.0,
    "structureTm_C": 0.0,
    "asciiStructure": [],
    "noStructureBelow_kcal_per_mol": -0.1,
    "assert": "the engine reports no structure with dG below -0.1 kcal/mol (CSO ruling, 6 October 2026)"
   },
   "crossCheck": {
    "ntthalCli": {
     "structureFound": false,
     "output": "",
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 AAAAAAAAAAAAAAAAAAAA -s2 CCCCCCCCCCCCCCCCCCCC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": 0.0,
     "dH_cal_per_mol": 0.0,
     "dS_cal_per_K_mol": 0.0,
     "structureTm_C": 0.0,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_heterodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_heterodimer('AAAAAAAAAAAAAAAAAAAA', 'CCCCCCCCCCCCCCCCCCCC', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "no complementarity: no structure"
  },
  {
   "id": "X04",
   "input": {
    "kind": "heterodimer",
    "sequences": [
     "GTAAAACGACGGCCAGT",
     "CAGGAAACAGCTATGAC"
    ],
    "lengths": [
     17,
     17
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -2.683046228927782,
    "dG_cal_per_mol": -2683.046228927782,
    "dH_cal_per_mol": -24600.0,
    "dS_cal_per_K_mol": -70.66565781419384,
    "structureTm_C": -42.872870427125406,
    "asciiStructure": [
     "SEQ\t GTAAAACGACGG  AGT",
     "SEQ\t             CC",
     "STR\t             GG",
     "STR\tCAGTATCGACAAA  AC-"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -2683.05,
     "dh_cal_per_mol": -24600.0,
     "ds_cal_per_K_mol": -70.6657,
     "tm_C": -42.8729,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 GTAAAACGACGGCCAGT -s2 CAGGAAACAGCTATGAC"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -2683.046228927782,
     "dH_cal_per_mol": -24600.0,
     "dS_cal_per_K_mol": -70.66565781419384,
     "structureTm_C": -42.872870427125406,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_heterodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_heterodimer('GTAAAACGACGGCCAGT', 'CAGGAAACAGCTATGAC', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "M13 forward and reverse pair"
  },
  {
   "id": "X05",
   "input": {
    "kind": "heterodimer",
    "sequences": [
     "CGCAAATGGGCGGTAGGCGTG",
     "TAGAAGGCACAGTCGAGG"
    ],
    "lengths": [
     21,
     18
    ],
    "monovalent_mM": 50,
    "divalent_mM": 3.0,
    "dNTP_mM": 0.8,
    "sodiumEquivalent_mM": 227.9887636902959,
    "dna_nM": 500,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -2.7107173818703996,
    "dG_cal_per_mol": -2710.7173818703995,
    "dH_cal_per_mol": -30200.0,
    "dS_cal_per_K_mol": -88.63221866235564,
    "structureTm_C": -21.941093476906133,
    "asciiStructure": [
     "SEQ\t CGCAAA  G  GGTAGGCGTG",
     "SEQ\t       TG GC",
     "STR\t       AC CG",
     "STR\tGGAGCTG  A  GAAGAT----"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -2710.72,
     "dh_cal_per_mol": -30200.0,
     "ds_cal_per_K_mol": -88.6322,
     "tm_C": -21.9411,
     "command": "ntthal -mv 50 -dv 3.0 -n 0.8 -d 500 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 CGCAAATGGGCGGTAGGCGTG -s2 TAGAAGGCACAGTCGAGG"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 227.9887636902959,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -2710.7173818703995,
     "dH_cal_per_mol": -30200.0,
     "dS_cal_per_K_mol": -88.63221866235564,
     "structureTm_C": -21.941093476906133,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_heterodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_heterodimer('CGCAAATGGGCGGTAGGCGTG', 'TAGAAGGCACAGTCGAGG', mv_conc=50, dv_conc=3.0, dntp_conc=0.8, dna_conc=500, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "CMV forward and BGH reverse pair"
  },
  {
   "id": "X06",
   "input": {
    "kind": "heterodimer",
    "sequences": [
     "TAATACGACTCACTATAGGG",
     "CCCTATAGTAAGTCGTATTA"
    ],
    "lengths": [
     20,
     20
    ],
    "monovalent_mM": 50,
    "divalent_mM": 1.5,
    "dNTP_mM": 0.6,
    "sodiumEquivalent_mM": 163.84199576606164,
    "dna_nM": 50,
    "temperature_C": 37,
    "maxLoop": 30
   },
   "expected": {
    "structureFound": true,
    "dG_kcal_per_mol": -12.49110212059156,
    "dG_cal_per_mol": -12491.10212059156,
    "dH_cal_per_mol": -121100.0,
    "dS_cal_per_K_mol": -350.1818406558389,
    "structureTm_C": 40.301235715325845,
    "asciiStructure": [
     "SEQ\t          C",
     "SEQ\tTAATACGACT ACTATAGGG",
     "STR\tATTATGCTGA TGATATCCC",
     "STR\t          A"
    ]
   },
   "crossCheck": {
    "ntthalCli": {
     "dg_cal_per_mol": -12491.1,
     "dh_cal_per_mol": -121100.0,
     "ds_cal_per_K_mol": -350.182,
     "tm_C": 40.3012,
     "command": "ntthal -mv 50 -dv 1.5 -n 0.6 -d 50 -t 37 -a ANY -maxloop 30 -path <primer3_config>/ -s1 TAATACGACTCACTATAGGG -s2 CCCTATAGTAAGTCGTATTA"
    },
    "sodiumEquivalentRerun": {
     "mv_conc": 163.84199576606164,
     "dv_conc": 0,
     "dntp_conc": 0,
     "dG_cal_per_mol": -12491.10212059156,
     "dH_cal_per_mol": -121100.0,
     "dS_cal_per_K_mol": -350.1818406558389,
     "structureTm_C": 40.301235715325845,
     "identical": true
    }
   },
   "method": {
    "id": "santalucia-hicks-2004",
    "salt": "von-ahsen-2001-sodium-equivalent",
    "text": "Two-state nearest-neighbour thermodynamic alignment (Primer3 thal), most stable structure, dG at 37 C. Salt by the sodium equivalent Na+ + 120 sqrt(Mg2+ - dNTP) mM (von Ahsen et al., Clin Chem 2001;47:1956-1961, as the Primer3 manual states; CSO read 6 October 2026), confirmed here by rerunning every case that has Mg2+ with that Na+ and Mg2+ = dNTP = 0 (identical results). Tm keeps Owczarzy 2008; this conversion is only the dG card's method."
   },
   "oracle": "primer3-py calc_heterodimer",
   "oracleVersion": "2.3.1 (libprimer3 release 2.6.1 (bundled with primer3-py 2.3.1))",
   "recordedOn": "2026-10-06",
   "source": "pipeline/sequence-toolkit/reference.py (hairpin-dimer)",
   "call": "primer3.bindings.calc_heterodimer('TAATACGACTCACTATAGGG', 'CCCTATAGTAAGTCGTATTA', mv_conc=50, dv_conc=1.5, dntp_conc=0.6, dna_conc=50, temp_c=37, max_loop=30, output_structure=True)",
   "notes": "20-bp duplex with one internal C-A mismatch (position 11 of the first strand)"
  }
 ]
}
