{
 "about": {
  "generatedBy": "pipeline/plasmid-map/reference.py",
  "scriptSha256": "d268790409489fe6bb1d821bc5625a78d7d3c51fb2559a5de6629c33fbdb7f09",
  "recordedOn": "2026-10-17",
  "oracle": "Hand-worked cases with exact fractions (Python fractions); no engine code",
  "text": "The schematic gel's band grouping, gel rules 2 (the CSO's ruling 3, 17 October 2026): fragments under 100 bp are not visible; sizes sorted largest first; a fragment joins the current band when it is within 5 percent, inclusive, of that band's largest fragment, else it starts a new band. 5 percent is a judgement. spreadExact is (largest - smallest) / largest for each band, as an exact fraction; bandsUnderRules1 is what rules 1 gave, for the record.",
  "gelRulesVersion": "2.0.0",
  "minVisibleBp": 100,
  "resolveFraction": "1/20"
 },
 "cases": [
  {
   "id": "chain-1000-960-922",
   "note": "The CSO's case: 960 is 4 percent below 1,000 and joins; 922 is 7.8 percent below 1,000 and starts a band (rules 1 chained it through 960).",
   "sizes": [
    1000,
    960,
    922
   ],
   "bands": [
    [
     1000,
     960
    ],
    [
     922
    ]
   ],
   "spreadExact": [
    "1/25",
    "0"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     1000,
     960,
     922
    ]
   ]
  },
  {
   "id": "boundary-inclusive",
   "note": "950 is exactly 5 percent below 1,000: inclusive, one band.",
   "sizes": [
    1000,
    950
   ],
   "bands": [
    [
     1000,
     950
    ]
   ],
   "spreadExact": [
    "1/20"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     1000,
     950
    ]
   ]
  },
  {
   "id": "boundary-just-over",
   "note": "949 is 5.1 percent below 1,000: two bands.",
   "sizes": [
    1000,
    949
   ],
   "bands": [
    [
     1000
    ],
    [
     949
    ]
   ],
   "spreadExact": [
    "0",
    "0"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     1000
    ],
    [
     949
    ]
   ]
  },
  {
   "id": "four-member-run",
   "note": "1,980, 1,950 and 1,900 are each within 5 percent of 2,000 (1,900 at exactly 5 percent): one band of four.",
   "sizes": [
    2000,
    1980,
    1950,
    1900
   ],
   "bands": [
    [
     2000,
     1980,
     1950,
     1900
    ]
   ],
   "spreadExact": [
    "1/20"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     2000,
     1980,
     1950,
     1900
    ]
   ]
  },
  {
   "id": "long-run-splits",
   "note": "Steps of 40 bp from 2,000: 1,880 is 6 percent below 2,000 and starts a band led by 1,880 (rules 1 made one band of five).",
   "sizes": [
    2000,
    1960,
    1920,
    1880,
    1840
   ],
   "bands": [
    [
     2000,
     1960,
     1920
    ],
    [
     1880,
     1840
    ]
   ],
   "spreadExact": [
    "1/25",
    "1/47"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     2000,
     1960,
     1920,
     1880,
     1840
    ]
   ]
  },
  {
   "id": "under-100-not-drawn",
   "note": "Fragments under 100 bp are not visible bands, even when within 5 percent of a visible one (99 against 100).",
   "sizes": [
    3000,
    100,
    99,
    60
   ],
   "bands": [
    [
     3000
    ],
    [
     100
    ]
   ],
   "spreadExact": [
    "0",
    "0"
   ],
   "hidden": [
    99,
    60
   ],
   "bandsUnderRules1": [
    [
     3000
    ],
    [
     100
    ]
   ]
  },
  {
   "id": "near-100",
   "note": "105 and 100: 5 bp over 105 is 4.8 percent, one band; 100 is the smallest size drawn.",
   "sizes": [
    105,
    100
   ],
   "bands": [
    [
     105,
     100
    ]
   ],
   "spreadExact": [
    "1/21"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     105,
     100
    ]
   ]
  },
  {
   "id": "equal-sizes",
   "note": "Equal sizes run together.",
   "sizes": [
    500,
    500,
    500
   ],
   "bands": [
    [
     500,
     500,
     500
    ]
   ],
   "spreadExact": [
    "0"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     500,
     500,
     500
    ]
   ]
  },
  {
   "id": "equal-then-boundary",
   "note": "Two 1,000s and 950 are one band; 949 is over 5 percent below the band's largest.",
   "sizes": [
    1000,
    1000,
    950,
    949
   ],
   "bands": [
    [
     1000,
     1000,
     950
    ],
    [
     949
    ]
   ],
   "spreadExact": [
    "1/20",
    "0"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     1000,
     1000,
     950,
     949
    ]
   ]
  },
  {
   "id": "unsorted-input",
   "note": "Input order does not matter: sizes are sorted largest first.",
   "sizes": [
    922,
    1000,
    960
   ],
   "bands": [
    [
     1000,
     960
    ],
    [
     922
    ]
   ],
   "spreadExact": [
    "1/25",
    "0"
   ],
   "hidden": [],
   "bandsUnderRules1": [
    [
     1000,
     960,
     922
    ]
   ]
  },
  {
   "id": "all-under-100",
   "note": "Nothing visible.",
   "sizes": [
    99,
    50,
    10
   ],
   "bands": [],
   "spreadExact": [],
   "hidden": [
    99,
    50,
    10
   ],
   "bandsUnderRules1": []
  }
 ]
}
