{
 "about": {
  "method": "ds-fragment-ends (src/lib/seq/ds-fragment.ts)",
  "oracle": "Worked by hand, each case written out base by base; re-derived from a two-strand drawing and checked; reverse complements by Biopython 1.88.",
  "recordedOn": "2026-10-10",
  "generatedBy": "pipeline/plasmid-map/ds-ends.py",
  "convention": "A cut is (topAfter, bottomAfter), the top-strand bases before each strand's cut. topAfter<bottomAfter is a 5' overhang, topAfter>bottomAfter a 3' overhang, equal is blunt. An end's overhang is 5'->3' on the protruding strand. Two ends anneal when both have the same polarity and one overhang is the reverse complement of the other (blunt to blunt). Writing a fragment out from the other strand reverse complements its top strand and swaps its two ends, each keeping its own overhang bases and polarity and changing which strand protrudes: a fragment and its reverse complement are one molecule and anneal in the same places.",
  "ruling": "CSO, 10 October 2026 (docs/board/memos/2026-10-10-cso-wave2-cloning.md §2.1 M5)."
 },
 "ends": [
  {
   "id": "ecori-5prime",
   "note": "EcoRI G^AATT_C: a 5' overhang AATT (palindromic, self-compatible).",
   "sequence": "TTGAATTCAA",
   "circular": false,
   "cut": {
    "enzyme": "EcoRI",
    "topAfter": 3,
    "bottomAfter": 7
   },
   "hand": {
    "leftFragmentRight": {
     "polarity": "5'",
     "seq": "AATT"
    },
    "rightFragmentLeft": {
     "polarity": "5'",
     "seq": "AATT"
    }
   },
   "compatibleSelf": true
  },
  {
   "id": "kpni-3prime",
   "note": "KpnI G_GTAC^C: a 3' overhang GTAC (palindromic).",
   "sequence": "TTGGTACCAA",
   "circular": false,
   "cut": {
    "enzyme": "KpnI",
    "topAfter": 7,
    "bottomAfter": 3
   },
   "hand": {
    "leftFragmentRight": {
     "polarity": "3'",
     "seq": "GTAC"
    },
    "rightFragmentLeft": {
     "polarity": "3'",
     "seq": "GTAC"
    }
   },
   "compatibleSelf": true
  },
  {
   "id": "smai-blunt",
   "note": "SmaI CCC^GGG: a blunt end.",
   "sequence": "TTCCCGGGAA",
   "circular": false,
   "cut": {
    "enzyme": "SmaI",
    "topAfter": 5,
    "bottomAfter": 5
   },
   "hand": {
    "leftFragmentRight": {
     "polarity": "blunt",
     "seq": ""
    },
    "rightFragmentLeft": {
     "polarity": "blunt",
     "seq": ""
    }
   },
   "compatibleSelf": true
  },
  {
   "id": "nonpalindromic-3prime",
   "note": "A 3' overhang AATC (not a palindrome): the left fragment's right end reads AATC, the right fragment's left end its reverse complement GATT, so one cut's two ends re-ligate.",
   "sequence": "TTTAATCGGG",
   "circular": false,
   "cut": {
    "enzyme": "Fake3",
    "topAfter": 7,
    "bottomAfter": 3
   },
   "hand": {
    "leftFragmentRight": {
     "polarity": "3'",
     "seq": "AATC"
    },
    "rightFragmentLeft": {
     "polarity": "3'",
     "seq": "GATT"
    }
   },
   "compatibleSelf": true
  },
  {
   "id": "nonpalindromic-5prime",
   "note": "A 5' overhang AATC (not a palindrome): the right fragment's left end reads AATC, the left fragment's right end GATT.",
   "sequence": "TTTAATCGGG",
   "circular": false,
   "cut": {
    "enzyme": "Fake5",
    "topAfter": 3,
    "bottomAfter": 7
   },
   "hand": {
    "leftFragmentRight": {
     "polarity": "5'",
     "seq": "GATT"
    },
    "rightFragmentLeft": {
     "polarity": "5'",
     "seq": "AATC"
    }
   },
   "compatibleSelf": true
  }
 ],
 "compatibility": [
  {
   "id": "ecori-ecori",
   "a": {
    "polarity": "5'",
    "seq": "AATT"
   },
   "b": {
    "polarity": "5'",
    "seq": "AATT"
   },
   "compatible": true,
   "note": "Same palindromic 5' overhang."
  },
  {
   "id": "bamhi-bglii",
   "a": {
    "polarity": "5'",
    "seq": "GATC"
   },
   "b": {
    "polarity": "5'",
    "seq": "GATC"
   },
   "compatible": true,
   "note": "BamHI and BglII leave the same GATC 5' overhang: compatible though the enzymes and sites differ."
  },
  {
   "id": "noncomplementary-5prime",
   "a": {
    "polarity": "5'",
    "seq": "AATT"
   },
   "b": {
    "polarity": "5'",
    "seq": "TTAA"
   },
   "compatible": false,
   "note": "revcomp(AATT)=AATT != TTAA: the overhangs do not pair."
  },
  {
   "id": "polarity-mismatch",
   "a": {
    "polarity": "5'",
    "seq": "GTAC"
   },
   "b": {
    "polarity": "3'",
    "seq": "GTAC"
   },
   "compatible": false,
   "note": "A 5' overhang never anneals to a 3' overhang, same bases or not."
  },
  {
   "id": "nonpalindromic-pair",
   "a": {
    "polarity": "3'",
    "seq": "AATC"
   },
   "b": {
    "polarity": "3'",
    "seq": "GATT"
   },
   "compatible": true,
   "note": "revcomp(AATC)=GATT: antiparallel pairing of a non-palindromic 3' overhang."
  },
  {
   "id": "blunt-blunt",
   "a": {
    "polarity": "blunt",
    "seq": ""
   },
   "b": {
    "polarity": "blunt",
    "seq": ""
   },
   "compatible": true,
   "note": "Blunt to blunt."
  },
  {
   "id": "blunt-sticky",
   "a": {
    "polarity": "blunt",
    "seq": ""
   },
   "b": {
    "polarity": "5'",
    "seq": "AATT"
   },
   "compatible": false,
   "note": "A blunt end does not anneal to a sticky one."
  },
  {
   "id": "length-mismatch",
   "a": {
    "polarity": "5'",
    "seq": "GATC"
   },
   "b": {
    "polarity": "5'",
    "seq": "GAT"
   },
   "compatible": false,
   "note": "Overhangs of different length never pair."
  }
 ],
 "flips": [
  {
   "id": "bsai-part-5prime-nonpalindromic",
   "note": "A part released by a Type IIS enzyme with distinct 4 nt 5' overhangs: AATG on the left, read on the top strand it protrudes on, and AAGC on the right, read on the bottom strand it protrudes on.",
   "top": "AATGCCCGGGTTTAAAGCTT",
   "left": {
    "polarity": "5'",
    "seq": "AATG",
    "protruding": "top"
   },
   "right": {
    "polarity": "5'",
    "seq": "AAGC",
    "protruding": "bottom"
   },
   "flipped": {
    "top": "AAGCTTTAAACCCGGGCATT",
    "left": {
     "polarity": "5'",
     "seq": "AAGC",
     "protruding": "top"
    },
    "right": {
     "polarity": "5'",
     "seq": "AATG",
     "protruding": "bottom"
    }
   }
  },
  {
   "id": "three-prime-nonpalindromic",
   "note": "A fragment with non-palindromic 3' overhangs: AATC protrudes on the top strand at the right end, GATT on the bottom strand at the left end.",
   "top": "GATTCCGGAAGGTTAATC",
   "left": {
    "polarity": "3'",
    "seq": "GATT",
    "protruding": "bottom"
   },
   "right": {
    "polarity": "3'",
    "seq": "AATC",
    "protruding": "top"
   },
   "flipped": {
    "top": "GATTAACCTTCCGGAATC",
    "left": {
     "polarity": "3'",
     "seq": "AATC",
     "protruding": "bottom"
    },
    "right": {
     "polarity": "3'",
     "seq": "GATT",
     "protruding": "top"
    }
   }
  },
  {
   "id": "blunt-both-ends",
   "note": "A blunt fragment: nothing protrudes, so flipping only reads the core on the other strand.",
   "top": "ACGTTTGCAA",
   "left": {
    "polarity": "blunt",
    "seq": "",
    "protruding": null
   },
   "right": {
    "polarity": "blunt",
    "seq": "",
    "protruding": null
   },
   "flipped": {
    "top": "TTGCAAACGT",
    "left": {
     "polarity": "blunt",
     "seq": "",
     "protruding": null
    },
    "right": {
     "polarity": "blunt",
     "seq": "",
     "protruding": null
    }
   }
  }
 ]
}
