{
 "schema": "rbb-status/1",
 "generated": "2026-10-09",
 "engine": "rbb 0.5.0 (rule language 1)",
 "commit": "01f4f27",
 "commit_date": "2026-10-09",
 "card_spec": {
  "version": "0.1.0",
  "repo": "https://github.com/bridge-craftwork/convention-card",
  "tag": "v0.1.0",
  "commit": "cf471721d53c7dddbaa2f465d0c5cb6d10ec6abb"
 },
 "repo": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/",
 "thresholds": {
  "good": {
   "errors_per_board": -0.25,
   "ns_agree": 0.65
  },
  "poor": {
   "errors_per_board": -1.0,
   "ns_agree": 0.55
  },
  "class_ratio": {
   "good": 1.0,
   "fair": 1.25
  },
  "per_thousand": {
   "good": 1.0,
   "fair": 5.0
  },
  "conv": {
   "good": -0.1,
   "poor": -0.5,
   "min_changed": 10
  }
 },
 "sections": [
  {
   "id": "basic",
   "title": "Basic bridge"
  },
  {
   "id": "judgment",
   "title": "Judgment"
  },
  {
   "id": "catchall",
   "title": "Catch-alls"
  },
  {
   "id": "constructive",
   "title": "Conventions: constructive"
  },
  {
   "id": "competitive",
   "title": "Conventions: competitive"
  },
  {
   "id": "precision",
   "title": "Precision"
  }
 ],
 "header": {
  "modules": 106,
  "rules": 3886,
  "tests": 2631,
  "fields_read": 174,
  "cards": [
   {
    "card": "21GF-DEFAULT",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-Flannery",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-GIB-Bergen",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-GIB",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-Gazzilli",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-MSS",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-MSTandMSS",
    "system": "sayc",
    "coverage": 100
   },
   {
    "card": "21GF-Multi",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-NoInvertedMinor",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-Ogust",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-PolishTwoSuiters",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-Puppet",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-SPECIALS",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-SPECIALS2",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "21GF-WJS-MSS",
    "system": "two_over_one",
    "coverage": 100
   },
   {
    "card": "Basic-Bridge",
    "system": "sayc",
    "coverage": 100
   },
   {
    "card": "Precision-14-16",
    "system": "precision",
    "coverage": 98
   },
   {
    "card": "Precision",
    "system": "precision",
    "coverage": 98
   }
  ],
  "corpus": {
   "scenarios": 343,
   "boards": 170633,
   "calls_agree": 0.8035,
   "ns_agree": 0.6996,
   "ew_agree": 0.9064,
   "auctions_match": 0.2041,
   "contracts_match": 0.393,
   "errors_per_board": -0.553,
   "no_rule": 1870
  },
  "self_ab": {
   "runs": 27,
   "date": "2026-10-09"
  },
  "counts": {
   "bba-fair": 26,
   "bba-good": 8,
   "bba-poor": 6,
   "tested": 15,
   "conv-good": 23,
   "conv-fair": 9,
   "ab-neutral": 9,
   "partial": 11,
   "conv-poor": 2,
   "gap": 25,
   "ab-gains": 5,
   "ab-loses": 1
  }
 },
 "tiles": [
  {
   "id": "basic_bidding/hand_evaluation",
   "name": "Hand Evaluation",
   "section": "basic",
   "level": 1,
   "summary": "",
   "source": "lessons",
   "members": [
    "basic_bidding/hand_evaluation"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    },
    {
     "name": "fit",
     "title": "A major-suit fit: agreed, or seen by one hand",
     "file": "conventions/base/fit.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.bid",
     "rules": 2,
     "tests": 25,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Losing_Trick_Count",
     "boards": 500,
     "ns_agree": 0.7856,
     "errors_per_board": -0.938,
     "auctions_match": 0.17,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Rule_of_2",
     "boards": 500,
     "ns_agree": 0.8683,
     "errors_per_board": -0.12,
     "auctions_match": 0.436,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.8171,
    "errors_per_board": -0.529,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 35,
   "rules": 23,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.53 IMPs/board against BBA's, NS calls agreeing 82% (1000 boards)"
  },
  {
   "id": "basic_bidding/major_suit_openings",
   "name": "Major Suit Openings",
   "section": "basic",
   "level": 1,
   "summary": "",
   "source": "taxonomy",
   "members": [
    "basic_bidding/major_suit_openings"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Major_Opener",
     "boards": 500,
     "ns_agree": 0.7214,
     "errors_per_board": -1.102,
     "auctions_match": 0.172,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Basic_Major",
     "boards": 500,
     "ns_agree": 0.7386,
     "errors_per_board": -0.25,
     "auctions_match": 0.266,
     "ns_card": "Basic-Bridge",
     "status": "bba-good"
    },
    {
     "name": "Open_and_Rebid",
     "boards": 500,
     "ns_agree": 0.7382,
     "errors_per_board": -0.744,
     "auctions_match": 0.228,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "Basic_What_To_Open",
     "boards": 500,
     "ns_agree": 0.7782,
     "errors_per_board": -0.274,
     "auctions_match": 0.33,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.7435,
    "errors_per_board": -0.593,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 10,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.59 IMPs/board against BBA's, NS calls agreeing 74% (2000 boards)"
  },
  {
   "id": "basic_bidding/minor_suit_openings",
   "name": "Minor Suit Openings",
   "section": "basic",
   "level": 1,
   "summary": "",
   "source": "taxonomy",
   "members": [
    "basic_bidding/minor_suit_openings"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Minor_Suit_Opener",
     "boards": 500,
     "ns_agree": 0.7541,
     "errors_per_board": -0.288,
     "auctions_match": 0.162,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Basic_Minor",
     "boards": 500,
     "ns_agree": 0.7414,
     "errors_per_board": -0.454,
     "auctions_match": 0.236,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "Minor_Suit_Opener_Resp_Structure",
     "boards": 500,
     "ns_agree": 0.7253,
     "errors_per_board": 0.008,
     "auctions_match": 0.29,
     "ns_card": "21GF-NoInvertedMinor",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.741,
    "errors_per_board": -0.245,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 10,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
   ],
   "status": "bba-good",
   "why": "errors -0.24 IMPs/board against BBA's, NS calls agreeing 74% (1500 boards)"
  },
  {
   "id": "basic_bidding/notrump_openings",
   "name": "Notrump Openings",
   "section": "basic",
   "level": 1,
   "summary": "",
   "source": "taxonomy",
   "members": [
    "basic_bidding/notrump_openings"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "notrump-base",
     "title": "1NT opening and natural responses",
     "file": "conventions/notrump/one-nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.bid",
     "rules": 69,
     "tests": 62,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "1N",
     "boards": 500,
     "ns_agree": 0.8152,
     "errors_per_board": -0.05,
     "auctions_match": 0.42,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Basic_NT",
     "boards": 500,
     "ns_agree": 0.957,
     "errors_per_board": -0.23,
     "auctions_match": 0.864,
     "ns_card": "Basic-Bridge",
     "status": "bba-good"
    },
    {
     "name": "2N",
     "boards": 500,
     "ns_agree": 0.715,
     "errors_per_board": -0.358,
     "auctions_match": 0.358,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Notrump_18-19",
     "boards": 500,
     "ns_agree": 0.7108,
     "errors_per_board": -0.394,
     "auctions_match": 0.228,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.7787,
    "errors_per_board": -0.258,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 62,
   "rules": 69,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.26 IMPs/board against BBA's, NS calls agreeing 78% (2000 boards)"
  },
  {
   "id": "basic/rebids",
   "name": "Opener's rebids",
   "section": "basic",
   "level": 1,
   "summary": "Opener's second call: raises, new suits, notrump rebids, jump shifts and reverses.",
   "source": "curated",
   "members": [
    "basic/rebids"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "rebids",
     "title": "Opener's rebid",
     "file": "conventions/base/rebids.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/rebids.bid",
     "rules": 259,
     "tests": 202,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/rebids.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Basic_Openers_Rebid",
     "boards": 500,
     "ns_agree": 0.8594,
     "errors_per_board": -0.272,
     "auctions_match": 0.504,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "Open_and_Rebid",
     "boards": 500,
     "ns_agree": 0.7382,
     "errors_per_board": -0.744,
     "auctions_match": 0.228,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "3N_Rebid_by_Opener",
     "boards": 500,
     "ns_agree": 0.5977,
     "errors_per_board": -0.6,
     "auctions_match": 0.088,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    },
    {
     "name": "1m_1x_2m",
     "boards": 500,
     "ns_agree": 0.784,
     "errors_per_board": -0.83,
     "auctions_match": 0.364,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.738,
    "errors_per_board": -0.612,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 202,
   "rules": 259,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/rebids.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.61 IMPs/board against BBA's, NS calls agreeing 74% (2000 boards)"
  },
  {
   "id": "basic/responses",
   "name": "Responses to one of a suit",
   "section": "basic",
   "level": 1,
   "summary": "New suits, raises and notrump responses to a one-level opening, and the passed hand's responses.",
   "source": "curated",
   "members": [
    "basic/responses"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "responses",
     "title": "Responses to one-level suit openings",
     "file": "conventions/base/responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.bid",
     "rules": 87,
     "tests": 75,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.notes.md"
    },
    {
     "name": "jump-raises",
     "title": "Weak and mixed jump raises of a major",
     "file": "conventions/majors/jump-raises.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/jump-raises.bid",
     "rules": 6,
     "tests": 11,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/jump-raises.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Basic_Responses",
     "boards": 500,
     "ns_agree": 0.8104,
     "errors_per_board": -0.16,
     "auctions_match": 0.43,
     "ns_card": "Basic-Bridge",
     "status": "bba-good"
    },
    {
     "name": "Major_Suit_Fit",
     "boards": 500,
     "ns_agree": 0.7035,
     "errors_per_board": -0.142,
     "auctions_match": 0.164,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "1m-1N",
     "boards": 500,
     "ns_agree": 0.8423,
     "errors_per_board": -0.104,
     "auctions_match": 0.41,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    },
    {
     "name": "1m-2N",
     "boards": 500,
     "ns_agree": 0.6857,
     "errors_per_board": -0.846,
     "auctions_match": 0.202,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    },
    {
     "name": "1m-3N",
     "boards": 500,
     "ns_agree": 0.7917,
     "errors_per_board": -0.302,
     "auctions_match": 0.31,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    },
    {
     "name": "After_1M_2M",
     "boards": 500,
     "ns_agree": 0.7543,
     "errors_per_board": -0.022,
     "auctions_match": 0.338,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 3000,
    "ns_agree": 0.7638,
    "errors_per_board": -0.263,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 86,
   "rules": 93,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/jump-raises.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.26 IMPs/board against BBA's, NS calls agreeing 76% (3000 boards)"
  },
  {
   "id": "basic/overcalls",
   "name": "Overcalls and advances",
   "section": "basic",
   "level": 2,
   "summary": "Simple and jump overcalls, the 1NT overcall, and partner's advances.",
   "source": "curated",
   "members": [
    "basic/overcalls"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "overcalls",
     "title": "Suit and notrump overcalls",
     "file": "conventions/competitive/overcalls.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/overcalls.bid",
     "rules": 53,
     "tests": 32,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/overcalls.notes.md"
    },
    {
     "name": "advances",
     "title": "Advancing partner's overcall",
     "file": "conventions/competitive/advances.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.bid",
     "rules": 84,
     "tests": 44,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Basic_Overcall",
     "boards": 500,
     "ns_agree": 0.7625,
     "errors_per_board": -0.29,
     "auctions_match": 0.156,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "We_Overcall",
     "boards": 500,
     "ns_agree": 0.7629,
     "errors_per_board": -0.614,
     "auctions_match": 0.114,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Jump_Overcalls",
     "boards": 500,
     "ns_agree": 0.8414,
     "errors_per_board": -1.294,
     "auctions_match": 0.168,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "After_Partner_Overcalls",
     "boards": 500,
     "ns_agree": 0.5948,
     "errors_per_board": -1.49,
     "auctions_match": 0.08,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.7378,
    "errors_per_board": -0.922,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 76,
   "rules": 137,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/overcalls.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.92 IMPs/board against BBA's, NS calls agreeing 74% (2000 boards)"
  },
  {
   "id": "basic/preempts",
   "name": "Preempts",
   "section": "basic",
   "level": 2,
   "summary": "Weak twos, three- and four-level preempts and the responses to them.",
   "source": "curated",
   "members": [
    "basic/preempts"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "preempts",
     "title": "Weak two-bids and preempts",
     "file": "conventions/base/preempts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.bid",
     "rules": 48,
     "tests": 42,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.notes.md"
    },
    {
     "name": "weak-two-responses",
     "title": "Responses to a weak two",
     "file": "conventions/base/weak-two-responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.bid",
     "rules": 72,
     "tests": 67,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Preempts",
     "boards": 500,
     "ns_agree": 0.7876,
     "errors_per_board": -0.87,
     "auctions_match": 0.236,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Weak_2_Bids",
     "boards": 500,
     "ns_agree": 0.8461,
     "errors_per_board": -1.084,
     "auctions_match": 0.256,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Basic_Weak_2",
     "boards": 500,
     "ns_agree": 0.7524,
     "errors_per_board": -0.59,
     "auctions_match": 0.34,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.7967,
    "errors_per_board": -0.848,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 109,
   "rules": 120,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.85 IMPs/board against BBA's, NS calls agreeing 80% (1500 boards)"
  },
  {
   "id": "basic/responder_rebids",
   "name": "Responder's rebids",
   "section": "basic",
   "level": 2,
   "summary": "Responder's second call: placing the contract, invitations and game forces.",
   "source": "curated",
   "members": [
    "basic/responder_rebids"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "responder-rebids",
     "title": "Responder's second call",
     "file": "conventions/base/responder-rebids.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.bid",
     "rules": 248,
     "tests": 150,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Reverse_By_Responder",
     "boards": 500,
     "ns_agree": 0.6257,
     "errors_per_board": -1.108,
     "auctions_match": 0.126,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Fourth_Bid_Inviting",
     "boards": 500,
     "ns_agree": 0.7093,
     "errors_per_board": 0.308,
     "auctions_match": 0.032,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Misfit",
     "boards": 500,
     "ns_agree": 0.7112,
     "errors_per_board": -1.212,
     "auctions_match": 0.178,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.6788,
    "errors_per_board": -0.671,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 150,
   "rules": 248,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.67 IMPs/board against BBA's, NS calls agreeing 68% (1500 boards)"
  },
  {
   "id": "basic/notrump_responses",
   "name": "Responses to 1NT",
   "section": "basic",
   "level": 2,
   "summary": "Raises, invitations and sign-offs over 1NT, and choosing between notrump and a major.",
   "source": "curated",
   "members": [
    "basic/notrump_responses"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "notrump-base",
     "title": "1NT opening and natural responses",
     "file": "conventions/notrump/one-nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.bid",
     "rules": 69,
     "tests": 62,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.notes.md"
    },
    {
     "name": "choice-of-games",
     "title": "Choosing between 3NT and a major-suit game",
     "file": "conventions/notrump/choice-of-games.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.bid",
     "rules": 3,
     "tests": 4,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "1N_Balanced_Raise",
     "boards": 500,
     "ns_agree": 0.8739,
     "errors_per_board": -0.46,
     "auctions_match": 0.65,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "1N_5M_and_6m",
     "boards": 500,
     "ns_agree": 0.7567,
     "errors_per_board": -0.464,
     "auctions_match": 0.112,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "GIB_1N_Basic",
     "boards": 500,
     "ns_agree": 0.8505,
     "errors_per_board": -0.186,
     "auctions_match": 0.462,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.8092,
    "errors_per_board": -0.37,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 66,
   "rules": 72,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.37 IMPs/board against BBA's, NS calls agreeing 81% (1500 boards)"
  },
  {
   "id": "basic/strong_openings",
   "name": "Strong openings",
   "section": "basic",
   "level": 2,
   "summary": "2♣ and the 2NT/3NT openings, with their first responses.",
   "source": "curated",
   "members": [
    "basic/strong_openings"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "strong-openings",
     "title": "2♣ and 2NT openings",
     "file": "conventions/base/strong-openings.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/strong-openings.bid",
     "rules": 67,
     "tests": 50,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/strong-openings.notes.md"
    },
    {
     "name": "two-nt-responses",
     "title": "Responses to a 2NT opening",
     "file": "conventions/notrump/two-nt-responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.bid",
     "rules": 71,
     "tests": 76,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Game_Forcing_2C",
     "boards": 500,
     "ns_agree": 0.663,
     "errors_per_board": -1.082,
     "auctions_match": 0.152,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "2N",
     "boards": 500,
     "ns_agree": 0.715,
     "errors_per_board": -0.358,
     "auctions_match": 0.358,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "3N",
     "boards": 500,
     "ns_agree": 0.3894,
     "errors_per_board": -0.992,
     "auctions_match": 0.02,
     "ns_card": "21GF-GIB",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.6104,
    "errors_per_board": -0.811,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 126,
   "rules": 138,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/strong-openings.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.81 IMPs/board against BBA's, NS calls agreeing 61% (1500 boards)"
  },
  {
   "id": "basic/takeout_double",
   "name": "Takeout double",
   "section": "basic",
   "level": 2,
   "summary": "The takeout double and the advancer's replies.",
   "source": "curated",
   "members": [
    "basic/takeout_double"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "takeout-double",
     "title": "Takeout doubles",
     "file": "conventions/competitive/takeout-double.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/takeout-double.bid",
     "rules": 98,
     "tests": 40,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/takeout-double.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Basic_Takeout_Double",
     "boards": 500,
     "ns_agree": 0.7494,
     "errors_per_board": -0.252,
     "auctions_match": 0.12,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "Takeout_Double",
     "boards": 500,
     "ns_agree": 0.7177,
     "errors_per_board": -0.592,
     "auctions_match": 0.096,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "After_Partner_Takeout_Double",
     "boards": 500,
     "ns_agree": 0.6211,
     "errors_per_board": -0.43,
     "auctions_match": 0.108,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.6978,
    "errors_per_board": -0.425,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 40,
   "rules": 98,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/takeout-double.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.42 IMPs/board against BBA's, NS calls agreeing 70% (1500 boards)"
  },
  {
   "id": "basic/interference",
   "name": "Bidding after interference",
   "section": "basic",
   "level": 3,
   "summary": "Our side's calls after they overcall or double: free bids, cue raises, redoubles.",
   "source": "curated",
   "members": [
    "basic/interference"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "after-interference",
     "title": "Our side once the opponents come in",
     "file": "conventions/competitive/after-interference.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.bid",
     "rules": 106,
     "tests": 83,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
    },
    {
     "name": "vs-takeout-double",
     "title": "Raises over their takeout double: Jordan 2NT and BROMAD",
     "file": "conventions/competitive/vs-takeout-double.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.bid",
     "rules": 18,
     "tests": 19,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.notes.md"
    },
    {
     "name": "nt-interference",
     "title": "Our 1NT when RHO acts",
     "file": "conventions/notrump/nt-interference.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/nt-interference.bid",
     "rules": 134,
     "tests": 81,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/nt-interference.notes.md"
    },
    {
     "name": "their-1nt-overcall",
     "title": "Responder over their 1NT overcall",
     "file": "conventions/competitive/their-1nt-overcall.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/their-1nt-overcall.bid",
     "rules": 14,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/their-1nt-overcall.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Dealing_with_Overcalls_Strong",
     "boards": 500,
     "ns_agree": 0.5869,
     "errors_per_board": -0.932,
     "auctions_match": 0.064,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Dealing_with_Overcalls_Weak",
     "boards": 500,
     "ns_agree": 0.6189,
     "errors_per_board": -0.4,
     "auctions_match": 0.084,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Opps_Takeout_X",
     "boards": 500,
     "ns_agree": 0.7069,
     "errors_per_board": -0.476,
     "auctions_match": 0.072,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Opps_Overcall_1NT",
     "boards": 500,
     "ns_agree": 0.8767,
     "errors_per_board": -0.03,
     "auctions_match": 0.282,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Opps_Double_1_NT",
     "boards": 500,
     "ns_agree": 0.8144,
     "errors_per_board": -0.466,
     "auctions_match": 0.184,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2500,
    "ns_agree": 0.7144,
    "errors_per_board": -0.461,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 204,
   "rules": 272,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/nt-interference.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/their-1nt-overcall.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.46 IMPs/board against BBA's, NS calls agreeing 71% (2500 boards)"
  },
  {
   "id": "judgment/opening",
   "name": "Opening judgment",
   "section": "judgment",
   "level": 2,
   "summary": "Whether to open, and what: the 12 total points rule, third and fourth seat, the rule of 15.",
   "source": "curated",
   "members": [
    "judgment/opening"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Basic_What_To_Open",
     "boards": 500,
     "ns_agree": 0.7782,
     "errors_per_board": -0.274,
     "auctions_match": 0.33,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "Open_In_Fourth_Seat",
     "boards": 500,
     "ns_agree": 0.7869,
     "errors_per_board": -0.598,
     "auctions_match": 0.284,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Rule_of_16",
     "boards": 500,
     "ns_agree": 0.8107,
     "errors_per_board": 0.064,
     "auctions_match": 0.37,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.7915,
    "errors_per_board": -0.269,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 10,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
   ],
   "status": "bba-fair",
   "why": "errors -0.27 IMPs/board against BBA's, NS calls agreeing 79% (1500 boards)"
  },
  {
   "id": "judgment/game_and_level",
   "name": "Game and partscore placement",
   "section": "judgment",
   "level": 3,
   "summary": "Bidding game when it makes and stopping short when it does not.",
   "source": "curated",
   "members": [
    "judgment/game_and_level"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    },
    {
     "name": "fit",
     "title": "A major-suit fit: agreed, or seen by one hand",
     "file": "conventions/base/fit.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.bid",
     "rules": 2,
     "tests": 25,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.notes.md"
    },
    {
     "name": "choice-of-games",
     "title": "Choosing between 3NT and a major-suit game",
     "file": "conventions/notrump/choice-of-games.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.bid",
     "rules": 3,
     "tests": 4,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 39,
   "rules": 26,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.notes.md"
   ],
   "status": "bba-good",
   "measure": {
    "kind": "par class",
    "classes": [
     "short_of_game",
     "short_level",
     "overbid"
    ],
    "ours": 38156,
    "bba": 41645,
    "ratio": 0.916,
    "boards": 170633
   },
   "why": "short of game, short level, overbid: 38156 boards for us, 41645 for BBA, all 170633 corpus boards"
  },
  {
   "id": "judgment/competition",
   "name": "Competitive judgment (LoTT)",
   "section": "judgment",
   "level": 4,
   "summary": "Whether to compete, sacrifice or let them play, by total tricks (total-tricks.bid).",
   "source": "curated",
   "members": [
    "judgment/competition"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "total-tricks",
     "title": "The Law of Total Tricks",
     "file": "conventions/competitive/total-tricks.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/total-tricks.bid",
     "rules": 3,
     "tests": 7,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/total-tricks.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 7,
   "rules": 3,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/total-tricks.notes.md"
   ],
   "status": "bba-fair",
   "measure": {
    "kind": "par class",
    "classes": [
     "did_not_compete",
     "no_sacrifice"
    ],
    "ours": 21226,
    "bba": 18075,
    "ratio": 1.174,
    "boards": 170633
   },
   "why": "did not compete, no sacrifice: 21226 boards for us, 18075 for BBA, all 170633 corpus boards"
  },
  {
   "id": "judgment/game_force",
   "name": "Game-force state",
   "section": "judgment",
   "level": 4,
   "summary": "Tracking who has forced to game and never passing below it (`force game`, base.bid).",
   "source": "curated",
   "members": [
    "judgment/game_force"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "game-force",
     "title": "When the auction forces to game",
     "file": "conventions/base/game-force.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/game-force.bid",
     "rules": 0,
     "tests": 1,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/game-force.notes.md"
    },
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 11,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/game-force.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
   ],
   "status": "bba-poor",
   "measure": {
    "kind": "par class",
    "classes": [
     "passed_out"
    ],
    "ours": 1123,
    "bba": 626,
    "ratio": 1.794,
    "boards": 170633
   },
   "why": "passed out: 1123 boards for us, 626 for BBA, all 170633 corpus boards"
  },
  {
   "id": "judgment/penalty_doubles",
   "name": "Penalty doubles",
   "section": "judgment",
   "level": 4,
   "summary": "Doubling them when they are too high, and not doubling contracts that make.",
   "source": "curated",
   "members": [
    "judgment/penalty_doubles"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "penalty-doubles",
     "title": "Penalty doubles: they are too high",
     "file": "conventions/competitive/penalty-doubles.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/penalty-doubles.bid",
     "rules": 21,
     "tests": 27,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/penalty-doubles.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 27,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/penalty-doubles.notes.md"
   ],
   "status": "bba-good",
   "measure": {
    "kind": "par class",
    "classes": [
     "doubling_only"
    ],
    "ours": 2694,
    "bba": 3269,
    "ratio": 0.824,
    "boards": 170633
   },
   "why": "doubling only: 2694 boards for us, 3269 for BBA, all 170633 corpus boards"
  },
  {
   "id": "judgment/strain",
   "name": "Strain: fit against agreement",
   "section": "judgment",
   "level": 4,
   "summary": "Finding the right strain and declarer: a publicly agreed suit against a fit only one hand can see.",
   "source": "curated",
   "members": [
    "judgment/strain"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "fit",
     "title": "A major-suit fit: agreed, or seen by one hand",
     "file": "conventions/base/fit.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.bid",
     "rules": 2,
     "tests": 25,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.notes.md"
    },
    {
     "name": "choice-of-games",
     "title": "Choosing between 3NT and a major-suit game",
     "file": "conventions/notrump/choice-of-games.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.bid",
     "rules": 3,
     "tests": 4,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 29,
   "rules": 5,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fit.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/choice-of-games.notes.md"
   ],
   "status": "bba-fair",
   "measure": {
    "kind": "par class",
    "classes": [
     "wrong_strain"
    ],
    "ours": 16651,
    "bba": 15197,
    "ratio": 1.096,
    "boards": 170633
   },
   "why": "wrong strain: 16651 boards for us, 15197 for BBA, all 170633 corpus boards"
  },
  {
   "id": "judgment/systems_on",
   "name": "Systems on",
   "section": "judgment",
   "level": 5,
   "summary": "One notrump system for every natural notrump: after an overcall, a balancing 1NT, a 2NT rebid (engine 0.5.0).",
   "source": "curated",
   "members": [
    "judgment/systems_on"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "notrump-base",
     "title": "1NT opening and natural responses",
     "file": "conventions/notrump/one-nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.bid",
     "rules": 69,
     "tests": 62,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.notes.md"
    },
    {
     "name": "nt-interference",
     "title": "Our 1NT when RHO acts",
     "file": "conventions/notrump/nt-interference.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/nt-interference.bid",
     "rules": 134,
     "tests": 81,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/nt-interference.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "We_Overcall_NT_then_Stayman",
     "boards": 500,
     "ns_agree": 0.7573,
     "errors_per_board": -0.02,
     "auctions_match": 0.418,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "We_Overcall_NT_then_Jacoby",
     "boards": 500,
     "ns_agree": 0.7318,
     "errors_per_board": -0.298,
     "auctions_match": 0.166,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "We_Overcall_NT_then_Texas",
     "boards": 500,
     "ns_agree": 0.687,
     "errors_per_board": -0.31,
     "auctions_match": 0.142,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "We_Overcall_NT_then_Smolen",
     "boards": 500,
     "ns_agree": 0.7525,
     "errors_per_board": -0.18,
     "auctions_match": 0.46,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.7332,
    "errors_per_board": -0.202,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 143,
   "rules": 203,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/one-nt.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/nt-interference.notes.md"
   ],
   "status": "bba-good",
   "why": "errors -0.20 IMPs/board against BBA's, NS calls agreeing 73% (2000 boards)"
  },
  {
   "id": "judgment/slam_entry",
   "name": "Slam entry and valuation",
   "section": "judgment",
   "level": 6,
   "summary": "Whether to try for slam at all, and how: the judgment layer's slam entry, before any ask (docs/JUDGMENT-LAYER.md).",
   "source": "curated",
   "members": [
    "judgment/slam_entry"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "slam-entry",
     "title": "Slam entry: the conditions the slam modules share",
     "file": "conventions/slam/slam-entry.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/slam-entry.bid",
     "rules": 10,
     "tests": 24,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/slam-entry.notes.md"
    },
    {
     "name": "slam-catch",
     "title": "Game or slam once a trump suit is agreed",
     "file": "conventions/slam/slam-catch.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/slam-catch.bid",
     "rules": 1,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/slam-catch.notes.md"
    },
    {
     "name": "over-3nt",
     "title": "Slam after partner's 3NT",
     "file": "conventions/slam/over-3nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/over-3nt.bid",
     "rules": 16,
     "tests": 8,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/over-3nt.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 42,
   "rules": 27,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/slam-entry.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/slam-catch.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/over-3nt.notes.md"
   ],
   "status": "bba-fair",
   "measure": {
    "kind": "par class",
    "classes": [
     "short_of_slam"
    ],
    "ours": 21894,
    "bba": 18179,
    "ratio": 1.204,
    "boards": 170633
   },
   "why": "short of slam: 21894 boards for us, 18179 for BBA, all 170633 corpus boards"
  },
  {
   "id": "catchall/read_as_higher",
   "name": "Calls read as a higher rule",
   "section": "catchall",
   "level": 1,
   "summary": "Our calls partner reads by a higher-priority rule than the one that bid them (docs/JUDGMENT-LAYER.md §4).",
   "source": "curated",
   "members": [
    "catchall/read_as_higher"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "bba-poor",
   "measure": {
    "kind": "read_as",
    "count": 20903,
    "per_thousand": 122.5,
    "boards": 170633
   },
   "examples": [
    {
     "auction": "after-interference.bid:293 -> after-interference.bid:57",
     "call": "P",
     "count": 2465
    },
    {
     "auction": "after-interference.bid:139 -> after-interference.bid:57",
     "call": "P",
     "count": 2337
    },
    {
     "auction": "stayman.bid:102 -> stayman.bid:116",
     "call": "4H",
     "count": 1062
    },
    {
     "auction": "base.bid:95 -> rebids.bid:266",
     "call": "3NT",
     "count": 1020
    },
    {
     "auction": "stayman.bid:106 -> stayman.bid:121",
     "call": "4S",
     "count": 892
    },
    {
     "auction": "rebids.bid:86 -> rebids.bid:79",
     "call": "2NT",
     "count": 445
    },
    {
     "auction": "rebids.bid:81 -> rebids.bid:77",
     "call": "1NT",
     "count": 361
    },
    {
     "auction": "rebids.bid:300 -> rebids.bid:296",
     "call": "2C",
     "count": 356
    }
   ],
   "why": "20903 in 170633 corpus boards (122.5 per 1,000)"
  },
  {
   "id": "catchall/defending_side",
   "name": "Defending side: nothing more to say",
   "section": "catchall",
   "level": 1,
   "summary": "The defending side passes once both have described their hands (advances.bid, below every real rule).",
   "source": "curated",
   "members": [
    "catchall/defending_side"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "advances",
     "title": "Advancing partner's overcall",
     "file": "conventions/competitive/advances.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.bid",
     "rules": 84,
     "tests": 44,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 44,
   "rules": 84,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
   ],
   "status": "tested",
   "why": "44 test cases; no corpus or A/B measure"
  },
  {
   "id": "catchall/game_reached",
   "name": "Game reached: pass",
   "section": "catchall",
   "level": 1,
   "summary": "Once our side has bid game, a player with nothing more to add passes (base.bid).",
   "source": "curated",
   "members": [
    "catchall/game_reached"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "base",
     "title": "Natural opening bids",
     "file": "conventions/base/base.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.bid",
     "rules": 21,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 10,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/base.notes.md"
   ],
   "status": "tested",
   "why": "10 test cases; no corpus or A/B measure"
  },
  {
   "id": "catchall/after_interference",
   "name": "Opening side after a pass",
   "section": "catchall",
   "level": 1,
   "summary": "A player on the opening side who passed last time passes again with nothing new (after-interference.bid).",
   "source": "curated",
   "members": [
    "catchall/after_interference"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "after-interference",
     "title": "Our side once the opponents come in",
     "file": "conventions/competitive/after-interference.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.bid",
     "rules": 106,
     "tests": 83,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 83,
   "rules": 106,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
   ],
   "status": "tested",
   "why": "83 test cases; no corpus or A/B measure"
  },
  {
   "id": "catchall/no_rule",
   "name": "Positions with no rule",
   "section": "catchall",
   "level": 1,
   "summary": "Calls the engine made with no rule to say why: gaps in the system.",
   "source": "curated",
   "members": [
    "catchall/no_rule"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "bba-poor",
   "measure": {
    "kind": "no_rule",
    "count": 1870,
    "per_thousand": 10.96,
    "boards": 170633
   },
   "examples": [
    {
     "auction": "1NT P 2D P 2H P",
     "call": "P",
     "count": 78
    },
    {
     "auction": "1D 2NT 3C P 3D P",
     "call": "P",
     "count": 67
    },
    {
     "auction": "1D 2D 2H 2S 3D P",
     "call": "P",
     "count": 62
    },
    {
     "auction": "2H 4NT",
     "call": "P",
     "count": 61
    },
    {
     "auction": "1D 2D 2H 3H 4D P",
     "call": "P",
     "count": 52
    },
    {
     "auction": "2S 4NT",
     "call": "P",
     "count": 52
    },
    {
     "auction": "1C 2C 2H 2S 3C P",
     "call": "P",
     "count": 49
    },
    {
     "auction": "1H 2S 3S 4S",
     "call": "P",
     "count": 45
    }
   ],
   "why": "1870 in 170633 corpus boards (11.0 per 1,000)"
  },
  {
   "id": "catchall/notrump_rebid",
   "name": "After partner's notrump rebid",
   "section": "catchall",
   "level": 2,
   "summary": "Responder's catch-all after opener's notrump rebid (responder-rebids.bid, Rick 2026-09-27).",
   "source": "curated",
   "members": [
    "catchall/notrump_rebid"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "responder-rebids",
     "title": "Responder's second call",
     "file": "conventions/base/responder-rebids.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.bid",
     "rules": 248,
     "tests": 150,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 150,
   "rules": 248,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.notes.md"
   ],
   "status": "tested",
   "why": "150 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/blackwood",
   "name": "Blackwood",
   "section": "constructive",
   "level": 2,
   "summary": "Once a trump suit is agreed, 4NT asks how many aces partner holds: 5♣ none or four, 5♦ one, 5♥ two, 5♠ three. 5NT then asks for kings the same way.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/blackwood"
   ],
   "treatments": [
    {
     "label": "Standard Blackwood",
     "field": "slam.blackwood.standard",
     "skill": "bidding_conventions/blackwood",
     "level": 2,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "blackwood",
     "title": "Blackwood (standard)",
     "file": "conventions/slam/blackwood.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/blackwood.bid",
     "rules": 31,
     "tests": 24,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/blackwood.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 1
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 24,
   "rules": 31,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/blackwood.notes.md"
   ],
   "status": "tested",
   "why": "24 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/gerber",
   "name": "Gerber",
   "section": "constructive",
   "level": 3,
   "summary": "A jump to 4♣ over partner's notrump asks for aces, with steps answering as for Blackwood (4♦ none or four, 4♥ one, and so on), leaving 4NT as a natural raise.",
   "source": "proposed",
   "members": [
    "bidding_conventions/gerber"
   ],
   "treatments": [
    {
     "label": "Gerber",
     "field": "slam.gerber.play",
     "skill": "bidding_conventions/gerber",
     "level": 3,
     "status": "bba-good",
     "why": "vs BBA in Gerber, Gerber_By_Opener, Gerber_By_Responder: +0.06 IMPs/board, NS calls agreeing 69%"
    }
   ],
   "modules": [
    {
     "name": "gerber",
     "title": "Gerber: 4♣ asks for aces over partner's notrump",
     "file": "conventions/slam/gerber.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/gerber.bid",
     "rules": 21,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/gerber.notes.md"
    }
   ],
   "see": [
    {
     "title": "Gerber",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/gerber.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 1
    },
    {
     "title": "Slam Bidding: Gerber and 1430 Gerber",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/402"
    }
   ],
   "scenarios": [
    {
     "name": "Gerber",
     "boards": 500,
     "ns_agree": 0.8104,
     "errors_per_board": -0.076,
     "auctions_match": 0.346,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Gerber_By_Opener",
     "boards": 500,
     "ns_agree": 0.5953,
     "errors_per_board": 0.0,
     "auctions_match": 0.092,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    },
    {
     "name": "Gerber_By_Responder",
     "boards": 500,
     "ns_agree": 0.6985,
     "errors_per_board": 0.24,
     "auctions_match": 0.134,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.6915,
    "errors_per_board": 0.055,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "gerber",
     "off": [
      "slam.gerber.play=false"
     ],
     "scenarios": [
      "Gerber",
      "Gerber_By_Opener",
      "Gerber_By_Responder"
     ],
     "bba_keys": [
      "Gerber"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 160,
      "boards": 1500
     },
     "status": "conv-good",
     "changed": 828,
     "changed_ours": 786,
     "changed_bba": 516,
     "rusty_gain": 974,
     "bba_gain": 208,
     "net": 766,
     "net_other": -186,
     "rusty_contract": 974,
     "rusty_doubling": 0,
     "bba_contract": 208,
     "bba_doubling": 0,
     "net_halves": [
      369,
      397
     ],
     "net_per_changed": 0.925,
     "rusty_per_changed": 1.176,
     "bba_per_changed": 0.251,
     "halves_agree": true,
     "no_rule_on": 13,
     "no_rule_off": 13
    }
   ],
   "conv_score": {
    "changed": 828,
    "changed_ours": 786,
    "changed_bba": 516,
    "rusty_gain": 974,
    "bba_gain": 208,
    "net": 766,
    "net_other": -186,
    "rusty_contract": 974,
    "rusty_doubling": 0,
    "bba_contract": 208,
    "bba_doubling": 0,
    "net_halves": [
     369,
     397
    ],
    "net_per_changed": 0.925,
    "rusty_per_changed": 1.176,
    "bba_per_changed": 0.251,
    "halves_agree": true,
    "runs": [
     "gerber"
    ],
    "scenarios": [
     "Gerber",
     "Gerber_By_Opener",
     "Gerber_By_Responder"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1500,
     "ns_agree": 0.6915,
     "errors_per_board": 0.055,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 21,
   "rules": 21,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/gerber.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.93 IMPs per changed board (our gain +974, BBA's +208, 828 boards); background on these deals +0.06 IMPs/board, NS calls agreeing 69%"
  },
  {
   "id": "bidding_conventions/jacoby_transfers",
   "name": "Jacoby Transfers",
   "section": "constructive",
   "level": 3,
   "summary": "Over partner's 1NT, 2♦ shows five or more hearts and 2♥ five or more spades; opener bids the next suit, so the strong hand declares. Texas does the same at the four level (4♦ for hearts, 4♥ for spades) with game values.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/jacoby_transfers"
   ],
   "treatments": [
    {
     "label": "Jacoby transfers",
     "field": "notrump.transfers.jacoby",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 3,
     "status": "bba-good",
     "why": "vs BBA in Jacoby_Transfer, Texas_Transfer, Texas_or_Jacoby, 2N_and_Transfers: -0.17 IMPs/board, NS calls agreeing 73%"
    },
    {
     "label": "2NT: transfers at 3-level",
     "field": "notrump.two_nt.transfers_3level",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "2NT: transfers at 4-level",
     "field": "notrump.two_nt.transfers_4level",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Texas 4♠",
     "field": "notrump.transfers.texas_4s",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Texas 4♥",
     "field": "notrump.transfers.texas_4h",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Texas transfers",
     "field": "notrump.transfers.texas",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 4,
     "status": "bba-good",
     "why": "vs BBA in Jacoby_Transfer, Texas_Transfer, Texas_or_Jacoby, 2N_and_Transfers: -0.17 IMPs/board, NS calls agreeing 73%"
    },
    {
     "label": "Texas 4♣",
     "field": "notrump.transfers.texas_4c",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Texas 4♦",
     "field": "notrump.transfers.texas_4d",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Transfers on if RHO bids clubs",
     "field": "notrump.transfers.vs_2c",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 6,
     "status": "bba-good",
     "why": "vs BBA in Jacoby_Transfer, Texas_Transfer, Texas_or_Jacoby, 2N_and_Transfers: -0.17 IMPs/board, NS calls agreeing 73%"
    },
    {
     "label": "Transfers on if RHO doubles",
     "field": "notrump.transfers.vs_double",
     "skill": "bidding_conventions/jacoby_transfers",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "jacoby-transfers",
     "title": "Jacoby Transfers",
     "file": "conventions/notrump/jacoby-transfers.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/jacoby-transfers.bid",
     "rules": 53,
     "tests": 70,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/jacoby-transfers.notes.md"
    },
    {
     "name": "texas-transfers",
     "title": "Texas Transfers",
     "file": "conventions/notrump/texas-transfers.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/texas-transfers.bid",
     "rules": 19,
     "tests": 8,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/texas-transfers.notes.md"
    },
    {
     "name": "two-nt-responses",
     "title": "Responses to a 2NT opening",
     "file": "conventions/notrump/two-nt-responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.bid",
     "rules": 71,
     "tests": 76,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.notes.md"
    }
   ],
   "see": [
    {
     "title": "Texas Transfer",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/texas_transfer.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 2
    },
    {
     "title": "NT Auctions: Opponents' Doubles of Our Stayman and Transfers",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/520"
    }
   ],
   "scenarios": [
    {
     "name": "Jacoby_Transfer",
     "boards": 500,
     "ns_agree": 0.7982,
     "errors_per_board": 0.096,
     "auctions_match": 0.29,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Texas_Transfer",
     "boards": 500,
     "ns_agree": 0.7756,
     "errors_per_board": 0.228,
     "auctions_match": 0.298,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Texas_or_Jacoby",
     "boards": 500,
     "ns_agree": 0.8139,
     "errors_per_board": 0.338,
     "auctions_match": 0.308,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "2N_and_Transfers",
     "boards": 500,
     "ns_agree": 0.536,
     "errors_per_board": -1.326,
     "auctions_match": 0.11,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.727,
    "errors_per_board": -0.166,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "jacoby-transfers",
     "off": [
      "notrump.transfers.jacoby=false"
     ],
     "scenarios": [
      "Jacoby_Transfer",
      "2N_and_Transfers"
     ],
     "bba_keys": [],
     "notes": [
      "Jacoby_Transfer: no .bbsa key changes (notrump.transfers.jacoby=false): BBA cannot be switched",
      "2N_and_Transfers: no .bbsa key changes (notrump.transfers.jacoby=false): BBA cannot be switched"
     ],
     "unmeasured": "Jacoby_Transfer: no .bbsa key changes (notrump.transfers.jacoby=false): BBA cannot be switched; 2N_and_Transfers: no .bbsa key changes (notrump.transfers.jacoby=false): BBA cannot be switched",
     "repro": null,
     "status": null
    },
    {
     "name": "texas",
     "off": [
      "notrump.transfers.texas=false"
     ],
     "scenarios": [
      "Texas_Transfer",
      "Texas_or_Jacoby"
     ],
     "bba_keys": [
      "Texas"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 548,
     "changed_ours": 425,
     "changed_bba": 434,
     "rusty_gain": 583,
     "bba_gain": 152,
     "net": 431,
     "net_other": 2,
     "rusty_contract": 583,
     "rusty_doubling": 0,
     "bba_contract": 137,
     "bba_doubling": 15,
     "net_halves": [
      261,
      170
     ],
     "net_per_changed": 0.786,
     "rusty_per_changed": 1.064,
     "bba_per_changed": 0.277,
     "halves_agree": true,
     "no_rule_on": 1,
     "no_rule_off": 1
    }
   ],
   "conv_score": {
    "changed": 548,
    "changed_ours": 425,
    "changed_bba": 434,
    "rusty_gain": 583,
    "bba_gain": 152,
    "net": 431,
    "net_other": 2,
    "rusty_contract": 583,
    "rusty_doubling": 0,
    "bba_contract": 137,
    "bba_doubling": 15,
    "net_halves": [
     261,
     170
    ],
    "net_per_changed": 0.786,
    "rusty_per_changed": 1.064,
    "bba_per_changed": 0.277,
    "halves_agree": true,
    "runs": [
     "texas"
    ],
    "scenarios": [
     "Texas_Transfer",
     "Texas_or_Jacoby"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.795,
     "errors_per_board": 0.283,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 154,
   "rules": 143,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/jacoby-transfers.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/texas-transfers.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.79 IMPs per changed board (our gain +583, BBA's +152, 548 boards); background on these deals +0.28 IMPs/board, NS calls agreeing 80%"
  },
  {
   "id": "bidding_conventions/preemptive_bids",
   "name": "Preemptive Bids",
   "section": "constructive",
   "level": 3,
   "summary": "",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/preemptive_bids"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "preempts",
     "title": "Weak two-bids and preempts",
     "file": "conventions/base/preempts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.bid",
     "rules": 48,
     "tests": 42,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Preempts",
     "boards": 500,
     "ns_agree": 0.7876,
     "errors_per_board": -0.87,
     "auctions_match": 0.236,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Preemptive_Raise",
     "boards": 500,
     "ns_agree": 0.7171,
     "errors_per_board": -0.984,
     "auctions_match": 0.098,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7496,
    "errors_per_board": -0.927,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 42,
   "rules": 48,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.93 IMPs/board against BBA's, NS calls agreeing 75% (1000 boards)"
  },
  {
   "id": "bidding_conventions/stayman",
   "name": "Stayman",
   "section": "constructive",
   "level": 3,
   "summary": "Over partner's 1NT, 2♣ asks opener for a four-card major: 2♦ denies one, 2♥ or 2♠ shows it. Responder uses it to find a 4-4 major fit with invitational or better values; Garbage Stayman uses it weak, planning to pass any reply.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/stayman",
    "bidding_conventions/range_stayman"
   ],
   "treatments": [
    {
     "label": "Garbage Stayman",
     "field": "notrump.stayman.garbage",
     "skill": "bidding_conventions/stayman",
     "level": 3,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Stayman",
     "field": "notrump.stayman.play",
     "skill": "bidding_conventions/stayman",
     "level": 3,
     "status": "bba-good",
     "why": "vs BBA in Stayman, Slam_after_Stayman: +0.23 IMPs/board, NS calls agreeing 79%"
    },
    {
     "label": "Stayman is forcing",
     "field": "notrump.stayman.forcing",
     "skill": "bidding_conventions/stayman",
     "level": 3,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "2NT–3♣–3NT shows both majors",
     "field": "notrump.two_nt.three_c_3nt_both_majors",
     "skill": "bidding_conventions/stayman",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "stayman",
     "title": "Stayman",
     "file": "conventions/notrump/stayman.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/stayman.bid",
     "rules": 190,
     "tests": 75,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/stayman.notes.md"
    },
    {
     "name": "two-nt-responses",
     "title": "Responses to a 2NT opening",
     "file": "conventions/notrump/two-nt-responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.bid",
     "rules": 71,
     "tests": 76,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.notes.md"
    }
   ],
   "see": [
    {
     "title": "Stayman",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/stayman.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 3
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 9
    },
    {
     "title": "Stayman Auctions After a 2NT Opening",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/633"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/range_stayman",
     "name": "Range Stayman",
     "level": 6,
     "summary": "Over partner's 1NT, a bid (often 2♠, or 2♣ then 2♠) asks whether opener is minimum or maximum, for responder with an invitation to 2NT or a minor-suit hand."
    }
   ],
   "scenarios": [
    {
     "name": "Stayman",
     "boards": 500,
     "ns_agree": 0.8475,
     "errors_per_board": 0.19,
     "auctions_match": 0.518,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Slam_after_Stayman",
     "boards": 500,
     "ns_agree": 0.7483,
     "errors_per_board": 0.27,
     "auctions_match": 0.16,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7943,
    "errors_per_board": 0.23,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "stayman",
     "off": [
      "notrump.stayman.play=false"
     ],
     "scenarios": [
      "Stayman",
      "Slam_after_Stayman"
     ],
     "bba_keys": [],
     "notes": [
      "Stayman: no .bbsa key changes (notrump.stayman.play=false): BBA cannot be switched",
      "Slam_after_Stayman: no .bbsa key changes (notrump.stayman.play=false): BBA cannot be switched"
     ],
     "unmeasured": "Stayman: no .bbsa key changes (notrump.stayman.play=false): BBA cannot be switched; Slam_after_Stayman: no .bbsa key changes (notrump.stayman.play=false): BBA cannot be switched",
     "repro": null,
     "status": null
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 151,
   "rules": 261,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/stayman.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-responses.notes.md"
   ],
   "status": "bba-good",
   "why": "background (not isolated): errors +0.23 IMPs/board against BBA's, NS calls agreeing 79% (1000 boards)"
  },
  {
   "id": "bidding_conventions/strong_2c",
   "name": "Strong 2♣",
   "section": "constructive",
   "level": 3,
   "summary": "An opening 2♣, artificial and forcing, for the strongest hands: game-forcing or nearly so, balanced or not. Responder usually bids 2♦ to wait, and opener then describes the hand.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/strong_2c"
   ],
   "treatments": [
    {
     "label": "2♣ meaning: conventional",
     "field": "two_level.two_clubs.meaning",
     "option": "conventional",
     "skill": "bidding_conventions/strong_2c",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♣ meaning: natural",
     "field": "two_level.two_clubs.meaning",
     "option": "natural",
     "skill": "bidding_conventions/strong_2c",
     "level": 3,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "2♣ meaning: strong",
     "field": "two_level.two_clubs.meaning",
     "option": "strong",
     "skill": "bidding_conventions/strong_2c",
     "level": 3,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "2♣ meaning: very strong",
     "field": "two_level.two_clubs.meaning",
     "option": "very_strong",
     "skill": "bidding_conventions/strong_2c",
     "level": 3,
     "status": "tested",
     "why": "a rule plays this option"
    }
   ],
   "modules": [
    {
     "name": "strong-openings",
     "title": "2♣ and 2NT openings",
     "file": "conventions/base/strong-openings.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/strong-openings.bid",
     "rules": 67,
     "tests": 50,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/strong-openings.notes.md"
    }
   ],
   "see": [
    {
     "title": "Strong 2♣",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/strong_2c.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 6
    },
    {
     "title": "2C Opening Bids",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/415"
    }
   ],
   "scenarios": [
    {
     "name": "Game_Forcing_2C",
     "boards": 500,
     "ns_agree": 0.663,
     "errors_per_board": -1.082,
     "auctions_match": 0.152,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Bust_Over_Strong_2C",
     "boards": 5,
     "ns_agree": 0.6207,
     "errors_per_board": -4.8,
     "auctions_match": 0.2,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 505,
    "ns_agree": 0.6627,
    "errors_per_board": -1.119,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 50,
   "rules": 67,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/strong-openings.notes.md"
   ],
   "status": "bba-poor",
   "why": "background (not isolated): errors -1.12 IMPs/board against BBA's, NS calls agreeing 66% (505 boards)"
  },
  {
   "id": "bidding_conventions/weak_2s",
   "name": "Weak Twos",
   "section": "constructive",
   "level": 3,
   "summary": "An opening 2♦, 2♥ or 2♠ shows a good six-card suit and less than an opening bid, as a preempt. Responder's 2NT usually asks for more, and a raise continues the preempt.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/weak_2s"
   ],
   "treatments": [
    {
     "label": "2♠ meaning: conventional",
     "field": "two_level.two_spades.meaning",
     "option": "conventional",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♠ meaning: intermediate",
     "field": "two_level.two_spades.meaning",
     "option": "intermediate",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♠ meaning: strong",
     "field": "two_level.two_spades.meaning",
     "option": "strong",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "2♠ meaning: weak",
     "field": "two_level.two_spades.meaning",
     "option": "weak",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "bba-fair",
     "why": "vs BBA in Weak_2_Bids, Basic_Weak_2, Weak_2_Bids_Lax: -0.80 IMPs/board, NS calls agreeing 79%"
    },
    {
     "label": "2♥ meaning: conventional",
     "field": "two_level.two_hearts.meaning",
     "option": "conventional",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♥ meaning: intermediate",
     "field": "two_level.two_hearts.meaning",
     "option": "intermediate",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♥ meaning: strong",
     "field": "two_level.two_hearts.meaning",
     "option": "strong",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "2♥ meaning: weak",
     "field": "two_level.two_hearts.meaning",
     "option": "weak",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "bba-fair",
     "why": "vs BBA in Weak_2_Bids, Basic_Weak_2, Weak_2_Bids_Lax: -0.80 IMPs/board, NS calls agreeing 79%"
    },
    {
     "label": "2♦ meaning: conventional",
     "field": "two_level.two_diamonds.meaning",
     "option": "conventional",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♦ meaning: intermediate",
     "field": "two_level.two_diamonds.meaning",
     "option": "intermediate",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "2♦ meaning: strong",
     "field": "two_level.two_diamonds.meaning",
     "option": "strong",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "2♦ meaning: weak",
     "field": "two_level.two_diamonds.meaning",
     "option": "weak",
     "skill": "bidding_conventions/weak_2s",
     "level": 3,
     "status": "bba-fair",
     "why": "vs BBA in Weak_2_Bids, Basic_Weak_2, Weak_2_Bids_Lax: -0.80 IMPs/board, NS calls agreeing 79%"
    }
   ],
   "modules": [
    {
     "name": "preempts",
     "title": "Weak two-bids and preempts",
     "file": "conventions/base/preempts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.bid",
     "rules": 48,
     "tests": 42,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.notes.md"
    },
    {
     "name": "weak-two-responses",
     "title": "Responses to a weak two",
     "file": "conventions/base/weak-two-responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.bid",
     "rules": 72,
     "tests": 67,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.notes.md"
    }
   ],
   "see": [
    {
     "title": "Weak Two",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/weak_two.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 5
    },
    {
     "title": "Modern 2-Level Preemptive Openings",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/411"
    }
   ],
   "scenarios": [
    {
     "name": "Weak_2_Bids",
     "boards": 500,
     "ns_agree": 0.8461,
     "errors_per_board": -1.084,
     "auctions_match": 0.256,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Basic_Weak_2",
     "boards": 500,
     "ns_agree": 0.7524,
     "errors_per_board": -0.59,
     "auctions_match": 0.34,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "Weak_2_Bids_Lax",
     "boards": 500,
     "ns_agree": 0.7824,
     "errors_per_board": -0.722,
     "auctions_match": 0.24,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.7944,
    "errors_per_board": -0.799,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 109,
   "rules": 120,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/preempts.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.80 IMPs/board against BBA's, NS calls agreeing 79% (1500 boards)"
  },
  {
   "id": "bidding_conventions/two_over_one",
   "name": "2/1 Game Force",
   "section": "constructive",
   "level": 4,
   "summary": "After a one-level opening, responder's new suit at the two level, without jumping and by an unpassed hand, forces to game. The auction can then go slowly, with room to describe both hands.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/two_over_one"
   ],
   "treatments": [
    {
     "label": "2/1 GF except when responder rebids his suit",
     "field": null,
     "status": "gap",
     "why": "a field in convention-card after the pinned tag; not played yet"
    },
    {
     "label": "Standard: 2/1 forces one round",
     "field": null,
     "status": "tested",
     "why": "Standard American cards keep the 11+ one-round force (responses.notes.md)"
    },
    {
     "label": "2/1 game force",
     "field": "major_openings.two_over_one.game_force",
     "skill": "bidding_conventions/two_over_one",
     "level": 4,
     "status": "bba-fair",
     "why": "vs BBA in Two_Over_One: -0.91 IMPs/board, NS calls agreeing 62%"
    }
   ],
   "modules": [
    {
     "name": "game-force",
     "title": "When the auction forces to game",
     "file": "conventions/base/game-force.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/game-force.bid",
     "rules": 0,
     "tests": 1,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/game-force.notes.md"
    }
   ],
   "see": [
    {
     "title": "2 over 1 Game Forcing: Modern Bridge Standard",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/641"
    }
   ],
   "scenarios": [
    {
     "name": "Two_Over_One",
     "boards": 500,
     "ns_agree": 0.622,
     "errors_per_board": -0.912,
     "auctions_match": 0.044,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.622,
    "errors_per_board": -0.912,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "two-over-one",
     "off": [
      "major_openings.two_over_one.game_force=false"
     ],
     "scenarios": [
      "Two_Over_One"
     ],
     "bba_keys": [],
     "notes": [
      "Two_Over_One: no .bbsa key changes (major_openings.two_over_one.game_force=false): BBA cannot be switched"
     ],
     "unmeasured": "Two_Over_One: no .bbsa key changes (major_openings.two_over_one.game_force=false): BBA cannot be switched",
     "repro": null,
     "status": null
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 1,
   "rules": 0,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/game-force.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.91 IMPs/board against BBA's, NS calls agreeing 62% (500 boards)"
  },
  {
   "id": "bidding_conventions/forcing_1nt",
   "name": "Forcing 1NT",
   "section": "constructive",
   "level": 4,
   "summary": "Over partner's 1♥ or 1♠, responder's 1NT is forcing for one round, covering a wide range of hands including invitational ones; opener must bid again, on a three-card minor if need be.",
   "source": "proposed",
   "members": [
    "bidding_conventions/forcing_1nt",
    "bidding_conventions/semi_forcing_1nt"
   ],
   "treatments": [
    {
     "label": "Forcing 1NT response",
     "field": "major_openings.one_nt_response.forcing",
     "skill": "bidding_conventions/forcing_1nt",
     "level": 4,
     "status": "bba-fair",
     "why": "vs BBA in Forcing_NT, Gavin_Semi-Forcing_NT_with_Fit: -0.90 IMPs/board, NS calls agreeing 73%"
    },
    {
     "label": "Semi-forcing 1NT response",
     "field": "major_openings.one_nt_response.semi_forcing",
     "skill": "bidding_conventions/semi_forcing_1nt",
     "level": 5,
     "status": "ab-neutral",
     "why": "self A/B semi-forcing-1nt: neutral (29 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "responses",
     "title": "Responses to one-level suit openings",
     "file": "conventions/base/responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.bid",
     "rules": 87,
     "tests": 75,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 19
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/semi_forcing_1nt",
     "name": "Semi-forcing 1NT",
     "level": 5,
     "summary": "Played instead of the forcing 1NT: responder's 1NT over a major is forcing only if opener has more than a minimum, so opener may pass with a balanced minimum."
    }
   ],
   "scenarios": [
    {
     "name": "Forcing_NT",
     "boards": 500,
     "ns_agree": 0.6781,
     "errors_per_board": -0.782,
     "auctions_match": 0.158,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Gavin_Semi-Forcing_NT_with_Fit",
     "boards": 500,
     "ns_agree": 0.7755,
     "errors_per_board": -1.018,
     "auctions_match": 0.132,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7254,
    "errors_per_board": -0.9,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "semi-forcing-1nt",
     "scenarios": [
      "Gavin_Semi-Forcing_NT_with_Fit",
      "Forcing_NT"
     ],
     "side": "both",
     "changed": 29,
     "verdict": "neutral",
     "z": 0.4,
     "actor_contract": 10,
     "actor_doubling": 0,
     "status": "ab-neutral",
     "changes": {
      "major_openings.one_nt_response.forcing": "false",
      "major_openings.one_nt_response.semi_forcing": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "forcing-1nt",
     "off": [
      "major_openings.one_nt_response.forcing=false"
     ],
     "scenarios": [
      "Forcing_NT"
     ],
     "bba_keys": [
      "Forcing 1NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-fair",
     "changed": 269,
     "changed_ours": 47,
     "changed_bba": 258,
     "rusty_gain": -30,
     "bba_gain": 92,
     "net": -122,
     "net_other": 63,
     "rusty_contract": -30,
     "rusty_doubling": 0,
     "bba_contract": 92,
     "bba_doubling": 0,
     "net_halves": [
      -62,
      -60
     ],
     "net_per_changed": -0.454,
     "rusty_per_changed": -0.112,
     "bba_per_changed": 0.342,
     "halves_agree": true,
     "no_rule_on": 2,
     "no_rule_off": 2
    }
   ],
   "conv_score": {
    "changed": 269,
    "changed_ours": 47,
    "changed_bba": 258,
    "rusty_gain": -30,
    "bba_gain": 92,
    "net": -122,
    "net_other": 63,
    "rusty_contract": -30,
    "rusty_doubling": 0,
    "bba_contract": 92,
    "bba_doubling": 0,
    "net_halves": [
     -62,
     -60
    ],
    "net_per_changed": -0.454,
    "rusty_per_changed": -0.112,
    "bba_per_changed": 0.342,
    "halves_agree": true,
    "runs": [
     "forcing-1nt"
    ],
    "scenarios": [
     "Forcing_NT"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 500,
     "ns_agree": 0.6781,
     "errors_per_board": -0.782,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 75,
   "rules": 87,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.45 IMPs per changed board (our gain -30, BBA's +92, 269 boards); background on these deals -0.78 IMPs/board, NS calls agreeing 68%"
  },
  {
   "id": "bidding_conventions/jacoby_2nt",
   "name": "Jacoby 2NT",
   "section": "constructive",
   "level": 4,
   "summary": "Over partner's 1♥ or 1♠, responder's 2NT shows four or more trumps and game- forcing values. Opener's rebid describes the hand: a short suit at the three level, a good second suit at the four level, or strength by 3M, 3NT or 4M.",
   "source": "proposed",
   "members": [
    "bidding_conventions/jacoby_2nt",
    "bidding_conventions/modified_jacoby_2nt",
    "bidding_conventions/jacoby_2nt_splinters"
   ],
   "treatments": [
    {
     "label": "Jacoby 2NT",
     "field": "major_openings.jacoby_2nt.play",
     "skill": "bidding_conventions/jacoby_2nt",
     "level": 4,
     "status": "bba-good",
     "why": "vs BBA in Jacoby_2N, Jacoby_2N_4x_void: +0.41 IMPs/board, NS calls agreeing 70%"
    },
    {
     "label": "Modified Jacoby 2NT",
     "field": "major_openings.jacoby_2nt.modified",
     "skill": "bidding_conventions/modified_jacoby_2nt",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "jacoby-2nt",
     "title": "Jacoby 2NT",
     "file": "conventions/majors/jacoby-2nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/jacoby-2nt.bid",
     "rules": 6,
     "tests": 1,
     "notes": null
    },
    {
     "name": "splinters",
     "title": "Splinters over 1♥ / 1♠",
     "file": "conventions/majors/splinters.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/splinters.bid",
     "rules": 30,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/splinters.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 10
    },
    {
     "title": "Slam Bidding: Jacoby 2NT",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/407"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/modified_jacoby_2nt",
     "name": "Modified Jacoby 2NT",
     "level": 6,
     "summary": "Played instead of standard Jacoby 2NT: responder's 2NT is the same raise, but opener's rebids are rearranged, usually so that 3♣ shows a minimum and responder can then ask for shortness."
    },
    {
     "id": "bidding_conventions/jacoby_2nt_splinters",
     "name": "Jacoby 2NT & Splinters",
     "level": 4,
     "summary": ""
    }
   ],
   "scenarios": [
    {
     "name": "Jacoby_2N",
     "boards": 500,
     "ns_agree": 0.7072,
     "errors_per_board": 0.456,
     "auctions_match": 0.21,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Jacoby_2N_4x_void",
     "boards": 500,
     "ns_agree": 0.6954,
     "errors_per_board": 0.368,
     "auctions_match": 0.176,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7014,
    "errors_per_board": 0.412,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "jacoby-2nt",
     "off": [
      "major_openings.jacoby_2nt.play=false"
     ],
     "scenarios": [
      "Jacoby_2N",
      "Jacoby_2N_4x_void"
     ],
     "bba_keys": [
      "Jacoby 2NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 879,
     "changed_ours": 812,
     "changed_bba": 837,
     "rusty_gain": 775,
     "bba_gain": 553,
     "net": 222,
     "net_other": -13,
     "rusty_contract": 766,
     "rusty_doubling": 9,
     "bba_contract": 553,
     "bba_doubling": 0,
     "net_halves": [
      113,
      109
     ],
     "net_per_changed": 0.253,
     "rusty_per_changed": 0.882,
     "bba_per_changed": 0.629,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 1
    }
   ],
   "conv_score": {
    "changed": 879,
    "changed_ours": 812,
    "changed_bba": 837,
    "rusty_gain": 775,
    "bba_gain": 553,
    "net": 222,
    "net_other": -13,
    "rusty_contract": 766,
    "rusty_doubling": 9,
    "bba_contract": 553,
    "bba_doubling": 0,
    "net_halves": [
     113,
     109
    ],
    "net_per_changed": 0.253,
    "rusty_per_changed": 0.882,
    "bba_per_changed": 0.629,
    "halves_agree": true,
    "runs": [
     "jacoby-2nt"
    ],
    "scenarios": [
     "Jacoby_2N",
     "Jacoby_2N_4x_void"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.7014,
     "errors_per_board": 0.412,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 22,
   "rules": 36,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/splinters.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.25 IMPs per changed board (our gain +775, BBA's +553, 879 boards); background on these deals +0.41 IMPs/board, NS calls agreeing 70%"
  },
  {
   "id": "bidding_conventions/reverse_bids",
   "name": "Reverse Bids",
   "section": "constructive",
   "level": 4,
   "summary": "Opener's rebid in a new suit higher than the first, at the two level, shows extra strength and a longer first suit; it is forcing for one round in most styles.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/reverse_bids"
   ],
   "treatments": [
    {
     "label": "Reverses forcing",
     "field": "other_conventions.reverse_bids.forcing",
     "skill": "bidding_conventions/reverse_bids",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "rebids",
     "title": "Opener's rebid",
     "file": "conventions/base/rebids.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/rebids.bid",
     "rules": 259,
     "tests": 202,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/rebids.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 7
    }
   ],
   "scenarios": [
    {
     "name": "Reverse_By_Opener",
     "boards": 500,
     "ns_agree": 0.7,
     "errors_per_board": -0.638,
     "auctions_match": 0.132,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Reverse_After_Two_Over_One",
     "boards": 500,
     "ns_agree": 0.5475,
     "errors_per_board": -2.586,
     "auctions_match": 0.0,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.6124,
    "errors_per_board": -1.612,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 202,
   "rules": 259,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/rebids.notes.md"
   ],
   "status": "bba-poor",
   "why": "background (not isolated): errors -1.61 IMPs/board against BBA's, NS calls agreeing 61% (1000 boards)"
  },
  {
   "id": "bidding_conventions/roman_keycard",
   "name": "Roman Keycard",
   "section": "constructive",
   "level": 4,
   "summary": "4NT asks for five keycards, the four aces and the trump king. 1430 answers 5♣ one or four, 5♦ three or none, 5♥ two without the trump queen, 5♠ two with it; 0314 swaps 5♣ and 5♦. The next step asks for the trump queen.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/roman_keycard",
    "bidding_conventions/six_key_rkcb"
   ],
   "treatments": [
    {
     "label": "RKCB 0314",
     "field": "slam.blackwood.rkcb_0314",
     "skill": "bidding_conventions/roman_keycard",
     "level": 4,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "RKCB 1430",
     "field": "slam.blackwood.rkcb_1430",
     "skill": "bidding_conventions/roman_keycard",
     "level": 4,
     "status": "bba-fair",
     "why": "vs BBA in Slam_After_Major_Fit, Slam_after_Transfer: -0.34 IMPs/board, NS calls agreeing 68%"
    },
    {
     "label": "King ask by 5NT",
     "field": "slam.king_ask.five_nt",
     "skill": "bidding_conventions/roman_keycard",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Slam_After_Major_Fit, Slam_after_Transfer: -0.34 IMPs/board, NS calls agreeing 68%"
    },
    {
     "label": "Queen ask",
     "field": "slam.blackwood.queen_ask",
     "skill": "bidding_conventions/roman_keycard",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "RKCB 0314 with a minor as trumps (1430 in the majors)",
     "field": "slam.blackwood.minor_0314",
     "skill": "bidding_conventions/roman_keycard",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "King ask by next available bid",
     "field": "slam.king_ask.next_step",
     "skill": "bidding_conventions/roman_keycard",
     "level": 7,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "rkcb-1430",
     "title": "Roman Keycard Blackwood (1430; 0314 as a treatment)",
     "file": "conventions/slam/rkcb-1430.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/rkcb-1430.bid",
     "rules": 49,
     "tests": 39,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/rkcb-1430.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 9
    },
    {
     "title": "Slam Bidding: 1430 Keycard Blackwood",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/403"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/six_key_rkcb",
     "name": "Six-key Roman Keycard",
     "level": 9,
     "summary": "Roman Keycard with two trump suits: six keycards, the four aces and both trump kings, plus both trump queens, when the partnership has a fit in two suits."
    }
   ],
   "scenarios": [
    {
     "name": "Slam_After_Major_Fit",
     "boards": 500,
     "ns_agree": 0.6354,
     "errors_per_board": -0.056,
     "auctions_match": 0.1,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Slam_after_Transfer",
     "boards": 500,
     "ns_agree": 0.7378,
     "errors_per_board": -0.624,
     "auctions_match": 0.202,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.6845,
    "errors_per_board": -0.34,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "rkcb",
     "off": [
      "slam.blackwood.rkcb_1430=false",
      "slam.blackwood.rkcb_0314=false",
      "slam.blackwood.minor_0314=false",
      "slam.blackwood.standard=true"
     ],
     "scenarios": [
      "Slam_After_Major_Fit",
      "Slam_after_Transfer"
     ],
     "bba_keys": [
      "Blackwood 0123",
      "Blackwood 1430"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-fair",
     "changed": 553,
     "changed_ours": 441,
     "changed_bba": 409,
     "rusty_gain": -109,
     "bba_gain": 67,
     "net": -176,
     "net_other": 37,
     "rusty_contract": -109,
     "rusty_doubling": 0,
     "bba_contract": 67,
     "bba_doubling": 0,
     "net_halves": [
      -195,
      19
     ],
     "net_per_changed": -0.318,
     "rusty_per_changed": -0.197,
     "bba_per_changed": 0.121,
     "halves_agree": false,
     "no_rule_on": 7,
     "no_rule_off": 7
    }
   ],
   "conv_score": {
    "changed": 553,
    "changed_ours": 441,
    "changed_bba": 409,
    "rusty_gain": -109,
    "bba_gain": 67,
    "net": -176,
    "net_other": 37,
    "rusty_contract": -109,
    "rusty_doubling": 0,
    "bba_contract": 67,
    "bba_doubling": 0,
    "net_halves": [
     -195,
     19
    ],
    "net_per_changed": -0.318,
    "rusty_per_changed": -0.197,
    "bba_per_changed": 0.121,
    "halves_agree": false,
    "runs": [
     "rkcb"
    ],
    "scenarios": [
     "Slam_After_Major_Fit",
     "Slam_after_Transfer"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 1000,
     "ns_agree": 0.6845,
     "errors_per_board": -0.34,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 39,
   "rules": 49,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/rkcb-1430.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.32 IMPs per changed board (our gain -109, BBA's +67, 553 boards); background on these deals -0.34 IMPs/board, NS calls agreeing 68%"
  },
  {
   "id": "bidding_conventions/smolen",
   "name": "Smolen",
   "section": "constructive",
   "level": 4,
   "summary": "After 1NT–2♣–2♦, responder with five cards in one major, four in the other and game values jumps to three of the four-card major, so the strong hand becomes declarer in a 5-3 fit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/smolen"
   ],
   "treatments": [
    {
     "label": "Smolen",
     "field": "notrump.smolen.play",
     "skill": "bidding_conventions/smolen",
     "level": 4,
     "status": "bba-good",
     "why": "vs BBA in Smolen, Smolen_Invitational, Smolen_after_2N: +0.21 IMPs/board, NS calls agreeing 85%"
    }
   ],
   "modules": [
    {
     "name": "smolen",
     "title": "Smolen: 5-4 in the majors after Stayman's denial",
     "file": "conventions/notrump/smolen.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/smolen.bid",
     "rules": 9,
     "tests": 15,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/smolen.notes.md"
    }
   ],
   "see": [
    {
     "title": "Smolen and 5/5 Majors After a 2NT Opening",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/634"
    }
   ],
   "scenarios": [
    {
     "name": "Smolen",
     "boards": 500,
     "ns_agree": 0.9001,
     "errors_per_board": 0.14,
     "auctions_match": 0.7,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    },
    {
     "name": "Smolen_Invitational",
     "boards": 500,
     "ns_agree": 0.7845,
     "errors_per_board": 0.112,
     "auctions_match": 0.21,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Smolen_after_2N",
     "boards": 500,
     "ns_agree": 0.8559,
     "errors_per_board": 0.384,
     "auctions_match": 0.486,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.8498,
    "errors_per_board": 0.212,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "smolen",
     "off": [
      "notrump.smolen.play=false"
     ],
     "scenarios": [
      "Smolen",
      "Smolen_Invitational",
      "Smolen_after_2N"
     ],
     "bba_keys": [
      "SMOLEN"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1500
     },
     "status": "conv-good",
     "changed": 1302,
     "changed_ours": 1302,
     "changed_bba": 978,
     "rusty_gain": 1800,
     "bba_gain": 183,
     "net": 1617,
     "net_other": -18,
     "rusty_contract": 1800,
     "rusty_doubling": 0,
     "bba_contract": 194,
     "bba_doubling": -11,
     "net_halves": [
      810,
      807
     ],
     "net_per_changed": 1.242,
     "rusty_per_changed": 1.382,
     "bba_per_changed": 0.141,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 1302,
    "changed_ours": 1302,
    "changed_bba": 978,
    "rusty_gain": 1800,
    "bba_gain": 183,
    "net": 1617,
    "net_other": -18,
    "rusty_contract": 1800,
    "rusty_doubling": 0,
    "bba_contract": 194,
    "bba_doubling": -11,
    "net_halves": [
     810,
     807
    ],
    "net_per_changed": 1.242,
    "rusty_per_changed": 1.382,
    "bba_per_changed": 0.141,
    "halves_agree": true,
    "runs": [
     "smolen"
    ],
    "scenarios": [
     "Smolen",
     "Smolen_Invitational",
     "Smolen_after_2N"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1500,
     "ns_agree": 0.8498,
     "errors_per_board": 0.212,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 15,
   "rules": 9,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/smolen.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +1.24 IMPs per changed board (our gain +1800, BBA's +183, 1302 boards); background on these deals +0.21 IMPs/board, NS calls agreeing 85%"
  },
  {
   "id": "bidding_conventions/walsh",
   "name": "Walsh",
   "section": "constructive",
   "level": 4,
   "summary": "Over partner's 1♣, responder with a weak or moderate hand bids a four-card major ahead of longer diamonds, so opener can rebid 1NT with any balanced hand knowing no 4-4 major fit is lost.",
   "source": "proposed",
   "members": [
    "bidding_conventions/walsh",
    "bidding_conventions/transfer_walsh"
   ],
   "treatments": [
    {
     "label": "Walsh responses (BBA's switch)",
     "field": "minor_openings.walsh.play",
     "skill": "bidding_conventions/walsh",
     "level": 4,
     "status": "bba-good",
     "why": "vs BBA in 1C_WalshStyle: -0.18 IMPs/board, NS calls agreeing 70%"
    },
    {
     "label": "Transfer responses to 1♣",
     "field": "minor_openings.one_club.transfer_resp",
     "skill": "bidding_conventions/transfer_walsh",
     "level": 9,
     "status": "ab-neutral",
     "why": "self A/B transfer-walsh: neutral (701 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "responses",
     "title": "Responses to one-level suit openings",
     "file": "conventions/base/responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.bid",
     "rules": 87,
     "tests": 75,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.notes.md"
    },
    {
     "name": "transfer-walsh",
     "title": "Transfer Walsh responses to 1♣",
     "file": "conventions/base/transfer-walsh.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/transfer-walsh.bid",
     "rules": 95,
     "tests": 28,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/transfer-walsh.notes.md"
    }
   ],
   "see": [
    {
     "title": "Walsh Style",
     "by": "Larry Cohen",
     "url": "https://www.larryco.com/bridge-articles/walsh-style"
    },
    {
     "title": "Thinking and Responding: Walsh and Extended Walsh",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/511"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/transfer_walsh",
     "name": "Transfer Walsh",
     "level": 9,
     "summary": "Over partner's 1♣, responder's 1♦ and 1♥ are transfers to the next suit, showing four or more cards in it, and 1♠ denies a four-card major. Opener can accept the transfer, so the 1♣ hand often declares."
    }
   ],
   "scenarios": [
    {
     "name": "1C_WalshStyle",
     "boards": 500,
     "ns_agree": 0.6963,
     "errors_per_board": -0.178,
     "auctions_match": 0.114,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-good"
    },
    {
     "name": "Transfer_Walsh",
     "boards": 500,
     "ns_agree": 0.7245,
     "errors_per_board": -0.67,
     "auctions_match": 0.142,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7098,
    "errors_per_board": -0.424,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "transfer-walsh",
     "scenarios": [
      "Transfer_Walsh",
      "1C_WalshStyle"
     ],
     "side": "both",
     "changed": 701,
     "verdict": "neutral",
     "z": -1.4,
     "actor_contract": -173,
     "actor_doubling": 27,
     "status": "ab-neutral",
     "changes": {
      "minor_openings.one_club.transfer_resp": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "walsh",
     "off": [
      "minor_openings.walsh.play=false"
     ],
     "scenarios": [
      "1C_WalshStyle"
     ],
     "bba_keys": [
      "Walsh style"
     ],
     "notes": [
      "Transfer_Walsh: 21GF-DEFAULT does not play it or leaves it unset (minor_openings.walsh.play=False)"
     ],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 304,
     "changed_ours": 135,
     "changed_bba": 258,
     "rusty_gain": 17,
     "bba_gain": 27,
     "net": -10,
     "net_other": -6,
     "rusty_contract": 17,
     "rusty_doubling": 0,
     "bba_contract": 27,
     "bba_doubling": 0,
     "net_halves": [
      -10,
      0
     ],
     "net_per_changed": -0.033,
     "rusty_per_changed": 0.056,
     "bba_per_changed": 0.089,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 304,
    "changed_ours": 135,
    "changed_bba": 258,
    "rusty_gain": 17,
    "bba_gain": 27,
    "net": -10,
    "net_other": -6,
    "rusty_contract": 17,
    "rusty_doubling": 0,
    "bba_contract": 27,
    "bba_doubling": 0,
    "net_halves": [
     -10,
     0
    ],
    "net_per_changed": -0.033,
    "rusty_per_changed": 0.056,
    "bba_per_changed": 0.089,
    "halves_agree": false,
    "runs": [
     "walsh"
    ],
    "scenarios": [
     "1C_WalshStyle"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.6963,
     "errors_per_board": -0.178,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 103,
   "rules": 182,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responses.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/transfer-walsh.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score -0.03 IMPs per changed board (our gain +17, BBA's +27, 304 boards); background on these deals -0.18 IMPs/board, NS calls agreeing 70%"
  },
  {
   "id": "bidding_conventions/western_cuebid",
   "name": "Western cue bid",
   "section": "constructive",
   "level": 4,
   "summary": "A cue bid of the opponents' suit when looking for 3NT asks partner to bid notrump with a stopper in that suit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/western_cuebid"
   ],
   "treatments": [
    {
     "label": "Western cuebid",
     "field": "slam.western_cuebid.play",
     "skill": "bidding_conventions/western_cuebid",
     "level": 4,
     "status": "ab-neutral",
     "why": "self A/B western-cue: neutral (24 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "western-cue",
     "title": "Western cue bid: three of their suit asks for a stopper for 3NT",
     "file": "conventions/competitive/western-cue.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/western-cue.bid",
     "rules": 16,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/western-cue.notes.md"
    }
   ],
   "see": [
    {
     "title": "Thinking and Responding: Western Cuebids",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/510"
    }
   ],
   "scenarios": [
    {
     "name": "Western_Cue_Bid",
     "boards": 500,
     "ns_agree": 0.6513,
     "errors_per_board": 0.0,
     "auctions_match": 0.082,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6513,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "western-cue",
     "scenarios": [
      "Western_Cue_Bid"
     ],
     "side": "both",
     "changed": 24,
     "verdict": "neutral",
     "z": 0.1,
     "actor_contract": -26,
     "actor_doubling": 31,
     "status": "ab-neutral",
     "changes": {
      "slam.western_cuebid.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 10,
   "rules": 16,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/western-cue.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B western-cue: neutral (24 boards changed)"
  },
  {
   "id": "bidding_conventions/bergen_raises",
   "name": "Bergen raises",
   "section": "constructive",
   "level": 5,
   "summary": "Over partner's 1♥ or 1♠, responder's jumps to 3♣ and 3♦ show four-card raises of different strength (usually 3♣ constructive, 3♦ limit) and 3M is preemptive, so opener knows the fit and strength at once.",
   "source": "proposed",
   "members": [
    "bidding_conventions/bergen_raises",
    "bidding_conventions/reverse_bergen_raises"
   ],
   "treatments": [
    {
     "label": "Bergen raises",
     "field": "major_openings.bergen_raises.play",
     "skill": "bidding_conventions/bergen_raises",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Bergen_Raises: +0.01 IMPs/board, NS calls agreeing 63%"
    },
    {
     "label": "Reverse Bergen raises",
     "field": "major_openings.bergen_raises.reverse",
     "skill": "bidding_conventions/reverse_bergen_raises",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "bergen",
     "title": "Bergen raises: four-card raises at the three level",
     "file": "conventions/majors/bergen.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/bergen.bid",
     "rules": 24,
     "tests": 23,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/bergen.notes.md"
    }
   ],
   "see": [
    {
     "title": "Bergen Raises",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/bergen_raises.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 13
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 3
    },
    {
     "title": "Bergen Raises",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/572"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/reverse_bergen_raises",
     "name": "Reverse Bergen raises",
     "level": 6,
     "summary": "Played instead of Bergen raises: the same four-card raises with the meanings of 3♣ and 3♦ swapped."
    }
   ],
   "scenarios": [
    {
     "name": "Bergen_Raises",
     "boards": 500,
     "ns_agree": 0.6268,
     "errors_per_board": 0.008,
     "auctions_match": 0.132,
     "ns_card": "21GF-GIB-Bergen",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6268,
    "errors_per_board": 0.008,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "bergen",
     "off": [
      "major_openings.bergen_raises.play=false"
     ],
     "scenarios": [
      "Bergen_Raises"
     ],
     "bba_keys": [
      "Bergen"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-fair",
     "changed": 209,
     "changed_ours": 203,
     "changed_bba": 102,
     "rusty_gain": -28,
     "bba_gain": 9,
     "net": -37,
     "net_other": -21,
     "rusty_contract": -33,
     "rusty_doubling": 5,
     "bba_contract": 17,
     "bba_doubling": -8,
     "net_halves": [
      -22,
      -15
     ],
     "net_per_changed": -0.177,
     "rusty_per_changed": -0.134,
     "bba_per_changed": 0.043,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 209,
    "changed_ours": 203,
    "changed_bba": 102,
    "rusty_gain": -28,
    "bba_gain": 9,
    "net": -37,
    "net_other": -21,
    "rusty_contract": -33,
    "rusty_doubling": 5,
    "bba_contract": 17,
    "bba_doubling": -8,
    "net_halves": [
     -22,
     -15
    ],
    "net_per_changed": -0.177,
    "rusty_per_changed": -0.134,
    "bba_per_changed": 0.043,
    "halves_agree": true,
    "runs": [
     "bergen"
    ],
    "scenarios": [
     "Bergen_Raises"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 500,
     "ns_agree": 0.6268,
     "errors_per_board": 0.008,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 23,
   "rules": 24,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/bergen.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.18 IMPs per changed board (our gain -28, BBA's +9, 209 boards); background on these deals +0.01 IMPs/board, NS calls agreeing 63%"
  },
  {
   "id": "bidding_conventions/control_bids",
   "name": "Control (Cue) Bids",
   "section": "constructive",
   "level": 5,
   "summary": "With a trump suit agreed and slam possible, bidding a new suit below game shows a control there (an ace or void, and in many styles a king or singleton), so the partnership can find out whether a suit is unguarded before asking for keycards.",
   "source": "proposed",
   "members": [
    "bidding_conventions/control_bids"
   ],
   "treatments": [
    {
     "label": "Control (cue) bids",
     "field": "slam.cue_bids.play",
     "skill": "bidding_conventions/control_bids",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Slam_After_Major_Fit: -0.06 IMPs/board, NS calls agreeing 64%"
    }
   ],
   "modules": [
    {
     "name": "control-bids",
     "title": "Control bids before the keycard ask",
     "file": "conventions/slam/control-bids.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/control-bids.bid",
     "rules": 23,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/control-bids.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 20
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 20
    },
    {
     "title": "Slam Bidding: Control-Showing Bids",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/406"
    }
   ],
   "scenarios": [
    {
     "name": "Slam_After_Major_Fit",
     "boards": 500,
     "ns_agree": 0.6354,
     "errors_per_board": -0.056,
     "auctions_match": 0.1,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6354,
    "errors_per_board": -0.056,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "control-bids",
     "off": [
      "slam.cue_bids.play=false"
     ],
     "scenarios": [
      "Slam_After_Major_Fit"
     ],
     "bba_keys": [
      "Cue bid"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 265,
     "changed_ours": 94,
     "changed_bba": 240,
     "rusty_gain": 13,
     "bba_gain": -40,
     "net": 53,
     "net_other": 33,
     "rusty_contract": 13,
     "rusty_doubling": 0,
     "bba_contract": -40,
     "bba_doubling": 0,
     "net_halves": [
      44,
      9
     ],
     "net_per_changed": 0.2,
     "rusty_per_changed": 0.049,
     "bba_per_changed": -0.151,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 265,
    "changed_ours": 94,
    "changed_bba": 240,
    "rusty_gain": 13,
    "bba_gain": -40,
    "net": 53,
    "net_other": 33,
    "rusty_contract": 13,
    "rusty_doubling": 0,
    "bba_contract": -40,
    "bba_doubling": 0,
    "net_halves": [
     44,
     9
    ],
    "net_per_changed": 0.2,
    "rusty_per_changed": 0.049,
    "bba_per_changed": -0.151,
    "halves_agree": true,
    "runs": [
     "control-bids"
    ],
    "scenarios": [
     "Slam_After_Major_Fit"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.6354,
     "errors_per_board": -0.056,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 21,
   "rules": 23,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/control-bids.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-fair",
   "why": "convention score +0.20 IMPs per changed board (our gain +13, BBA's -40, 265 boards); background on these deals -0.06 IMPs/board, NS calls agreeing 64%"
  },
  {
   "id": "bidding_conventions/drury",
   "name": "Drury",
   "section": "constructive",
   "level": 5,
   "summary": "By a passed hand over partner's third- or fourth-seat 1♥ or 1♠, 2♣ asks whether opener has a full opening, with a fit for the major. In the original form opener's 2♦ shows a light opening; Reverse Drury swaps opener's replies.",
   "source": "proposed",
   "members": [
    "bidding_conventions/drury",
    "bidding_conventions/reverse_drury",
    "bidding_conventions/two_way_drury"
   ],
   "treatments": [
    {
     "label": "Drury",
     "field": "major_openings.drury.play",
     "skill": "bidding_conventions/drury",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Reverse Drury",
     "field": "major_openings.drury.reverse",
     "skill": "bidding_conventions/reverse_drury",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Drury: +0.01 IMPs/board, NS calls agreeing 67%"
    },
    {
     "label": "Drury in competition",
     "field": "major_openings.drury.in_comp",
     "skill": "bidding_conventions/drury",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Two-way Drury (2♦)",
     "field": "major_openings.drury.two_d",
     "skill": "bidding_conventions/two_way_drury",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "drury",
     "title": "Drury: a passed hand's 2♣ limit raise",
     "file": "conventions/majors/drury.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/drury.bid",
     "rules": 18,
     "tests": 20,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/drury.notes.md"
    }
   ],
   "see": [],
   "variants": [
    {
     "id": "bidding_conventions/reverse_drury",
     "name": "Reverse Drury",
     "level": 5,
     "summary": "By a passed hand over partner's third- or fourth-seat 1♥ or 1♠, 2♣ shows a limit raise with three or more trumps. Opener rebids two of the major with a light opening; other bids show a full one."
    },
    {
     "id": "bidding_conventions/two_way_drury",
     "name": "Two-way Drury",
     "level": 6,
     "summary": "Played instead of Drury: a passed hand's 2♣ and 2♦ over partner's third- or fourth-seat major both show limit raises, split by trump length (usually 2♣ three trumps, 2♦ four)."
    }
   ],
   "scenarios": [
    {
     "name": "Drury",
     "boards": 500,
     "ns_agree": 0.6689,
     "errors_per_board": 0.008,
     "auctions_match": 0.028,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6689,
    "errors_per_board": 0.008,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "drury",
     "off": [
      "major_openings.drury.play=false",
      "major_openings.drury.reverse=false",
      "major_openings.drury.two_d=false"
     ],
     "scenarios": [
      "Drury"
     ],
     "bba_keys": [
      "Reverse drury"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 499,
     "changed_ours": 494,
     "changed_bba": 468,
     "rusty_gain": 61,
     "bba_gain": 78,
     "net": -17,
     "net_other": -151,
     "rusty_contract": 59,
     "rusty_doubling": 2,
     "bba_contract": 78,
     "bba_doubling": 0,
     "net_halves": [
      26,
      -43
     ],
     "net_per_changed": -0.034,
     "rusty_per_changed": 0.122,
     "bba_per_changed": 0.156,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 499,
    "changed_ours": 494,
    "changed_bba": 468,
    "rusty_gain": 61,
    "bba_gain": 78,
    "net": -17,
    "net_other": -151,
    "rusty_contract": 59,
    "rusty_doubling": 2,
    "bba_contract": 78,
    "bba_doubling": 0,
    "net_halves": [
     26,
     -43
    ],
    "net_per_changed": -0.034,
    "rusty_per_changed": 0.122,
    "bba_per_changed": 0.156,
    "halves_agree": false,
    "runs": [
     "drury"
    ],
    "scenarios": [
     "Drury"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.6689,
     "errors_per_board": 0.008,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 20,
   "rules": 18,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/drury.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score -0.03 IMPs per changed board (our gain +61, BBA's +78, 499 boards); background on these deals +0.01 IMPs/board, NS calls agreeing 67%"
  },
  {
   "id": "bidding_conventions/fourth_suit_forcing",
   "name": "Fourth Suit Forcing",
   "section": "constructive",
   "level": 5,
   "summary": "When three suits have been bid, responder's bid of the fourth suit is artificial and forcing (for one round, or to game by agreement), asking opener to describe the hand further.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/fourth_suit_forcing"
   ],
   "treatments": [
    {
     "label": "Fourth suit forcing",
     "field": "other_conventions.fourth_suit_forcing.play",
     "skill": "bidding_conventions/fourth_suit_forcing",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Fourth suit forcing (1 round)",
     "field": "other_conventions.fourth_suit_forcing.one_round",
     "skill": "bidding_conventions/fourth_suit_forcing",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Fourth suit forcing (game force)",
     "field": "other_conventions.fourth_suit_forcing.game_force",
     "skill": "bidding_conventions/fourth_suit_forcing",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Fourth_Suit_Forcing: +0.44 IMPs/board, NS calls agreeing 73%"
    }
   ],
   "modules": [
    {
     "name": "fourth-suit-forcing",
     "title": "Fourth suit forcing",
     "file": "conventions/base/fourth-suit-forcing.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fourth-suit-forcing.bid",
     "rules": 11,
     "tests": 6,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fourth-suit-forcing.notes.md"
    },
    {
     "name": "responder-rebids",
     "title": "Responder's second call",
     "file": "conventions/base/responder-rebids.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.bid",
     "rules": 248,
     "tests": 150,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.notes.md"
    }
   ],
   "see": [
    {
     "title": "Fourth Suit Forcing",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/fourth_suit_forcing.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 21
    },
    {
     "title": "2/1: Bidding the 4th Suit",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/424"
    }
   ],
   "scenarios": [
    {
     "name": "Fourth_Suit_Forcing",
     "boards": 500,
     "ns_agree": 0.7253,
     "errors_per_board": 0.444,
     "auctions_match": 0.224,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7253,
    "errors_per_board": 0.444,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "fourth-suit-forcing",
     "off": [
      "other_conventions.fourth_suit_forcing.play=false",
      "other_conventions.fourth_suit_forcing.one_round=false",
      "other_conventions.fourth_suit_forcing.game_force=false"
     ],
     "scenarios": [
      "Fourth_Suit_Forcing"
     ],
     "bba_keys": [
      "Fourth suit game force"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 275,
     "changed_ours": 122,
     "changed_bba": 232,
     "rusty_gain": 80,
     "bba_gain": 43,
     "net": 37,
     "net_other": 32,
     "rusty_contract": 80,
     "rusty_doubling": 0,
     "bba_contract": 43,
     "bba_doubling": 0,
     "net_halves": [
      -17,
      54
     ],
     "net_per_changed": 0.135,
     "rusty_per_changed": 0.291,
     "bba_per_changed": 0.156,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 275,
    "changed_ours": 122,
    "changed_bba": 232,
    "rusty_gain": 80,
    "bba_gain": 43,
    "net": 37,
    "net_other": 32,
    "rusty_contract": 80,
    "rusty_doubling": 0,
    "bba_contract": 43,
    "bba_doubling": 0,
    "net_halves": [
     -17,
     54
    ],
    "net_per_changed": 0.135,
    "rusty_per_changed": 0.291,
    "bba_per_changed": 0.156,
    "halves_agree": false,
    "runs": [
     "fourth-suit-forcing"
    ],
    "scenarios": [
     "Fourth_Suit_Forcing"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.7253,
     "errors_per_board": 0.444,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 156,
   "rules": 259,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/fourth-suit-forcing.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/responder-rebids.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.14 IMPs per changed board (our gain +80, BBA's +43, 275 boards); background on these deals +0.44 IMPs/board, NS calls agreeing 73%"
  },
  {
   "id": "bidding_conventions/help_suit_game_try",
   "name": "Help Suit Game Try",
   "section": "constructive",
   "level": 5,
   "summary": "After a major-suit raise, opener's new suit is a game try asking for help there: responder bids game with honours or shortness in that suit and signs off without.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/help_suit_game_try",
    "bidding_conventions/two_way_game_tries"
   ],
   "treatments": [
    {
     "label": "Help suit game tries",
     "field": "other_conventions.help_suit_game_tries.play",
     "skill": "bidding_conventions/help_suit_game_try",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Two-way game tries",
     "field": "other_conventions.two_way_game_tries.play",
     "skill": "bidding_conventions/two_way_game_tries",
     "level": 8,
     "status": "bba-good",
     "why": "vs BBA in Help_Suit_Game_Try, Two-Way_Game_Try: -0.16 IMPs/board, NS calls agreeing 80%"
    }
   ],
   "modules": [
    {
     "name": "game-tries",
     "title": "Help-suit and two-way game tries after 1M-2M",
     "file": "conventions/majors/game-tries.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/game-tries.bid",
     "rules": 22,
     "tests": 19,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/game-tries.notes.md"
    }
   ],
   "see": [
    {
     "title": "Help Suit Game Try",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/help_suit_game_try.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 14
    },
    {
     "title": "Help Suit Game Tries",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/465"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/two_way_game_tries",
     "name": "Two-way game tries",
     "level": 8,
     "summary": "After a major raise, opener's 2NT (or the next step) is a relay for one kind of game try and new suits are another, so opener can make short-suit and long-suit tries."
    }
   ],
   "scenarios": [
    {
     "name": "Help_Suit_Game_Try",
     "boards": 500,
     "ns_agree": 0.7966,
     "errors_per_board": -0.232,
     "auctions_match": 0.406,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    },
    {
     "name": "Two-Way_Game_Try",
     "boards": 500,
     "ns_agree": 0.7958,
     "errors_per_board": -0.094,
     "auctions_match": 0.342,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7962,
    "errors_per_board": -0.163,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "help-suit-game-try",
     "off": [
      "other_conventions.help_suit_game_tries.play=false"
     ],
     "scenarios": [
      "Help_Suit_Game_Try"
     ],
     "bba_keys": [],
     "notes": [
      "Help_Suit_Game_Try: 21GF-GIB does not play it or leaves it unset (other_conventions.help_suit_game_tries.play=None)"
     ],
     "unmeasured": "Help_Suit_Game_Try: 21GF-GIB does not play it or leaves it unset (other_conventions.help_suit_game_tries.play=None)",
     "repro": null,
     "status": null
    },
    {
     "name": "two-way-game-tries",
     "off": [
      "other_conventions.two_way_game_tries.play=false"
     ],
     "scenarios": [
      "Two-Way_Game_Try"
     ],
     "bba_keys": [
      "Two way game tries"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 317,
     "changed_ours": 262,
     "changed_bba": 199,
     "rusty_gain": -81,
     "bba_gain": -56,
     "net": -25,
     "net_other": 38,
     "rusty_contract": -81,
     "rusty_doubling": 0,
     "bba_contract": -56,
     "bba_doubling": 0,
     "net_halves": [
      -61,
      36
     ],
     "net_per_changed": -0.079,
     "rusty_per_changed": -0.256,
     "bba_per_changed": -0.177,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 317,
    "changed_ours": 262,
    "changed_bba": 199,
    "rusty_gain": -81,
    "bba_gain": -56,
    "net": -25,
    "net_other": 38,
    "rusty_contract": -81,
    "rusty_doubling": 0,
    "bba_contract": -56,
    "bba_doubling": 0,
    "net_halves": [
     -61,
     36
    ],
    "net_per_changed": -0.079,
    "rusty_per_changed": -0.256,
    "bba_per_changed": -0.177,
    "halves_agree": false,
    "runs": [
     "two-way-game-tries"
    ],
    "scenarios": [
     "Two-Way_Game_Try"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.7958,
     "errors_per_board": -0.094,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 19,
   "rules": 22,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/game-tries.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score -0.08 IMPs per changed board (our gain -81, BBA's -56, 317 boards); background on these deals -0.09 IMPs/board, NS calls agreeing 80%"
  },
  {
   "id": "bidding_conventions/inverted_minors",
   "name": "Inverted Minor Raises",
   "section": "constructive",
   "level": 5,
   "summary": "Over partner's 1♣ or 1♦, the single raise is strong (invitational or better, forcing one round) and the jump raise is weak, the reverse of the natural meanings. It usually denies a four-card major.",
   "source": "proposed",
   "members": [
    "bidding_conventions/inverted_minors"
   ],
   "treatments": [
    {
     "label": "1♣ single raise: game forcing",
     "field": "minor_openings.one_club.single_raise.gf",
     "skill": "bidding_conventions/inverted_minors",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "1♣ single raise: invitational+",
     "field": "minor_openings.one_club.single_raise.inv",
     "skill": "bidding_conventions/inverted_minors",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Inverted minors",
     "field": "minor_openings.inverted_minors.play",
     "skill": "bidding_conventions/inverted_minors",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Inverted_Minors: +0.46 IMPs/board, NS calls agreeing 62%"
    }
   ],
   "modules": [
    {
     "name": "inverted-minors",
     "title": "Inverted minor raises",
     "file": "conventions/base/inverted-minors.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/inverted-minors.bid",
     "rules": 62,
     "tests": 13,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/inverted-minors.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 17
    },
    {
     "title": "Inverted Minors and 1D-2C Auctions with Structure",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/591"
    }
   ],
   "scenarios": [
    {
     "name": "Inverted_Minors",
     "boards": 500,
     "ns_agree": 0.6194,
     "errors_per_board": 0.462,
     "auctions_match": 0.152,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6194,
    "errors_per_board": 0.462,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "inverted-minors",
     "off": [
      "minor_openings.inverted_minors.play=false"
     ],
     "scenarios": [
      "Inverted_Minors"
     ],
     "bba_keys": [
      "Inverted minors"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-fair",
     "changed": 479,
     "changed_ours": 444,
     "changed_bba": 409,
     "rusty_gain": 142,
     "bba_gain": 208,
     "net": -66,
     "net_other": -102,
     "rusty_contract": 142,
     "rusty_doubling": 0,
     "bba_contract": 208,
     "bba_doubling": 0,
     "net_halves": [
      24,
      -90
     ],
     "net_per_changed": -0.138,
     "rusty_per_changed": 0.296,
     "bba_per_changed": 0.434,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 479,
    "changed_ours": 444,
    "changed_bba": 409,
    "rusty_gain": 142,
    "bba_gain": 208,
    "net": -66,
    "net_other": -102,
    "rusty_contract": 142,
    "rusty_doubling": 0,
    "bba_contract": 208,
    "bba_doubling": 0,
    "net_halves": [
     24,
     -90
    ],
    "net_per_changed": -0.138,
    "rusty_per_changed": 0.296,
    "bba_per_changed": 0.434,
    "halves_agree": false,
    "runs": [
     "inverted-minors"
    ],
    "scenarios": [
     "Inverted_Minors"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 500,
     "ns_agree": 0.6194,
     "errors_per_board": 0.462,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 13,
   "rules": 62,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/inverted-minors.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.14 IMPs per changed board (our gain +142, BBA's +208, 479 boards); background on these deals +0.46 IMPs/board, NS calls agreeing 62%"
  },
  {
   "id": "bidding_conventions/minor_suit_transfers",
   "name": "Minor-Suit Transfers over 1NT",
   "section": "constructive",
   "level": 5,
   "summary": "Over partner's 1NT, responder's 2♠ and 2NT (or 3♣) are transfers or relays to the minors, so a long minor can be shown weak to play or strong with slam interest.",
   "source": "proposed",
   "members": [
    "bidding_conventions/minor_suit_transfers"
   ],
   "treatments": [
    {
     "label": "1NT–2NT transfer",
     "field": "notrump.transfers.two_nt",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "1NT–2NT transfer to clubs",
     "field": "notrump.transfers.two_nt_clubs",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "bba-poor",
     "why": "vs BBA in Minor_Suit_Transfer: -1.35 IMPs/board, NS calls agreeing 90%"
    },
    {
     "label": "1NT–2NT transfer to diamonds",
     "field": "notrump.transfers.two_nt_diamonds",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "1NT–2♠ transfer",
     "field": "notrump.transfers.spades_relay",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "1NT–2♠ transfer to clubs",
     "field": "notrump.transfers.two_s_clubs",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in 2N_and_1_Minor: -0.45 IMPs/board, NS calls agreeing 65%"
    },
    {
     "label": "1NT–3♣ transfer to diamonds",
     "field": "notrump.transfers.three_c_diamonds",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Minor_Suit_Transfer, 2N_and_1_Minor: -0.90 IMPs/board, NS calls agreeing 76%"
    },
    {
     "label": "Minor-suit responses to 1NT: bba",
     "field": "notrump.minor_transfers",
     "option": "bba",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in 2N_and_1_Minor: -0.45 IMPs/board, NS calls agreeing 65%"
    },
    {
     "label": "Minor-suit responses to 1NT: four way",
     "field": "notrump.minor_transfers",
     "option": "four_way",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "Minor-suit responses to 1NT: four way reversed",
     "field": "notrump.minor_transfers",
     "option": "four_way_reversed",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "Minor-suit responses to 1NT: relay",
     "field": "notrump.minor_transfers",
     "option": "relay",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 5,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "2NT–3♠ transfer to clubs",
     "field": "notrump.two_nt.transfer_3s_clubs",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "2NT–4♣ transfer to diamonds",
     "field": "notrump.two_nt.transfer_4c_diamonds",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Minor suit transfers after 2NT",
     "field": "notrump.two_nt.minor_transfers",
     "skill": "bidding_conventions/minor_suit_transfers",
     "level": 6,
     "status": "bba-fair",
     "why": "vs BBA in Minor_Suit_Transfer, 2N_and_1_Minor: -0.90 IMPs/board, NS calls agreeing 76%"
    }
   ],
   "modules": [
    {
     "name": "minor-transfers",
     "title": "Minor-suit responses to 1NT",
     "file": "conventions/notrump/minor-transfers.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/minor-transfers.bid",
     "rules": 30,
     "tests": 30,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/minor-transfers.notes.md"
    },
    {
     "name": "two-nt-minors",
     "title": "Minor-suit transfers and Minor Suit Stayman over 2NT",
     "file": "conventions/notrump/two-nt-minors.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-minors.bid",
     "rules": 20,
     "tests": 20,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-minors.notes.md"
    }
   ],
   "see": [
    {
     "title": "Minor Suit Transfers",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/minor_suit_transfers.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 5
    }
   ],
   "scenarios": [
    {
     "name": "Minor_Suit_Transfer",
     "boards": 500,
     "ns_agree": 0.9049,
     "errors_per_board": -1.348,
     "auctions_match": 0.626,
     "ns_card": "21GF-MSTandMSS",
     "status": "bba-poor"
    },
    {
     "name": "2N_and_1_Minor",
     "boards": 500,
     "ns_agree": 0.6536,
     "errors_per_board": -0.448,
     "auctions_match": 0.266,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7633,
    "errors_per_board": -0.898,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "minor-suit-transfers",
     "off": [
      "notrump.minor_transfers=none",
      "notrump.transfers.two_s_clubs=false",
      "notrump.transfers.two_nt_clubs=false",
      "notrump.transfers.two_nt_diamonds=false",
      "notrump.transfers.three_c_diamonds=false",
      "notrump.two_nt.minor_transfers=false"
     ],
     "scenarios": [
      "Minor_Suit_Transfer",
      "2N_and_1_Minor"
     ],
     "bba_keys": [
      "1N-2N transfer to clubs",
      "1N-2S transfer to clubs",
      "1N-3C transfer to diamonds",
      "Minor Suit Transfers after 2NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 528,
     "changed_ours": 499,
     "changed_bba": 522,
     "rusty_gain": 378,
     "bba_gain": 59,
     "net": 319,
     "net_other": 510,
     "rusty_contract": 378,
     "rusty_doubling": 0,
     "bba_contract": 59,
     "bba_doubling": 0,
     "net_halves": [
      54,
      265
     ],
     "net_per_changed": 0.604,
     "rusty_per_changed": 0.716,
     "bba_per_changed": 0.112,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 528,
    "changed_ours": 499,
    "changed_bba": 522,
    "rusty_gain": 378,
    "bba_gain": 59,
    "net": 319,
    "net_other": 510,
    "rusty_contract": 378,
    "rusty_doubling": 0,
    "bba_contract": 59,
    "bba_doubling": 0,
    "net_halves": [
     54,
     265
    ],
    "net_per_changed": 0.604,
    "rusty_per_changed": 0.716,
    "bba_per_changed": 0.112,
    "halves_agree": true,
    "runs": [
     "minor-suit-transfers"
    ],
    "scenarios": [
     "2N_and_1_Minor",
     "Minor_Suit_Transfer"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.7633,
     "errors_per_board": -0.898,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 50,
   "rules": 50,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/minor-transfers.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-minors.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-fair",
   "why": "convention score +0.60 IMPs per changed board (our gain +378, BBA's +59, 528 boards); background on these deals -0.90 IMPs/board, NS calls agreeing 76%"
  },
  {
   "id": "bidding_conventions/new_minor_forcing",
   "name": "New Minor Forcing",
   "section": "constructive",
   "level": 5,
   "summary": "After opener's 1NT rebid, responder's bid of the unbid minor is artificial and forcing, asking opener about three-card support for responder's major or a four-card other major.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/new_minor_forcing",
    "bidding_conventions/two_way_nmf"
   ],
   "treatments": [
    {
     "label": "New minor forcing",
     "field": "other_conventions.new_minor_forcing.play",
     "skill": "bidding_conventions/new_minor_forcing",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in New_Minor_Forcing, Two-Way_New_Minor_Forcing_aka_xyNT: -0.67 IMPs/board, NS calls agreeing 72%"
    },
    {
     "label": "NMF after a 2NT rebid",
     "field": "other_conventions.new_minor_forcing.after_2nt_rebid",
     "skill": "bidding_conventions/new_minor_forcing",
     "level": 6,
     "status": "bba-fair",
     "why": "vs BBA in New_Minor_Forcing, Two-Way_New_Minor_Forcing_aka_xyNT: -0.67 IMPs/board, NS calls agreeing 72%"
    },
    {
     "label": "NMF by a passed hand",
     "field": "other_conventions.new_minor_forcing.by_passed_hand",
     "skill": "bidding_conventions/new_minor_forcing",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Two-way NMF by a passed hand",
     "field": "other_conventions.two_way_nmf_by_passed_hand",
     "skill": "bidding_conventions/two_way_nmf",
     "level": 8,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Two-way new minor forcing",
     "field": "other_conventions.two_way_nmf",
     "skill": "bidding_conventions/two_way_nmf",
     "level": 8,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "new-minor-forcing",
     "title": "New Minor Forcing",
     "file": "conventions/base/new-minor-forcing.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/new-minor-forcing.bid",
     "rules": 15,
     "tests": 7,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/new-minor-forcing.notes.md"
    },
    {
     "name": "nmf-after-2nt",
     "title": "New Minor Forcing after a 2NT rebid",
     "file": "conventions/base/nmf-after-2nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/nmf-after-2nt.bid",
     "rules": 12,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/nmf-after-2nt.notes.md"
    },
    {
     "name": "two-way-nmf",
     "title": "Two-way New Minor Forcing (xyNT)",
     "file": "conventions/base/two-way-nmf.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/two-way-nmf.bid",
     "rules": 23,
     "tests": 13,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/two-way-nmf.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 22
    },
    {
     "title": "New Minor Forcing Fundamentals",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/227"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/two_way_nmf",
     "name": "Two-way new minor forcing",
     "level": 8,
     "summary": "Played instead of NMF: after opener's 1NT rebid, responder's 2♣ relays to 2♦ (to sign off or invite) and 2♦ is game forcing."
    }
   ],
   "scenarios": [
    {
     "name": "New_Minor_Forcing",
     "boards": 500,
     "ns_agree": 0.7509,
     "errors_per_board": -0.496,
     "auctions_match": 0.072,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Two-Way_New_Minor_Forcing_aka_xyNT",
     "boards": 500,
     "ns_agree": 0.6945,
     "errors_per_board": -0.852,
     "auctions_match": 0.174,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.722,
    "errors_per_board": -0.674,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "nmf",
     "off": [
      "other_conventions.new_minor_forcing.play=false",
      "other_conventions.two_way_nmf=false"
     ],
     "scenarios": [
      "New_Minor_Forcing",
      "Two-Way_New_Minor_Forcing_aka_xyNT"
     ],
     "bba_keys": [
      "New Minor Forcing"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 639,
     "changed_ours": 567,
     "changed_bba": 500,
     "rusty_gain": 159,
     "bba_gain": 108,
     "net": 51,
     "net_other": -27,
     "rusty_contract": 159,
     "rusty_doubling": 0,
     "bba_contract": 108,
     "bba_doubling": 0,
     "net_halves": [
      -138,
      189
     ],
     "net_per_changed": 0.08,
     "rusty_per_changed": 0.249,
     "bba_per_changed": 0.169,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 639,
    "changed_ours": 567,
    "changed_bba": 500,
    "rusty_gain": 159,
    "bba_gain": 108,
    "net": 51,
    "net_other": -27,
    "rusty_contract": 159,
    "rusty_doubling": 0,
    "bba_contract": 108,
    "bba_doubling": 0,
    "net_halves": [
     -138,
     189
    ],
    "net_per_changed": 0.08,
    "rusty_per_changed": 0.249,
    "bba_per_changed": 0.169,
    "halves_agree": false,
    "runs": [
     "nmf"
    ],
    "scenarios": [
     "New_Minor_Forcing",
     "Two-Way_New_Minor_Forcing_aka_xyNT"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.722,
     "errors_per_board": -0.674,
     "status": "bba-fair"
    }
   },
   "partial": "Two-way NMF: the continuations after 2♣ (3♠/3NT after 3♣) are not written; only the club sign-off.",
   "tests": 30,
   "rules": 50,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/new-minor-forcing.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/nmf-after-2nt.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/two-way-nmf.notes.md"
   ],
   "status": "partial",
   "why": "Two-way NMF: the continuations after 2♣ (3♠/3NT after 3♣) are not written; only the club sign-off."
  },
  {
   "id": "bidding_conventions/ogust",
   "name": "Ogust",
   "section": "constructive",
   "level": 5,
   "summary": "After partner's weak two, responder's 2NT asks about the hand in steps: 3♣ bad hand bad suit, 3♦ bad hand good suit, 3♥ good hand bad suit, 3♠ good hand good suit, 3NT a solid suit.",
   "source": "taxonomy",
   "members": [
    "bidding_conventions/ogust"
   ],
   "treatments": [
    {
     "label": "Ogust",
     "field": "two_level.ogust.play",
     "skill": "bidding_conventions/ogust",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Ogust: -0.09 IMPs/board, NS calls agreeing 77%"
    },
    {
     "label": "Weak two: 2NT response: feature",
     "field": "two_level.weak_two_2nt_response",
     "option": "feature",
     "skill": "bidding_conventions/ogust",
     "level": 5,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "Weak two: 2NT response: ogust",
     "field": "two_level.weak_two_2nt_response",
     "option": "ogust",
     "skill": "bidding_conventions/ogust",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Ogust: -0.09 IMPs/board, NS calls agreeing 77%"
    }
   ],
   "modules": [
    {
     "name": "weak-two-responses",
     "title": "Responses to a weak two",
     "file": "conventions/base/weak-two-responses.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.bid",
     "rules": 72,
     "tests": 67,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.notes.md"
    }
   ],
   "see": [
    {
     "title": "Ogust",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/ogust.php"
    }
   ],
   "scenarios": [
    {
     "name": "Ogust",
     "boards": 500,
     "ns_agree": 0.7667,
     "errors_per_board": -0.092,
     "auctions_match": 0.338,
     "ns_card": "21GF-Ogust",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7667,
    "errors_per_board": -0.092,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "ogust",
     "off": [
      "two_level.ogust.play=false",
      "two_level.weak_two_2nt_response=feature"
     ],
     "scenarios": [
      "Ogust"
     ],
     "bba_keys": [
      "Ogust"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-poor",
     "changed": 373,
     "changed_ours": 168,
     "changed_bba": 361,
     "rusty_gain": -22,
     "bba_gain": 229,
     "net": -251,
     "net_other": -63,
     "rusty_contract": -22,
     "rusty_doubling": 0,
     "bba_contract": 229,
     "bba_doubling": 0,
     "net_halves": [
      -157,
      -94
     ],
     "net_per_changed": -0.673,
     "rusty_per_changed": -0.059,
     "bba_per_changed": 0.614,
     "halves_agree": true,
     "no_rule_on": 2,
     "no_rule_off": 2
    }
   ],
   "conv_score": {
    "changed": 373,
    "changed_ours": 168,
    "changed_bba": 361,
    "rusty_gain": -22,
    "bba_gain": 229,
    "net": -251,
    "net_other": -63,
    "rusty_contract": -22,
    "rusty_doubling": 0,
    "bba_contract": 229,
    "bba_doubling": 0,
    "net_halves": [
     -157,
     -94
    ],
    "net_per_changed": -0.673,
    "rusty_per_changed": -0.059,
    "bba_per_changed": 0.614,
    "halves_agree": true,
    "runs": [
     "ogust"
    ],
    "scenarios": [
     "Ogust"
    ],
    "status": "conv-poor",
    "background": {
     "boards": 500,
     "ns_agree": 0.7667,
     "errors_per_board": -0.092,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 67,
   "rules": 72,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-two-responses.notes.md"
   ],
   "status": "conv-poor",
   "background": "bba-good",
   "why": "convention score -0.67 IMPs per changed board (our gain -22, BBA's +229, 373 boards); background on these deals -0.09 IMPs/board, NS calls agreeing 77%"
  },
  {
   "id": "bidding_conventions/splinters",
   "name": "Splinters",
   "section": "constructive",
   "level": 5,
   "summary": "A double jump in a new suit, by responder or by opener, shows a singleton or void there and a fit with game values, so partner can judge slam by how well the hands fit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/splinters"
   ],
   "treatments": [
    {
     "label": "Splinters",
     "field": "major_openings.splinters.play",
     "skill": "bidding_conventions/splinters",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Splinters, Splinters_By_Opener, Splinters_after_Minor: -0.79 IMPs/board, NS calls agreeing 61%"
    },
    {
     "label": "Splinters by responder",
     "field": "major_openings.splinters.by_responder",
     "skill": "bidding_conventions/splinters",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Splinters by opener",
     "field": "major_openings.splinters.by_opener",
     "skill": "bidding_conventions/splinters",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Mini splinters",
     "field": "major_openings.mini_splinters.play",
     "skill": "bidding_conventions/splinters",
     "level": 7,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "splinters",
     "title": "Splinters over 1♥ / 1♠",
     "file": "conventions/majors/splinters.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/splinters.bid",
     "rules": 30,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/splinters.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 11
    },
    {
     "title": "Slam Bidding: Splinter Bids by Responder",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/408"
    },
    {
     "title": "Slam Bidding: Splinters by Opener",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/409"
    }
   ],
   "scenarios": [
    {
     "name": "Splinters",
     "boards": 500,
     "ns_agree": 0.7164,
     "errors_per_board": -0.046,
     "auctions_match": 0.194,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Splinters_By_Opener",
     "boards": 500,
     "ns_agree": 0.652,
     "errors_per_board": -1.296,
     "auctions_match": 0.122,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Splinters_after_Minor",
     "boards": 500,
     "ns_agree": 0.4824,
     "errors_per_board": -1.038,
     "auctions_match": 0.008,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.6145,
    "errors_per_board": -0.793,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "splinters",
     "off": [
      "major_openings.splinters.play=false"
     ],
     "scenarios": [
      "Splinters",
      "Splinters_By_Opener",
      "Splinters_after_Minor"
     ],
     "bba_keys": [
      "Splinter"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1500
     },
     "status": "conv-good",
     "changed": 552,
     "changed_ours": 302,
     "changed_bba": 504,
     "rusty_gain": 272,
     "bba_gain": 132,
     "net": 140,
     "net_other": -41,
     "rusty_contract": 272,
     "rusty_doubling": 0,
     "bba_contract": 132,
     "bba_doubling": 0,
     "net_halves": [
      36,
      104
     ],
     "net_per_changed": 0.254,
     "rusty_per_changed": 0.493,
     "bba_per_changed": 0.239,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 552,
    "changed_ours": 302,
    "changed_bba": 504,
    "rusty_gain": 272,
    "bba_gain": 132,
    "net": 140,
    "net_other": -41,
    "rusty_contract": 272,
    "rusty_doubling": 0,
    "bba_contract": 132,
    "bba_doubling": 0,
    "net_halves": [
     36,
     104
    ],
    "net_per_changed": 0.254,
    "rusty_per_changed": 0.493,
    "bba_per_changed": 0.239,
    "halves_agree": true,
    "runs": [
     "splinters"
    ],
    "scenarios": [
     "Splinters",
     "Splinters_By_Opener",
     "Splinters_after_Minor"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1500,
     "ns_agree": 0.6145,
     "errors_per_board": -0.793,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 21,
   "rules": 30,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/splinters.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-fair",
   "why": "convention score +0.25 IMPs per changed board (our gain +272, BBA's +132, 552 boards); background on these deals -0.79 IMPs/board, NS calls agreeing 61%"
  },
  {
   "id": "bidding_conventions/super_accept",
   "name": "Super-Accepting a Transfer",
   "section": "constructive",
   "level": 5,
   "summary": "After partner's transfer over 1NT, opener with four-card support and a maximum bids above the two-level completion to say so, and responder can bid a thin game.",
   "source": "proposed",
   "members": [
    "bidding_conventions/super_accept"
   ],
   "treatments": [
    {
     "label": "Super-acceptance of transfers",
     "field": "notrump.transfers.super_accept",
     "skill": "bidding_conventions/super_accept",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Jacoby_Super-Accept: +0.51 IMPs/board, NS calls agreeing 77%"
    },
    {
     "label": "Super-accept by bidding a doubleton",
     "field": "notrump.transfers.super_accept_doubleton",
     "skill": "bidding_conventions/super_accept",
     "level": 7,
     "status": "bba-good",
     "why": "vs BBA in Jacoby_Super-Accept: +0.51 IMPs/board, NS calls agreeing 77%"
    }
   ],
   "modules": [
    {
     "name": "super-accept",
     "title": "Super-accepting a Jacoby transfer",
     "file": "conventions/notrump/super-accept.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/super-accept.bid",
     "rules": 2,
     "tests": 1,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/super-accept.notes.md"
    },
    {
     "name": "superaccept-doubleton",
     "title": "Superaccept doubleton",
     "file": "conventions/notrump/superaccept-doubleton.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/superaccept-doubleton.bid",
     "rules": 3,
     "tests": 0,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/superaccept-doubleton.notes.md"
    }
   ],
   "see": [
    {
     "title": "NT Auctions: Superaccepting Jacoby Transfers",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/518"
    }
   ],
   "scenarios": [
    {
     "name": "Jacoby_Super-Accept",
     "boards": 500,
     "ns_agree": 0.7712,
     "errors_per_board": 0.508,
     "auctions_match": 0.334,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7712,
    "errors_per_board": 0.508,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "super-accept",
     "off": [
      "notrump.transfers.super_accept=false"
     ],
     "scenarios": [
      "Jacoby_Super-Accept"
     ],
     "bba_keys": [
      "Super acceptance after NT"
     ],
     "notes": [],
     "unmeasured": "BBA's auctions changed on 0 boards: its key (Super acceptance after NT) does not switch it",
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": null,
     "changed": 482,
     "changed_ours": 482,
     "changed_bba": 0,
     "rusty_gain": 10,
     "bba_gain": 0,
     "net": 10,
     "net_other": 59,
     "rusty_contract": 10,
     "rusty_doubling": 0,
     "bba_contract": 0,
     "bba_doubling": 0,
     "net_halves": [
      72,
      -62
     ],
     "net_per_changed": 0.021,
     "rusty_per_changed": 0.021,
     "bba_per_changed": 0.0,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 1,
   "rules": 5,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/super-accept.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/superaccept-doubleton.notes.md"
   ],
   "status": "bba-good",
   "why": "background (not isolated): errors +0.51 IMPs/board against BBA's, NS calls agreeing 77% (500 boards)"
  },
  {
   "id": "bidding_conventions/weak_jump_shifts",
   "name": "Weak jump shifts",
   "section": "constructive",
   "level": 5,
   "summary": "Responder's jump in a new suit over partner's one-level opening shows a long suit and a weak hand, rather than a strong one.",
   "source": "proposed",
   "members": [
    "bidding_conventions/weak_jump_shifts"
   ],
   "treatments": [
    {
     "label": "Weak jump shifts (2-level)",
     "field": "general.jump_shifts.weak_2",
     "skill": "bidding_conventions/weak_jump_shifts",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Weak_Jump_Shift: -0.25 IMPs/board, NS calls agreeing 79%"
    },
    {
     "label": "Weak jump shifts (3-level)",
     "field": "general.jump_shifts.weak_3",
     "skill": "bidding_conventions/weak_jump_shifts",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Weak_Jump_Shift: -0.25 IMPs/board, NS calls agreeing 79%"
    },
    {
     "label": "Weak jump shifts (not in competition)",
     "field": "other_conventions.weak_jump_shifts_not_in_comp",
     "skill": "bidding_conventions/weak_jump_shifts",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Weak jump shifts in competition",
     "field": "other_conventions.weak_jump_shifts_in_comp",
     "skill": "bidding_conventions/weak_jump_shifts",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "weak-jump-shifts",
     "title": "Weak jump shifts",
     "file": "conventions/base/weak-jump-shifts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-jump-shifts.bid",
     "rules": 29,
     "tests": 16,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-jump-shifts.notes.md"
    }
   ],
   "see": [
    {
     "title": "Weak Jump Shifts",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/weak_jump_shifts.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 12
    },
    {
     "title": "Thinking and Responding: Jump Shifts After 1-Level Openings - Weak and Invitational",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/512"
    }
   ],
   "scenarios": [
    {
     "name": "Weak_Jump_Shift",
     "boards": 500,
     "ns_agree": 0.7867,
     "errors_per_board": -0.246,
     "auctions_match": 0.296,
     "ns_card": "21GF-WJS-MSS",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7867,
    "errors_per_board": -0.246,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "weak-jump-shifts",
     "off": [
      "general.jump_shifts.weak_2=false",
      "general.jump_shifts.weak_3=false",
      "other_conventions.weak_jump_shifts_not_in_comp=false",
      "other_conventions.weak_jump_shifts_in_comp=false"
     ],
     "scenarios": [
      "Weak_Jump_Shift"
     ],
     "bba_keys": [
      "Weak Jump Shifts 2",
      "Weak Jump Shifts 3"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 372,
     "changed_ours": 370,
     "changed_bba": 366,
     "rusty_gain": 444,
     "bba_gain": 464,
     "net": -20,
     "net_other": -366,
     "rusty_contract": 138,
     "rusty_doubling": 306,
     "bba_contract": 420,
     "bba_doubling": 44,
     "net_halves": [
      -80,
      60
     ],
     "net_per_changed": -0.054,
     "rusty_per_changed": 1.194,
     "bba_per_changed": 1.247,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 372,
    "changed_ours": 370,
    "changed_bba": 366,
    "rusty_gain": 444,
    "bba_gain": 464,
    "net": -20,
    "net_other": -366,
    "rusty_contract": 138,
    "rusty_doubling": 306,
    "bba_contract": 420,
    "bba_doubling": 44,
    "net_halves": [
     -80,
     60
    ],
    "net_per_changed": -0.054,
    "rusty_per_changed": 1.194,
    "bba_per_changed": 1.247,
    "halves_agree": false,
    "runs": [
     "weak-jump-shifts"
    ],
    "scenarios": [
     "Weak_Jump_Shift"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.7867,
     "errors_per_board": -0.246,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 16,
   "rules": 29,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/weak-jump-shifts.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score -0.05 IMPs per changed board (our gain +444, BBA's +464, 372 boards); background on these deals -0.25 IMPs/board, NS calls agreeing 79%"
  },
  {
   "id": "bidding_conventions/checkback",
   "name": "Checkback",
   "section": "constructive",
   "level": 6,
   "summary": "Played instead of NMF: after opener's notrump rebid, a fixed suit (usually 2♣) asks about support and majors, whichever minor was bid.",
   "source": "proposed",
   "members": [
    "bidding_conventions/checkback"
   ],
   "treatments": [
    {
     "label": "Checkback",
     "field": "other_conventions.checkback.play",
     "skill": "bidding_conventions/checkback",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "checkback",
     "title": "Checkback Stayman",
     "file": "conventions/base/checkback.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/checkback.bid",
     "rules": 16,
     "tests": 12,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/checkback.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 12,
   "rules": 16,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/checkback.notes.md"
   ],
   "status": "tested",
   "why": "12 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/flannery",
   "name": "Flannery 2♦",
   "section": "constructive",
   "level": 6,
   "summary": "An opening 2♦ showing a minimum opening with five hearts and four spades, so responder can find a spade fit without opener having to reverse or rebid awkwardly.",
   "source": "proposed",
   "members": [
    "bidding_conventions/flannery",
    "bidding_conventions/reverse_flannery"
   ],
   "treatments": [
    {
     "label": "Flannery 2♦",
     "field": "two_level.flannery.play",
     "skill": "bidding_conventions/flannery",
     "level": 6,
     "status": "bba-good",
     "why": "vs BBA in Flannery: -0.22 IMPs/board, NS calls agreeing 81%"
    },
    {
     "label": "Reverse Flannery 2♠",
     "field": "two_level.reverse_flannery.two_s",
     "skill": "bidding_conventions/reverse_flannery",
     "level": 8,
     "status": "bba-fair",
     "why": "vs BBA in Reverse_Flannery: -0.84 IMPs/board, NS calls agreeing 81%"
    },
    {
     "label": "Reverse Flannery 2♥",
     "field": "two_level.reverse_flannery.two_h",
     "skill": "bidding_conventions/reverse_flannery",
     "level": 8,
     "status": "bba-fair",
     "why": "vs BBA in Reverse_Flannery: -0.84 IMPs/board, NS calls agreeing 81%"
    },
    {
     "label": "Reverse Flannery 2♦",
     "field": "two_level.two_diamonds.reverse_flannery",
     "skill": "bidding_conventions/reverse_flannery",
     "level": 8,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "flannery",
     "title": "Flannery 2♦",
     "file": "conventions/openings/flannery.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/flannery.bid",
     "rules": 32,
     "tests": 26,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/flannery.notes.md"
    },
    {
     "name": "reverse-flannery",
     "title": "Reverse Flannery",
     "file": "conventions/openings/reverse-flannery.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/reverse-flannery.bid",
     "rules": 32,
     "tests": 14,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/reverse-flannery.notes.md"
    }
   ],
   "see": [
    {
     "title": "Flannery 2♦",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/flannery_2d.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 2
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/reverse_flannery",
     "name": "Reverse Flannery",
     "level": 8,
     "summary": "An opening of 2♥ (or 2♦) showing five or more spades and four or more hearts with less than an opening, a two-suited preempt in the majors."
    }
   ],
   "scenarios": [
    {
     "name": "Flannery",
     "boards": 500,
     "ns_agree": 0.8109,
     "errors_per_board": -0.216,
     "auctions_match": 0.316,
     "ns_card": "21GF-Flannery",
     "status": "bba-good"
    },
    {
     "name": "Reverse_Flannery",
     "boards": 500,
     "ns_agree": 0.8061,
     "errors_per_board": -0.838,
     "auctions_match": 0.356,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.8085,
    "errors_per_board": -0.527,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "flannery",
     "off": [
      "two_level.flannery.play=false"
     ],
     "scenarios": [
      "Flannery"
     ],
     "bba_keys": [
      "Flannery"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 500,
     "changed_ours": 500,
     "changed_bba": 499,
     "rusty_gain": -61,
     "bba_gain": -104,
     "net": 43,
     "net_other": -20,
     "rusty_contract": -94,
     "rusty_doubling": 33,
     "bba_contract": -146,
     "bba_doubling": 42,
     "net_halves": [
      45,
      -2
     ],
     "net_per_changed": 0.086,
     "rusty_per_changed": -0.122,
     "bba_per_changed": -0.208,
     "halves_agree": false,
     "no_rule_on": 2,
     "no_rule_off": 2
    },
    {
     "name": "reverse-flannery",
     "off": [
      "two_level.reverse_flannery.two_h=false",
      "two_level.reverse_flannery.two_s=false",
      "two_level.two_diamonds.reverse_flannery=false"
     ],
     "scenarios": [
      "Reverse_Flannery"
     ],
     "bba_keys": [
      "Reverse Flannery 2H",
      "Reverse Flannery 2S"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-poor",
     "changed": 498,
     "changed_ours": 497,
     "changed_bba": 497,
     "rusty_gain": -17,
     "bba_gain": 246,
     "net": -263,
     "net_other": 242,
     "rusty_contract": -149,
     "rusty_doubling": 132,
     "bba_contract": 171,
     "bba_doubling": 75,
     "net_halves": [
      -228,
      -35
     ],
     "net_per_changed": -0.528,
     "rusty_per_changed": -0.034,
     "bba_per_changed": 0.494,
     "halves_agree": true,
     "no_rule_on": 4,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 998,
    "changed_ours": 997,
    "changed_bba": 996,
    "rusty_gain": -78,
    "bba_gain": 142,
    "net": -220,
    "net_other": 222,
    "rusty_contract": -243,
    "rusty_doubling": 165,
    "bba_contract": 25,
    "bba_doubling": 117,
    "net_halves": [
     -183,
     -37
    ],
    "net_per_changed": -0.22,
    "rusty_per_changed": -0.078,
    "bba_per_changed": 0.142,
    "halves_agree": true,
    "runs": [
     "flannery",
     "reverse-flannery"
    ],
    "scenarios": [
     "Flannery",
     "Reverse_Flannery"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 1000,
     "ns_agree": 0.8085,
     "errors_per_board": -0.527,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 40,
   "rules": 64,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/flannery.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/reverse-flannery.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.22 IMPs per changed board (our gain -78, BBA's +142, 998 boards); background on these deals -0.53 IMPs/board, NS calls agreeing 81%"
  },
  {
   "id": "bidding_conventions/gambling_3nt",
   "name": "Gambling 3NT",
   "section": "constructive",
   "level": 6,
   "summary": "An opening 3NT showing a long, solid minor with little outside. Partner passes with stoppers in the other suits, and otherwise runs to four or five of the minor.",
   "source": "proposed",
   "members": [
    "bidding_conventions/gambling_3nt"
   ],
   "treatments": [
    {
     "label": "Gambling 3NT",
     "field": "notrump.three_nt.one_suit",
     "skill": "bidding_conventions/gambling_3nt",
     "level": 6,
     "status": "bba-poor",
     "why": "vs BBA in Gambling_3N: -1.75 IMPs/board, NS calls agreeing 85%"
    }
   ],
   "modules": [
    {
     "name": "gambling-3nt",
     "title": "Gambling 3NT: a solid minor",
     "file": "conventions/base/gambling-3nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/gambling-3nt.bid",
     "rules": 12,
     "tests": 11,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/gambling-3nt.notes.md"
    }
   ],
   "see": [
    {
     "title": "Gambling 3NT",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/gambling_3nt.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 6
    },
    {
     "title": "NT Auctions: Trick-Showing NT Bids - Gambling 3NT and More",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/519"
    }
   ],
   "scenarios": [
    {
     "name": "Gambling_3N",
     "boards": 500,
     "ns_agree": 0.8532,
     "errors_per_board": -1.75,
     "auctions_match": 0.374,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8532,
    "errors_per_board": -1.75,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [
    {
     "name": "gambling-3nt",
     "off": [
      "notrump.three_nt.one_suit=false"
     ],
     "scenarios": [
      "Gambling_3N"
     ],
     "bba_keys": [
      "Gambling"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 500,
     "changed_ours": 500,
     "changed_bba": 494,
     "rusty_gain": -34,
     "bba_gain": 16,
     "net": -50,
     "net_other": -208,
     "rusty_contract": -145,
     "rusty_doubling": 111,
     "bba_contract": -113,
     "bba_doubling": 129,
     "net_halves": [
      4,
      -54
     ],
     "net_per_changed": -0.1,
     "rusty_per_changed": -0.068,
     "bba_per_changed": 0.032,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 7
    }
   ],
   "conv_score": {
    "changed": 500,
    "changed_ours": 500,
    "changed_bba": 494,
    "rusty_gain": -34,
    "bba_gain": 16,
    "net": -50,
    "net_other": -208,
    "rusty_contract": -145,
    "rusty_doubling": 111,
    "bba_contract": -113,
    "bba_doubling": 129,
    "net_halves": [
     4,
     -54
    ],
    "net_per_changed": -0.1,
    "rusty_per_changed": -0.068,
    "bba_per_changed": 0.032,
    "halves_agree": false,
    "runs": [
     "gambling-3nt"
    ],
    "scenarios": [
     "Gambling_3N"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.8532,
     "errors_per_board": -1.75,
     "status": "bba-poor"
    }
   },
   "partial": null,
   "tests": 11,
   "rules": 12,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/gambling-3nt.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-poor",
   "why": "convention score -0.10 IMPs per changed board (our gain -34, BBA's +16, 500 boards); background on these deals -1.75 IMPs/board, NS calls agreeing 85%"
  },
  {
   "id": "bidding_conventions/grand_slam_force",
   "name": "Grand slam force",
   "section": "constructive",
   "level": 6,
   "summary": "A jump to 5NT (not after a keycard ask) asks partner to bid the grand slam in the agreed suit holding two of the top three trump honours.",
   "source": "proposed",
   "members": [
    "bidding_conventions/grand_slam_force"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Grand Slam Force",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/grand_slam_force.php"
    }
   ],
   "scenarios": [
    {
     "name": "Grand_Slam_Force",
     "boards": 500,
     "ns_agree": 0.5305,
     "errors_per_board": -4.742,
     "auctions_match": 0.024,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Grand_Slam_Force_2",
     "boards": 500,
     "ns_agree": 0.5579,
     "errors_per_board": -3.812,
     "auctions_match": 0.014,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.5451,
    "errors_per_board": -4.277,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/minor_suit_stayman",
   "name": "Minor Suit Stayman",
   "section": "constructive",
   "level": 6,
   "summary": "Over partner's 1NT (or 2NT), a bid, usually 2♠, asks opener for a four-card minor, for responder with both minors and slam interest or a hand looking for a minor-suit game.",
   "source": "proposed",
   "members": [
    "bidding_conventions/minor_suit_stayman"
   ],
   "treatments": [
    {
     "label": "Minor Suit Stayman (1NT–2♠)",
     "field": "notrump.minor_suit_stayman.play",
     "skill": "bidding_conventions/minor_suit_stayman",
     "level": 6,
     "status": "bba-good",
     "why": "vs BBA in Minor_Suit_Stayman, 2N_and_MSS: +0.26 IMPs/board, NS calls agreeing 74%"
    },
    {
     "label": "Minor Suit Stayman after 2NT",
     "field": "notrump.two_nt.minor_stayman",
     "skill": "bidding_conventions/minor_suit_stayman",
     "level": 6,
     "status": "bba-good",
     "why": "vs BBA in 2N_and_MSS: +0.48 IMPs/board, NS calls agreeing 70%"
    }
   ],
   "modules": [
    {
     "name": "minor-suit-stayman",
     "title": "Minor Suit Stayman over 1NT",
     "file": "conventions/notrump/minor-suit-stayman.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/minor-suit-stayman.bid",
     "rules": 25,
     "tests": 23,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/minor-suit-stayman.notes.md"
    },
    {
     "name": "two-nt-minors",
     "title": "Minor-suit transfers and Minor Suit Stayman over 2NT",
     "file": "conventions/notrump/two-nt-minors.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-minors.bid",
     "rules": 20,
     "tests": 20,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-minors.notes.md"
    }
   ],
   "see": [
    {
     "title": "Minor Suit Stayman",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/minor_suit_stayman.php"
    }
   ],
   "scenarios": [
    {
     "name": "Minor_Suit_Stayman",
     "boards": 500,
     "ns_agree": 0.7803,
     "errors_per_board": 0.044,
     "auctions_match": 0.326,
     "ns_card": "21GF-MSTandMSS",
     "status": "bba-good"
    },
    {
     "name": "2N_and_MSS",
     "boards": 500,
     "ns_agree": 0.6951,
     "errors_per_board": 0.478,
     "auctions_match": 0.26,
     "ns_card": "21GF-MSS",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7407,
    "errors_per_board": 0.261,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "minor-suit-stayman",
     "off": [
      "notrump.minor_suit_stayman.play=false",
      "notrump.two_nt.minor_stayman=false"
     ],
     "scenarios": [
      "Minor_Suit_Stayman",
      "2N_and_MSS"
     ],
     "bba_keys": [
      "1N-2S Minor Suit Stayman",
      "Minor Suit Stayman after 2NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-fair",
     "changed": 677,
     "changed_ours": 619,
     "changed_bba": 639,
     "rusty_gain": 188,
     "bba_gain": 343,
     "net": -155,
     "net_other": 115,
     "rusty_contract": 188,
     "rusty_doubling": 0,
     "bba_contract": 345,
     "bba_doubling": -2,
     "net_halves": [
      -130,
      -25
     ],
     "net_per_changed": -0.229,
     "rusty_per_changed": 0.278,
     "bba_per_changed": 0.507,
     "halves_agree": true,
     "no_rule_on": 2,
     "no_rule_off": 2
    }
   ],
   "conv_score": {
    "changed": 677,
    "changed_ours": 619,
    "changed_bba": 639,
    "rusty_gain": 188,
    "bba_gain": 343,
    "net": -155,
    "net_other": 115,
    "rusty_contract": 188,
    "rusty_doubling": 0,
    "bba_contract": 345,
    "bba_doubling": -2,
    "net_halves": [
     -130,
     -25
    ],
    "net_per_changed": -0.229,
    "rusty_per_changed": 0.278,
    "bba_per_changed": 0.507,
    "halves_agree": true,
    "runs": [
     "minor-suit-stayman"
    ],
    "scenarios": [
     "2N_and_MSS",
     "Minor_Suit_Stayman"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 1000,
     "ns_agree": 0.7407,
     "errors_per_board": 0.261,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 43,
   "rules": 45,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/minor-suit-stayman.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/two-nt-minors.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-good",
   "why": "convention score -0.23 IMPs per changed board (our gain +188, BBA's +343, 677 boards); background on these deals +0.26 IMPs/board, NS calls agreeing 74%"
  },
  {
   "id": "bidding_conventions/namyats",
   "name": "Namyats",
   "section": "constructive",
   "level": 6,
   "summary": "Openings of 4♣ and 4♦ show a strong four-level preempt in hearts and spades respectively, so a direct 4♥ or 4♠ opening is weaker.",
   "source": "proposed",
   "members": [
    "bidding_conventions/namyats"
   ],
   "treatments": [
    {
     "label": "4♣/4♦ transfer to major",
     "field": "preempts.transfer_4_minor",
     "skill": "bidding_conventions/namyats",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Namyats",
     "field": "preempts.namyats.play",
     "skill": "bidding_conventions/namyats",
     "level": 6,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "namyats",
     "title": "Namyats: 4♣/4♦ strong major preempts",
     "file": "conventions/openings/namyats.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/namyats.bid",
     "rules": 12,
     "tests": 13,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/namyats.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 8
    }
   ],
   "scenarios": [
    {
     "name": "Namyats",
     "boards": 500,
     "ns_agree": 0.7198,
     "errors_per_board": -0.44,
     "auctions_match": 0.12,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7198,
    "errors_per_board": -0.44,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "namyats",
     "off": [
      "preempts.namyats.play=false",
      "preempts.transfer_4_minor=false"
     ],
     "scenarios": [
      "Namyats"
     ],
     "bba_keys": [],
     "notes": [
      "Namyats: 21GF-SPECIALS does not play it or leaves it unset (preempts.namyats.play=False, preempts.transfer_4_minor=None)"
     ],
     "unmeasured": "Namyats: 21GF-SPECIALS does not play it or leaves it unset (preempts.namyats.play=False, preempts.transfer_4_minor=None)",
     "repro": null,
     "status": null
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 13,
   "rules": 12,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/namyats.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.44 IMPs/board against BBA's, NS calls agreeing 72% (500 boards)"
  },
  {
   "id": "bidding_conventions/picture_3nt",
   "name": "1M–3NT picture raise",
   "section": "constructive",
   "level": 7,
   "summary": "Over partner's 1♥ or 1♠, responder's 3NT is a game-forcing raise with a balanced hand and good trumps, better than a direct raise to four.",
   "source": "proposed",
   "members": [
    "bidding_conventions/picture_3nt"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "1-Major – 3NT",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/628"
    }
   ],
   "scenarios": [
    {
     "name": "1M-3N_Picture_Bid",
     "boards": 500,
     "ns_agree": 0.7628,
     "errors_per_board": 0.0,
     "auctions_match": 0.196,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7628,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/two_heart_bust",
   "name": "2♥ bust over 2♣",
   "section": "constructive",
   "level": 7,
   "summary": "After 2♣–2♦ and opener's natural rebid, a cheapest-suit reply shows a very weak hand, so opener knows when to stop short of game. The Parrish form uses 2♥ as the bust in some auctions.",
   "source": "proposed",
   "members": [
    "bidding_conventions/two_heart_bust"
   ],
   "treatments": [
    {
     "label": "Parrish 2♥ bust",
     "field": "two_level.two_clubs.parrish_bust",
     "skill": "bidding_conventions/two_heart_bust",
     "level": 7,
     "status": "ab-gains",
     "why": "self A/B 2h-bust: gains (178 boards changed)"
    }
   ],
   "modules": [],
   "see": [
    {
     "title": "Todd Busts over 2C Opening Bids",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/593"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "2h-bust",
     "scenarios": [
      "Bust_Over_Strong_2C",
      "Game_Forcing_2C",
      "Opps_Bid_Over_GF_2C"
     ],
     "side": "both",
     "changed": 178,
     "verdict": "gains",
     "z": 2.1,
     "actor_contract": 157,
     "actor_doubling": 0,
     "status": "ab-gains",
     "changes": {
      "two_level.two_clubs.parrish_bust": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "ab-gains",
   "why": "self A/B 2h-bust: gains (178 boards changed)"
  },
  {
   "id": "bidding_conventions/dopi_ropi",
   "name": "DOPI and ROPI",
   "section": "constructive",
   "level": 7,
   "summary": "When the opponents interfere over a keycard ask, double shows no keycards (or none of the first step) and pass shows one (DOPI); after they double, redouble shows none and pass one (ROPI). The next steps continue.",
   "source": "proposed",
   "members": [
    "bidding_conventions/dopi_ropi",
    "bidding_conventions/depo"
   ],
   "treatments": [
    {
     "label": "DEPO",
     "field": "slam.depo",
     "skill": "bidding_conventions/depo",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "DOPI",
     "field": "slam.dopi",
     "skill": "bidding_conventions/dopi_ropi",
     "level": 7,
     "status": "bba-poor",
     "why": "vs BBA in DOPI_ROPI: -1.38 IMPs/board, NS calls agreeing 63%"
    },
    {
     "label": "ROPI",
     "field": "slam.ropi",
     "skill": "bidding_conventions/dopi_ropi",
     "level": 7,
     "status": "bba-poor",
     "why": "vs BBA in DOPI_ROPI: -1.38 IMPs/board, NS calls agreeing 63%"
    }
   ],
   "modules": [
    {
     "name": "dopi-ropi",
     "title": "DOPI and ROPI: answering an ace or keycard ask over interference",
     "file": "conventions/slam/dopi-ropi.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/dopi-ropi.bid",
     "rules": 40,
     "tests": 26,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/dopi-ropi.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 15
    },
    {
     "title": "DOPI and ROPI",
     "site": "ACBL Unit 390",
     "url": "https://www.acblunit390.org/Simon/dopi-ropi.htm"
    },
    {
     "title": "Slam Bidding: Dealing with Interference Over Ace-Asking Bids",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/536"
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/depo",
     "name": "DEPO",
     "level": 7,
     "summary": "Played instead of DOPI: when they interfere over a keycard ask, double shows an even number of keycards and pass an odd number."
    }
   ],
   "scenarios": [
    {
     "name": "DOPI_ROPI",
     "boards": 472,
     "ns_agree": 0.6327,
     "errors_per_board": -1.383,
     "auctions_match": 0.0148,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 472,
    "ns_agree": 0.6327,
    "errors_per_board": -1.383,
    "status": "bba-poor"
   },
   "ab": [
    {
     "name": "depo-vs-dopi",
     "scenarios": [
      "DOPI_ROPI"
     ],
     "side": "both",
     "changed": 0,
     "verdict": "no boards changed",
     "z": 0.0,
     "actor_contract": 0,
     "actor_doubling": 0,
     "status": null,
     "changes": {
      "slam.depo": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "dopi-ropi",
     "off": [
      "slam.dopi=false",
      "slam.ropi=false"
     ],
     "scenarios": [
      "DOPI_ROPI"
     ],
     "bba_keys": [
      "DOPI",
      "ROPI"
     ],
     "notes": [],
     "unmeasured": "our auctions changed on 0 boards: our rules do not switch it off with slam.dopi=false, slam.ropi=false",
     "repro": {
      "differ": 0,
      "boards": 472
     },
     "status": null,
     "changed": 17,
     "changed_ours": 0,
     "changed_bba": 17,
     "rusty_gain": 0,
     "bba_gain": 8,
     "net": -8,
     "net_other": 11,
     "rusty_contract": 0,
     "rusty_doubling": 0,
     "bba_contract": 16,
     "bba_doubling": -8,
     "net_halves": [
      0,
      -8
     ],
     "net_per_changed": -0.471,
     "rusty_per_changed": 0.0,
     "bba_per_changed": 0.471,
     "halves_agree": false,
     "no_rule_on": 1,
     "no_rule_off": 1
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 26,
   "rules": 40,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/dopi-ropi.notes.md"
   ],
   "status": "bba-poor",
   "why": "background (not isolated): errors -1.38 IMPs/board against BBA's, NS calls agreeing 63% (472 boards)"
  },
  {
   "id": "bidding_conventions/exclusion_blackwood",
   "name": "Exclusion Blackwood",
   "section": "constructive",
   "level": 7,
   "summary": "A jump to the five level in a new suit after agreeing trumps shows a void there and asks for keycards outside it, so the ace in the void suit does not count.",
   "source": "proposed",
   "members": [
    "bidding_conventions/exclusion_blackwood"
   ],
   "treatments": [
    {
     "label": "Exclusion Blackwood",
     "field": "slam.exclusion_blackwood.play",
     "skill": "bidding_conventions/exclusion_blackwood",
     "level": 7,
     "status": "bba-poor",
     "why": "vs BBA in Exclusion_After_1M, Exclusion_After_Sta_Jac: -1.46 IMPs/board, NS calls agreeing 59%"
    }
   ],
   "modules": [
    {
     "name": "exclusion",
     "title": "Exclusion Blackwood: a jump to five in a void asks for keycards outside it",
     "file": "conventions/slam/exclusion.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/exclusion.bid",
     "rules": 52,
     "tests": 14,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/exclusion.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 10
    },
    {
     "title": "Exclusion Keycard",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/584"
    }
   ],
   "scenarios": [
    {
     "name": "Exclusion_After_1M",
     "boards": 500,
     "ns_agree": 0.5587,
     "errors_per_board": -2.28,
     "auctions_match": 0.006,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-poor"
    },
    {
     "name": "Exclusion_After_Sta_Jac",
     "boards": 500,
     "ns_agree": 0.6148,
     "errors_per_board": -0.648,
     "auctions_match": 0.264,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.5854,
    "errors_per_board": -1.464,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [
    {
     "name": "exclusion",
     "off": [
      "slam.exclusion_blackwood.play=false"
     ],
     "scenarios": [
      "Exclusion_After_1M",
      "Exclusion_After_Sta_Jac"
     ],
     "bba_keys": [
      "Exclusion"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-poor",
     "changed": 661,
     "changed_ours": 156,
     "changed_bba": 635,
     "rusty_gain": 220,
     "bba_gain": 561,
     "net": -341,
     "net_other": -115,
     "rusty_contract": 220,
     "rusty_doubling": 0,
     "bba_contract": 561,
     "bba_doubling": 0,
     "net_halves": [
      -101,
      -240
     ],
     "net_per_changed": -0.516,
     "rusty_per_changed": 0.333,
     "bba_per_changed": 0.849,
     "halves_agree": true,
     "no_rule_on": 17,
     "no_rule_off": 17
    }
   ],
   "conv_score": {
    "changed": 661,
    "changed_ours": 156,
    "changed_bba": 635,
    "rusty_gain": 220,
    "bba_gain": 561,
    "net": -341,
    "net_other": -115,
    "rusty_contract": 220,
    "rusty_doubling": 0,
    "bba_contract": 561,
    "bba_doubling": 0,
    "net_halves": [
     -101,
     -240
    ],
    "net_per_changed": -0.516,
    "rusty_per_changed": 0.333,
    "bba_per_changed": 0.849,
    "halves_agree": true,
    "runs": [
     "exclusion"
    ],
    "scenarios": [
     "Exclusion_After_1M",
     "Exclusion_After_Sta_Jac"
    ],
    "status": "conv-poor",
    "background": {
     "boards": 1000,
     "ns_agree": 0.5854,
     "errors_per_board": -1.464,
     "status": "bba-poor"
    }
   },
   "partial": null,
   "tests": 14,
   "rules": 52,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/exclusion.notes.md"
   ],
   "status": "conv-poor",
   "background": "bba-poor",
   "why": "convention score -0.52 IMPs per changed board (our gain +220, BBA's +561, 661 boards); background on these deals -1.46 IMPs/board, NS calls agreeing 59%"
  },
  {
   "id": "bidding_conventions/impossible_2s",
   "name": "Impossible 2♠",
   "section": "constructive",
   "level": 7,
   "summary": "After 1♥–1NT–2♣ or 2♦, responder's 2♠ cannot be natural, so it shows a good raise of opener's minor, forcing to three of it.",
   "source": "proposed",
   "members": [
    "bidding_conventions/impossible_2s"
   ],
   "treatments": [
    {
     "label": "Impossible 2♠",
     "field": "major_openings.impossible_2s.play",
     "skill": "bidding_conventions/impossible_2s",
     "level": 7,
     "status": "bba-good",
     "why": "vs BBA in Impossible_2S: +0.34 IMPs/board, NS calls agreeing 74%"
    }
   ],
   "modules": [
    {
     "name": "impossible-2s",
     "title": "Impossible 2♠",
     "file": "conventions/majors/impossible-2s.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/impossible-2s.bid",
     "rules": 13,
     "tests": 17,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/impossible-2s.notes.md"
    }
   ],
   "see": [
    {
     "title": "The Impossible Spade Bid",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/269"
    },
    {
     "title": "Impossible 2 Spade",
     "site": "Kiva Bridge Club",
     "url": "http://kivabridgeclub.com/images/Impossible%202%20Spade.pdf"
    }
   ],
   "scenarios": [
    {
     "name": "Impossible_2S",
     "boards": 500,
     "ns_agree": 0.738,
     "errors_per_board": 0.344,
     "auctions_match": 0.102,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.738,
    "errors_per_board": 0.344,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "impossible-2s",
     "off": [
      "major_openings.impossible_2s.play=false"
     ],
     "scenarios": [
      "Impossible_2S"
     ],
     "bba_keys": [
      "Imposible 2S"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 462,
     "changed_ours": 462,
     "changed_bba": 154,
     "rusty_gain": 244,
     "bba_gain": 6,
     "net": 238,
     "net_other": 12,
     "rusty_contract": 244,
     "rusty_doubling": 0,
     "bba_contract": 17,
     "bba_doubling": -11,
     "net_halves": [
      160,
      78
     ],
     "net_per_changed": 0.515,
     "rusty_per_changed": 0.528,
     "bba_per_changed": 0.013,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 462,
    "changed_ours": 462,
    "changed_bba": 154,
    "rusty_gain": 244,
    "bba_gain": 6,
    "net": 238,
    "net_other": 12,
    "rusty_contract": 244,
    "rusty_doubling": 0,
    "bba_contract": 17,
    "bba_doubling": -11,
    "net_halves": [
     160,
     78
    ],
    "net_per_changed": 0.515,
    "rusty_per_changed": 0.528,
    "bba_per_changed": 0.013,
    "halves_agree": true,
    "runs": [
     "impossible-2s"
    ],
    "scenarios": [
     "Impossible_2S"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.738,
     "errors_per_board": 0.344,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 17,
   "rules": 13,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/impossible-2s.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.52 IMPs per changed board (our gain +244, BBA's +6, 462 boards); background on these deals +0.34 IMPs/board, NS calls agreeing 74%"
  },
  {
   "id": "bidding_conventions/ingberman",
   "name": "Ingberman 2NT",
   "section": "constructive",
   "level": 7,
   "summary": "After opener reverses, responder's 2NT relays to 3♣ to show a weak hand, so other bids by responder show values.",
   "source": "proposed",
   "members": [
    "bidding_conventions/ingberman"
   ],
   "treatments": [
    {
     "label": "Ingberman 2NT",
     "field": "other_conventions.ingberman_2nt.play",
     "skill": "bidding_conventions/ingberman",
     "level": 7,
     "status": "ab-gains",
     "why": "self A/B ingberman: leans gain (282 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "ingberman",
     "title": "Ingberman 2NT after opener's reverse",
     "file": "conventions/base/ingberman.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/ingberman.bid",
     "rules": 25,
     "tests": 11,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/ingberman.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 11
    },
    {
     "title": "Lebensohl over Reverses",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/417"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "ingberman",
     "scenarios": [
      "Reverse_By_Opener",
      "Reverse_After_Two_Over_One"
     ],
     "side": "both",
     "changed": 282,
     "verdict": "leans gain",
     "z": 1.7,
     "actor_contract": 131,
     "actor_doubling": 0,
     "status": "ab-gains",
     "changes": {
      "other_conventions.ingberman_2nt.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 11,
   "rules": 25,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/ingberman.notes.md"
   ],
   "status": "ab-gains",
   "why": "self A/B ingberman: leans gain (282 boards changed)"
  },
  {
   "id": "bidding_conventions/mini_roman_2d",
   "name": "Mini-Roman 2♦",
   "section": "constructive",
   "level": 7,
   "summary": "An opening 2♦ showing a three-suited hand (4-4-4-1 or 5-4-4-0) of opening strength; responder bids the cheapest suit to play or 2NT to ask for the short suit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/mini_roman_2d"
   ],
   "treatments": [
    {
     "label": "Mini-Roman 2♦",
     "field": "two_level.two_diamonds.mini_roman",
     "skill": "bidding_conventions/mini_roman_2d",
     "level": 7,
     "status": "ab-loses",
     "why": "self A/B mini-roman-vs-weak-2d: loses (415 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "mini-roman",
     "title": "Mini-Roman 2♦",
     "file": "conventions/openings/mini-roman.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/mini-roman.bid",
     "rules": 48,
     "tests": 26,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/mini-roman.notes.md"
    }
   ],
   "see": [
    {
     "title": "Mini-Roman 2♦",
     "site": "ACBL Unit 390",
     "url": "https://www.acblunit390.org/Simon/mini-roman.htm"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "mini-roman-vs-weak-2d",
     "scenarios": [
      "Mini-Maxi_Roman_2D"
     ],
     "side": "both",
     "changed": 415,
     "verdict": "loses",
     "z": -2.9,
     "actor_contract": -332,
     "actor_doubling": 28,
     "status": "ab-loses",
     "changes": {
      "two_level.two_diamonds.mini_roman": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": "Mini only: the Maxi half (19+, PBS Mini-Maxi_Roman_2D) is not written.",
   "tests": 26,
   "rules": 48,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/mini-roman.notes.md"
   ],
   "status": "partial",
   "why": "Mini only: the Maxi half (19+, PBS Mini-Maxi_Roman_2D) is not written."
  },
  {
   "id": "bidding_conventions/minorwood",
   "name": "Minorwood",
   "section": "constructive",
   "level": 7,
   "summary": "With a minor agreed, four of that minor asks for keycards instead of 4NT, keeping the answers low enough to stop in five of the minor.",
   "source": "proposed",
   "members": [
    "bidding_conventions/minorwood"
   ],
   "treatments": [
    {
     "label": "Minorwood",
     "field": "slam.minorwood.play",
     "skill": "bidding_conventions/minorwood",
     "level": 7,
     "status": "ab-gains",
     "why": "self A/B minorwood: gains (96 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "minorwood",
     "title": "Minorwood: four of the agreed minor asks for keycards",
     "file": "conventions/slam/minorwood.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/minorwood.bid",
     "rules": 26,
     "tests": 20,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/minorwood.notes.md"
    }
   ],
   "see": [
    {
     "title": "Slam Bidding: Minorwood",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/405"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "minorwood",
     "scenarios": [
      "Minor_Game_Or_Slam"
     ],
     "side": "both",
     "changed": 96,
     "verdict": "gains",
     "z": 6.7,
     "actor_contract": 361,
     "actor_doubling": 0,
     "status": "ab-gains",
     "changes": {
      "slam.minorwood.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": "No queen ask and no king ask after the keycard answer.",
   "tests": 20,
   "rules": 26,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/minorwood.notes.md"
   ],
   "status": "partial",
   "why": "No queen ask and no king ask after the keycard answer."
  },
  {
   "id": "bidding_conventions/pick_a_slam_5nt",
   "name": "Pick-a-slam 5NT",
   "section": "constructive",
   "level": 7,
   "summary": "A 5NT bid, not after a keycard ask, asks partner to choose among several possible slams, usually in notrump or in a suit partner prefers.",
   "source": "proposed",
   "members": [
    "bidding_conventions/pick_a_slam_5nt"
   ],
   "treatments": [
    {
     "label": "Pick-a-slam 5NT",
     "field": "slam.pick_a_slam_5nt.play",
     "skill": "bidding_conventions/pick_a_slam_5nt",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "pick-a-slam",
     "title": "Pick-a-slam 5NT: choose among the slams",
     "file": "conventions/slam/pick-a-slam.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/pick-a-slam.bid",
     "rules": 7,
     "tests": 5,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/pick-a-slam.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 23
    },
    {
     "title": "Slam Bidding: 5NT Choice of Slams",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/535"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 5,
   "rules": 7,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/pick-a-slam.notes.md"
   ],
   "status": "tested",
   "why": "5 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/precision_2d",
   "name": "Precision 2♦",
   "section": "constructive",
   "level": 7,
   "summary": "In Precision, an opening 2♦ shows a limited opening short in diamonds, usually 4-4-1-4 or 4-4-0-5 with 11-15 points.",
   "source": "proposed",
   "members": [
    "bidding_conventions/precision_2d"
   ],
   "treatments": [
    {
     "label": "Precision 2♦",
     "field": "two_level.precision_2d.play",
     "skill": "bidding_conventions/precision_2d",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "precision-2d",
     "title": "Precision 2♦",
     "file": "conventions/openings/precision-2d.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/precision-2d.bid",
     "rules": 27,
     "tests": 19,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/precision-2d.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 19,
   "rules": 27,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/precision-2d.notes.md"
   ],
   "status": "tested",
   "why": "19 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/puppet_stayman",
   "name": "Puppet Stayman",
   "section": "constructive",
   "level": 7,
   "summary": "A form of Stayman, usually over 2NT, that finds five-card majors as well as four-card ones: 3♣ asks, opener shows a five-card major directly or bids 3♦ with a four-card major, and responder then bids the major responder does not hold.",
   "source": "proposed",
   "members": [
    "bidding_conventions/puppet_stayman"
   ],
   "treatments": [
    {
     "label": "2NT: Puppet Stayman (3♣)",
     "field": "notrump.two_nt.puppet",
     "skill": "bidding_conventions/puppet_stayman",
     "level": 7,
     "status": "bba-good",
     "why": "vs BBA in Puppet_Stayman_2N: +0.61 IMPs/board, NS calls agreeing 86%"
    },
    {
     "label": "Puppet Stayman over 1NT (3♣)",
     "field": "notrump.stayman.puppet_1nt",
     "skill": "bidding_conventions/puppet_stayman",
     "level": 7,
     "status": "bba-good",
     "why": "vs BBA in Puppet_Stayman_1N: +0.42 IMPs/board, NS calls agreeing 87%"
    }
   ],
   "modules": [
    {
     "name": "puppet-1nt",
     "title": "Puppet Stayman over 1NT",
     "file": "conventions/notrump/puppet-1nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/puppet-1nt.bid",
     "rules": 2,
     "tests": 14,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/puppet-1nt.notes.md"
    }
   ],
   "see": [
    {
     "title": "Puppet Stayman",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/puppet_stayman.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 16
    },
    {
     "title": "NT Auctions: Puppet Stayman and 5-Card Stayman",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/523"
    }
   ],
   "scenarios": [
    {
     "name": "Puppet_Stayman_1N",
     "boards": 500,
     "ns_agree": 0.869,
     "errors_per_board": 0.424,
     "auctions_match": 0.436,
     "ns_card": "21GF-Puppet",
     "status": "bba-good"
    },
    {
     "name": "Puppet_Stayman_2N",
     "boards": 500,
     "ns_agree": 0.8621,
     "errors_per_board": 0.606,
     "auctions_match": 0.42,
     "ns_card": "21GF-MSTandMSS",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.8655,
    "errors_per_board": 0.515,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "puppet-stayman",
     "off": [
      "notrump.stayman.puppet_1nt=false",
      "notrump.two_nt.puppet=false"
     ],
     "scenarios": [
      "Puppet_Stayman_1N",
      "Puppet_Stayman_2N"
     ],
     "bba_keys": [
      "1N-3C Puppet Stayman",
      "2N-3C Puppet Stayman"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-fair",
     "changed": 994,
     "changed_ours": 978,
     "changed_bba": 987,
     "rusty_gain": 533,
     "bba_gain": 640,
     "net": -107,
     "net_other": 23,
     "rusty_contract": 533,
     "rusty_doubling": 0,
     "bba_contract": 645,
     "bba_doubling": -5,
     "net_halves": [
      -211,
      104
     ],
     "net_per_changed": -0.108,
     "rusty_per_changed": 0.536,
     "bba_per_changed": 0.644,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 994,
    "changed_ours": 978,
    "changed_bba": 987,
    "rusty_gain": 533,
    "bba_gain": 640,
    "net": -107,
    "net_other": 23,
    "rusty_contract": 533,
    "rusty_doubling": 0,
    "bba_contract": 645,
    "bba_doubling": -5,
    "net_halves": [
     -211,
     104
    ],
    "net_per_changed": -0.108,
    "rusty_per_changed": 0.536,
    "bba_per_changed": 0.644,
    "halves_agree": false,
    "runs": [
     "puppet-stayman"
    ],
    "scenarios": [
     "Puppet_Stayman_1N",
     "Puppet_Stayman_2N"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 1000,
     "ns_agree": 0.8655,
     "errors_per_board": 0.515,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 14,
   "rules": 2,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/puppet-1nt.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-good",
   "why": "convention score -0.11 IMPs per changed board (our gain +533, BBA's +640, 994 boards); background on these deals +0.52 IMPs/board, NS calls agreeing 87%"
  },
  {
   "id": "bidding_conventions/wolff_signoff",
   "name": "Wolff signoff",
   "section": "constructive",
   "level": 7,
   "summary": "After opener's 2NT rebid (1m–1M–2NT), responder's 3♣ forces opener to bid 3♦, so responder can sign off in a suit or show weaker hands; other three- level bids force.",
   "source": "proposed",
   "members": [
    "bidding_conventions/wolff_signoff"
   ],
   "treatments": [
    {
     "label": "Wolff sign-off",
     "field": "other_conventions.wolff_signoff.play",
     "skill": "bidding_conventions/wolff_signoff",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "wolff",
     "title": "Wolff sign-off after opener's 2NT rebid",
     "file": "conventions/base/wolff.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/wolff.bid",
     "rules": 4,
     "tests": 5,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/wolff.notes.md"
    }
   ],
   "see": [
    {
     "title": "2-Way New Minor Forcing and Wolff Signoff",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/586"
    },
    {
     "title": "Transfer Wolff Over 2NT Rebids",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/595"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 5,
   "rules": 4,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/wolff.notes.md"
   ],
   "status": "tested",
   "why": "5 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/bart",
   "name": "BART",
   "section": "constructive",
   "level": 8,
   "summary": "After 1♥ or 1♠, a forcing 1NT and opener's 2♣, responder's 2♦ is artificial, covering several stronger hands (a good club raise, a good preference, diamonds) that need room.",
   "source": "proposed",
   "members": [
    "bidding_conventions/bart"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "BART",
     "by": "Larry Cohen",
     "url": "https://www.larryco.com/bridge-articles/bart"
    }
   ],
   "scenarios": [
    {
     "name": "BART",
     "boards": 500,
     "ns_agree": 0.7181,
     "errors_per_board": -0.066,
     "auctions_match": 0.196,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7181,
    "errors_per_board": -0.066,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/benjamin_2d",
   "name": "Benjamin 2♦",
   "section": "constructive",
   "level": 8,
   "summary": "Openings in which 2♣ shows a strong two in any suit, 2♦ is the game-forcing hand, and 2♥ and 2♠ are weak twos, so there is no weak 2♦.",
   "source": "proposed",
   "members": [
    "bidding_conventions/benjamin_2d"
   ],
   "treatments": [
    {
     "label": "Benjamin 2♦",
     "field": "two_level.benjamin.play",
     "skill": "bidding_conventions/benjamin_2d",
     "level": 8,
     "status": "bba-fair",
     "why": "vs BBA in Benjamin_2D: -0.50 IMPs/board, NS calls agreeing 62%"
    }
   ],
   "modules": [
    {
     "name": "benjamin",
     "title": "Benjamin 2♣ and 2♦",
     "file": "conventions/openings/benjamin.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/benjamin.bid",
     "rules": 34,
     "tests": 26,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/benjamin.notes.md"
    }
   ],
   "see": [
    {
     "title": "Benjamin Twos",
     "site": "Wikipedia",
     "url": "https://en.wikipedia.org/wiki/Benjamin_Twos"
    }
   ],
   "scenarios": [
    {
     "name": "Benjamin_2D",
     "boards": 500,
     "ns_agree": 0.6176,
     "errors_per_board": -0.498,
     "auctions_match": 0.124,
     "ns_card": "21GF-PolishTwoSuiters",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6176,
    "errors_per_board": -0.498,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "benjamin",
     "off": [
      "two_level.benjamin.play=false"
     ],
     "scenarios": [
      "Benjamin_2D"
     ],
     "bba_keys": [
      "Benjamin 2D"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 393,
     "changed_ours": 339,
     "changed_bba": 320,
     "rusty_gain": 141,
     "bba_gain": 52,
     "net": 89,
     "net_other": 13,
     "rusty_contract": 117,
     "rusty_doubling": 24,
     "bba_contract": 52,
     "bba_doubling": 0,
     "net_halves": [
      52,
      37
     ],
     "net_per_changed": 0.226,
     "rusty_per_changed": 0.359,
     "bba_per_changed": 0.132,
     "halves_agree": true,
     "no_rule_on": 1,
     "no_rule_off": 1
    }
   ],
   "conv_score": {
    "changed": 393,
    "changed_ours": 339,
    "changed_bba": 320,
    "rusty_gain": 141,
    "bba_gain": 52,
    "net": 89,
    "net_other": 13,
    "rusty_contract": 117,
    "rusty_doubling": 24,
    "bba_contract": 52,
    "bba_doubling": 0,
    "net_halves": [
     52,
     37
    ],
    "net_per_changed": 0.226,
    "rusty_per_changed": 0.359,
    "bba_per_changed": 0.132,
    "halves_agree": true,
    "runs": [
     "benjamin"
    ],
    "scenarios": [
     "Benjamin_2D"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.6176,
     "errors_per_board": -0.498,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 26,
   "rules": 34,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/benjamin.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-fair",
   "why": "convention score +0.23 IMPs per changed board (our gain +141, BBA's +52, 393 boards); background on these deals -0.50 IMPs/board, NS calls agreeing 62%"
  },
  {
   "id": "bidding_conventions/french_2d",
   "name": "French 2♦",
   "section": "constructive",
   "level": 8,
   "summary": "An opening 2♦ with an artificial meaning in the French style; details vary by partnership, so the card's notes say which.",
   "source": "proposed",
   "members": [
    "bidding_conventions/french_2d"
   ],
   "treatments": [
    {
     "label": "French 2♦",
     "field": "two_level.french_2d.play",
     "skill": "bidding_conventions/french_2d",
     "level": 8,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "french-2d",
     "title": "French 2♦ (game forcing)",
     "file": "conventions/openings/french-2d.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/french-2d.bid",
     "rules": 18,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/french-2d.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 21,
   "rules": 18,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/french-2d.notes.md"
   ],
   "status": "tested",
   "why": "21 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/kokish",
   "name": "Kokish relay",
   "section": "constructive",
   "level": 8,
   "summary": "After 2♣–2♦, opener's 2♥ is a relay: either hearts or a strong balanced hand. Responder must bid 2♠, and opener's next bid says which, which keeps the strong 2NT rebid out of the way.",
   "source": "proposed",
   "members": [
    "bidding_conventions/kokish"
   ],
   "treatments": [
    {
     "label": "Kokish relay",
     "field": "two_level.two_clubs.kokish",
     "skill": "bidding_conventions/kokish",
     "level": 8,
     "status": "bba-poor",
     "why": "vs BBA in Kokish_Relay: -1.10 IMPs/board, NS calls agreeing 78%"
    }
   ],
   "modules": [
    {
     "name": "kokish",
     "title": "Kokish relay after 2♣–2♦",
     "file": "conventions/openings/kokish.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/kokish.bid",
     "rules": 13,
     "tests": 14,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/kokish.notes.md"
    }
   ],
   "see": [
    {
     "title": "Kokish Relay",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/kokish_relay.php"
    },
    {
     "title": "Kokish Over Strong 2C",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/576"
    }
   ],
   "scenarios": [
    {
     "name": "Kokish_Relay",
     "boards": 500,
     "ns_agree": 0.7768,
     "errors_per_board": -1.104,
     "auctions_match": 0.286,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7768,
    "errors_per_board": -1.104,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [
    {
     "name": "kokish",
     "off": [
      "two_level.two_clubs.kokish=false"
     ],
     "scenarios": [
      "Kokish_Relay"
     ],
     "bba_keys": [
      "Kokish Relay"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 401,
     "changed_ours": 383,
     "changed_bba": 288,
     "rusty_gain": 159,
     "bba_gain": 55,
     "net": 104,
     "net_other": -263,
     "rusty_contract": 159,
     "rusty_doubling": 0,
     "bba_contract": 55,
     "bba_doubling": 0,
     "net_halves": [
      6,
      98
     ],
     "net_per_changed": 0.259,
     "rusty_per_changed": 0.397,
     "bba_per_changed": 0.137,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 401,
    "changed_ours": 383,
    "changed_bba": 288,
    "rusty_gain": 159,
    "bba_gain": 55,
    "net": 104,
    "net_other": -263,
    "rusty_contract": 159,
    "rusty_doubling": 0,
    "bba_contract": 55,
    "bba_doubling": 0,
    "net_halves": [
     6,
     98
    ],
    "net_per_changed": 0.259,
    "rusty_per_changed": 0.397,
    "bba_per_changed": 0.137,
    "halves_agree": true,
    "runs": [
     "kokish"
    ],
    "scenarios": [
     "Kokish_Relay"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.7768,
     "errors_per_board": -1.104,
     "status": "bba-poor"
    }
   },
   "partial": null,
   "tests": 14,
   "rules": 13,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/kokish.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-poor",
   "why": "convention score +0.26 IMPs per changed board (our gain +159, BBA's +55, 401 boards); background on these deals -1.10 IMPs/board, NS calls agreeing 78%"
  },
  {
   "id": "bidding_conventions/mccabe",
   "name": "McCabe adjunct",
   "section": "constructive",
   "level": 8,
   "summary": "After partner's weak two is doubled, responder's new suits and 2NT say what to lead rather than show length, so the partnership can compete and direct the defence at once.",
   "source": "proposed",
   "members": [
    "bidding_conventions/mccabe"
   ],
   "treatments": [
    {
     "label": "McCabe adjunct",
     "field": "two_level.mccabe.play",
     "skill": "bidding_conventions/mccabe",
     "level": 8,
     "status": "ab-gains",
     "why": "self A/B mccabe: leans gain (168 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "mccabe",
     "title": "McCabe adjunct",
     "file": "conventions/openings/mccabe.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/mccabe.bid",
     "rules": 14,
     "tests": 13,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/mccabe.notes.md"
    }
   ],
   "see": [
    {
     "title": "McCabe Responses to Preempts",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/468"
    },
    {
     "title": "Transfer McCabe Responses to Preempts",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/606"
    }
   ],
   "scenarios": [
    {
     "name": "McCabe_After_Weak_2",
     "boards": 500,
     "ns_agree": 0.757,
     "errors_per_board": -0.822,
     "auctions_match": 0.202,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "McCabe_after_WJO",
     "boards": 500,
     "ns_agree": 0.8368,
     "errors_per_board": -1.31,
     "auctions_match": 0.168,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7934,
    "errors_per_board": -1.066,
    "status": "bba-poor"
   },
   "ab": [
    {
     "name": "mccabe",
     "scenarios": [
      "McCabe_After_Weak_2",
      "McCabe_after_WJO"
     ],
     "side": "both",
     "changed": 168,
     "verdict": "leans gain",
     "z": 1.8,
     "actor_contract": -20,
     "actor_doubling": 137,
     "status": "ab-gains",
     "changes": {
      "two_level.mccabe.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 13,
   "rules": 14,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/mccabe.notes.md"
   ],
   "status": "ab-gains",
   "why": "self A/B mccabe: leans gain (168 boards changed)"
  },
  {
   "id": "bidding_conventions/muiderberg",
   "name": "Muiderberg twos",
   "section": "constructive",
   "level": 8,
   "summary": "Openings of 2♥ and 2♠ that show five cards in the major and four or more in a minor, with less than an opening bid.",
   "source": "proposed",
   "members": [
    "bidding_conventions/muiderberg"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Muiderberg Two Bids",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/muiderberg_two_bids.php"
    }
   ],
   "scenarios": [
    {
     "name": "Muiderberg_Two_Bids",
     "boards": 500,
     "ns_agree": 0.7978,
     "errors_per_board": -0.852,
     "auctions_match": 0.148,
     "ns_card": "21GF-PolishTwoSuiters",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7978,
    "errors_per_board": -0.852,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/multi_2d",
   "name": "Multi 2♦",
   "section": "constructive",
   "level": 8,
   "summary": "An opening 2♦ that shows a weak two in either major, or one of a few strong hands. Responder bids to cater for either major, and opener's rebid resolves which.",
   "source": "proposed",
   "members": [
    "bidding_conventions/multi_2d",
    "bidding_conventions/lars_multi"
   ],
   "treatments": [
    {
     "label": "Multi 2♦",
     "field": "two_level.two_diamonds.multi",
     "skill": "bidding_conventions/multi_2d",
     "level": 8,
     "status": "bba-fair",
     "why": "vs BBA in Multi_2D: -0.75 IMPs/board, NS calls agreeing 79%"
    }
   ],
   "modules": [
    {
     "name": "multi",
     "title": "Multi 2♦",
     "file": "conventions/openings/multi.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/multi.bid",
     "rules": 34,
     "tests": 22,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/multi.notes.md"
    },
    {
     "name": "vs-multi",
     "title": "Defence to a Multi 2♦",
     "file": "conventions/openings/vs-multi.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/vs-multi.bid",
     "rules": 21,
     "tests": 9,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/vs-multi.notes.md"
    }
   ],
   "see": [
    {
     "title": "Multi 2♦",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/multi_2d.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 25
    }
   ],
   "variants": [
    {
     "id": "bidding_conventions/lars_multi",
     "name": "Lars Multi 2♦",
     "level": 9,
     "summary": "A Multi 2♦ that shows a weak two in either major or a 20–21 balanced hand."
    }
   ],
   "scenarios": [
    {
     "name": "Multi_2D",
     "boards": 500,
     "ns_agree": 0.7864,
     "errors_per_board": -0.752,
     "auctions_match": 0.136,
     "ns_card": "21GF-Multi",
     "status": "bba-fair"
    },
    {
     "name": "Opps_Multi_2D",
     "boards": 500,
     "ns_agree": 0.7606,
     "errors_per_board": -0.534,
     "auctions_match": 0.168,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7742,
    "errors_per_board": -0.643,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "multi-2d",
     "off": [
      "two_level.two_diamonds.multi=false"
     ],
     "scenarios": [
      "Multi_2D"
     ],
     "bba_keys": [
      "Multi"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 351,
     "changed_ours": 351,
     "changed_bba": 351,
     "rusty_gain": 5,
     "bba_gain": -46,
     "net": 51,
     "net_other": 80,
     "rusty_contract": -7,
     "rusty_doubling": 12,
     "bba_contract": 104,
     "bba_doubling": -150,
     "net_halves": [
      80,
      -29
     ],
     "net_per_changed": 0.145,
     "rusty_per_changed": 0.014,
     "bba_per_changed": -0.131,
     "halves_agree": false,
     "no_rule_on": 4,
     "no_rule_off": 8
    }
   ],
   "conv_score": {
    "changed": 351,
    "changed_ours": 351,
    "changed_bba": 351,
    "rusty_gain": 5,
    "bba_gain": -46,
    "net": 51,
    "net_other": 80,
    "rusty_contract": -7,
    "rusty_doubling": 12,
    "bba_contract": 104,
    "bba_doubling": -150,
    "net_halves": [
     80,
     -29
    ],
    "net_per_changed": 0.145,
    "rusty_per_changed": 0.014,
    "bba_per_changed": -0.131,
    "halves_agree": false,
    "runs": [
     "multi-2d"
    ],
    "scenarios": [
     "Multi_2D"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.7864,
     "errors_per_board": -0.752,
     "status": "bba-fair"
    }
   },
   "partial": "Weak options only: the strong options (4-4-4-1, Lars Multi's 20-21) are not written.",
   "tests": 31,
   "rules": 55,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/multi.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/vs-multi.notes.md"
   ],
   "status": "partial",
   "why": "Weak options only: the strong options (4-4-4-1, Lars Multi's 20-21) are not written."
  },
  {
   "id": "bidding_conventions/roudi",
   "name": "Roudi",
   "section": "constructive",
   "level": 8,
   "summary": "A checkback used in Acol and similar systems after opener's 1NT rebid, with 2♣ asking about support and strength.",
   "source": "proposed",
   "members": [
    "bidding_conventions/roudi"
   ],
   "treatments": [
    {
     "label": "Roudi",
     "field": "other_conventions.roudi.play",
     "skill": "bidding_conventions/roudi",
     "level": 8,
     "status": "bba-fair",
     "why": "vs BBA in WB5_Roudi: -0.89 IMPs/board, NS calls agreeing 76%"
    }
   ],
   "modules": [
    {
     "name": "roudi",
     "title": "Roudi",
     "file": "conventions/base/roudi.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/roudi.bid",
     "rules": 18,
     "tests": 11,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/roudi.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "WB5_Roudi",
     "boards": 500,
     "ns_agree": 0.762,
     "errors_per_board": -0.894,
     "auctions_match": 0.208,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.762,
    "errors_per_board": -0.894,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "roudi",
     "off": [
      "other_conventions.roudi.play=false"
     ],
     "scenarios": [
      "WB5_Roudi"
     ],
     "bba_keys": [
      "Roudi"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-fair",
     "changed": 257,
     "changed_ours": 199,
     "changed_bba": 189,
     "rusty_gain": -4,
     "bba_gain": 56,
     "net": -60,
     "net_other": -100,
     "rusty_contract": -4,
     "rusty_doubling": 0,
     "bba_contract": 56,
     "bba_doubling": 0,
     "net_halves": [
      -77,
      17
     ],
     "net_per_changed": -0.233,
     "rusty_per_changed": -0.016,
     "bba_per_changed": 0.218,
     "halves_agree": false,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 257,
    "changed_ours": 199,
    "changed_bba": 189,
    "rusty_gain": -4,
    "bba_gain": 56,
    "net": -60,
    "net_other": -100,
    "rusty_contract": -4,
    "rusty_doubling": 0,
    "bba_contract": 56,
    "bba_doubling": 0,
    "net_halves": [
     -77,
     17
    ],
    "net_per_changed": -0.233,
    "rusty_per_changed": -0.016,
    "bba_per_changed": 0.218,
    "halves_agree": false,
    "runs": [
     "roudi"
    ],
    "scenarios": [
     "WB5_Roudi"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 500,
     "ns_agree": 0.762,
     "errors_per_board": -0.894,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 11,
   "rules": 18,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/roudi.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.23 IMPs per changed board (our gain -4, BBA's +56, 257 boards); background on these deals -0.89 IMPs/board, NS calls agreeing 76%"
  },
  {
   "id": "bidding_conventions/soloway",
   "name": "Soloway jump shifts",
   "section": "constructive",
   "level": 8,
   "summary": "Responder's jump shifts are strong and describe the hand by type: a one- suiter, a fit for opener, or a balanced hand, as GIB plays them.",
   "source": "proposed",
   "members": [
    "bidding_conventions/soloway"
   ],
   "treatments": [
    {
     "label": "Soloway jump shifts",
     "field": "general.jump_shifts.soloway",
     "skill": "bidding_conventions/soloway",
     "level": 8,
     "status": "bba-poor",
     "why": "vs BBA in Soloway_Jump_Shift: -1.71 IMPs/board, NS calls agreeing 60%"
    },
    {
     "label": "Soloway jump shifts (extended)",
     "field": "general.jump_shifts.soloway_extended",
     "skill": "bidding_conventions/soloway",
     "level": 9,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "soloway",
     "title": "Soloway jump shifts",
     "file": "conventions/base/soloway.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/soloway.bid",
     "rules": 12,
     "tests": 12,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/soloway.notes.md"
    }
   ],
   "see": [
    {
     "title": "Soloway Jump Shift",
     "site": "BBO GIB system notes",
     "url": "https://www.bridgebase.com/doc/gib_system_notes.php#Soloway_Jump_Shift"
    }
   ],
   "scenarios": [
    {
     "name": "Soloway_Jump_Shift",
     "boards": 500,
     "ns_agree": 0.6038,
     "errors_per_board": -1.708,
     "auctions_match": 0.032,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6038,
    "errors_per_board": -1.708,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [
    {
     "name": "soloway",
     "off": [
      "general.jump_shifts.soloway=false",
      "general.jump_shifts.soloway_extended=false"
     ],
     "scenarios": [
      "Soloway_Jump_Shift"
     ],
     "bba_keys": [
      "Soloway Jump Shifts"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 489,
     "changed_ours": 477,
     "changed_bba": 438,
     "rusty_gain": 372,
     "bba_gain": 134,
     "net": 238,
     "net_other": -44,
     "rusty_contract": 364,
     "rusty_doubling": 8,
     "bba_contract": 141,
     "bba_doubling": -7,
     "net_halves": [
      118,
      120
     ],
     "net_per_changed": 0.487,
     "rusty_per_changed": 0.761,
     "bba_per_changed": 0.274,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 489,
    "changed_ours": 477,
    "changed_bba": 438,
    "rusty_gain": 372,
    "bba_gain": 134,
    "net": 238,
    "net_other": -44,
    "rusty_contract": 364,
    "rusty_doubling": 8,
    "bba_contract": 141,
    "bba_doubling": -7,
    "net_halves": [
     118,
     120
    ],
    "net_per_changed": 0.487,
    "rusty_per_changed": 0.761,
    "bba_per_changed": 0.274,
    "halves_agree": true,
    "runs": [
     "soloway"
    ],
    "scenarios": [
     "Soloway_Jump_Shift"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.6038,
     "errors_per_board": -1.708,
     "status": "bba-poor"
    }
   },
   "partial": null,
   "tests": 12,
   "rules": 12,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/soloway.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-poor",
   "why": "convention score +0.49 IMPs per changed board (our gain +372, BBA's +134, 489 boards); background on these deals -1.71 IMPs/board, NS calls agreeing 60%"
  },
  {
   "id": "bidding_conventions/spiral",
   "name": "Spiral",
   "section": "constructive",
   "level": 8,
   "summary": "A relay that asks about trump length and quality in steps once a fit is found, so the asker can judge game or slam from how good the trumps are.",
   "source": "proposed",
   "members": [
    "bidding_conventions/spiral"
   ],
   "treatments": [
    {
     "label": "Spiral cuebids",
     "field": "slam.spiral_cuebids.play",
     "skill": "bidding_conventions/spiral",
     "level": 8,
     "status": "ab-neutral",
     "why": "self A/B spiral-2nt: neutral (84 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "spiral",
     "title": "Spiral 2NT: how many trumps, minimum or maximum, after 1X-1M-2M",
     "file": "conventions/slam/spiral.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/spiral.bid",
     "rules": 11,
     "tests": 14,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/spiral.notes.md"
    }
   ],
   "see": [
    {
     "title": "Fits and More: 2NT Trump Suit Game Try - Spiral",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/529"
    }
   ],
   "scenarios": [
    {
     "name": "Spiral_Raises_Weinstein",
     "boards": 500,
     "ns_agree": 0.7418,
     "errors_per_board": 0.228,
     "auctions_match": 0.14,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Spiral_Raises_Wolpert",
     "boards": 500,
     "ns_agree": 0.7134,
     "errors_per_board": -0.018,
     "auctions_match": 0.1,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7276,
    "errors_per_board": 0.105,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "spiral-2nt",
     "scenarios": [
      "Spiral_Raises_Weinstein",
      "Spiral_Raises_Wolpert"
     ],
     "side": "both",
     "changed": 84,
     "verdict": "neutral",
     "z": 0.6,
     "actor_contract": 21,
     "actor_doubling": 0,
     "status": "ab-neutral",
     "changes": {
      "slam.spiral_cuebids.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 14,
   "rules": 11,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/spiral.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B spiral-2nt: neutral (84 boards changed)"
  },
  {
   "id": "bidding_conventions/gazzilli",
   "name": "Gazzilli",
   "section": "constructive",
   "level": 9,
   "summary": "After 1♥ or 1♠ and a 1NT response, opener's 2♣ is artificial: either natural clubs or any strong hand. Responder's 2♦ asks, letting opener show strong hands at the two level.",
   "source": "proposed",
   "members": [
    "bidding_conventions/gazzilli"
   ],
   "treatments": [
    {
     "label": "Gazzilli",
     "field": "major_openings.gazzilli.play",
     "skill": "bidding_conventions/gazzilli",
     "level": 9,
     "status": "bba-fair",
     "why": "vs BBA in Gazzilli: -0.89 IMPs/board, NS calls agreeing 77%"
    }
   ],
   "modules": [
    {
     "name": "gazzilli",
     "title": "Gazzilli 2♣ after 1M-1NT and 1♥-1♠",
     "file": "conventions/majors/gazzilli.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/gazzilli.bid",
     "rules": 63,
     "tests": 15,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/gazzilli.notes.md"
    }
   ],
   "see": [
    {
     "title": "Constructive Bidding: Modern Gazzilli",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/488"
    }
   ],
   "scenarios": [
    {
     "name": "Gazzilli",
     "boards": 500,
     "ns_agree": 0.7696,
     "errors_per_board": -0.886,
     "auctions_match": 0.26,
     "ns_card": "21GF-Gazzilli",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7696,
    "errors_per_board": -0.886,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": "Partial (2026-10-05): after 1♥/1♠–1NT and 1♥–1♠ only; see gazzilli.notes.md.",
   "tests": 15,
   "rules": 63,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/majors/gazzilli.notes.md"
   ],
   "status": "partial",
   "why": "Partial (2026-10-05): after 1♥/1♠–1NT and 1♥–1♠ only; see gazzilli.notes.md."
  },
  {
   "id": "bidding_conventions/preempt_keycard",
   "name": "Keycard over preempts",
   "section": "constructive",
   "level": 9,
   "summary": "After partner's preempt, an agreed bid (often 4♣) asks for keycards in partner's suit, since 4NT would take the auction too high.",
   "source": "proposed",
   "members": [
    "bidding_conventions/preempt_keycard"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Preempt Keycard",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/578"
    }
   ],
   "scenarios": [
    {
     "name": "Preempt_Keycard",
     "boards": 500,
     "ns_agree": 0.5004,
     "errors_per_board": 0.0,
     "auctions_match": 0.112,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.5004,
    "errors_per_board": 0.0,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/kickback",
   "name": "Kickback",
   "section": "constructive",
   "level": 9,
   "summary": "A keycard ask in the suit above trumps instead of 4NT: 4♦ with clubs as trumps, 4♥ with diamonds, 4♠ with hearts, and 4NT with spades. The answers then never take the auction past five of the trump suit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/kickback"
   ],
   "treatments": [
    {
     "label": "Kickback",
     "field": "slam.kickback.play",
     "skill": "bidding_conventions/kickback",
     "level": 9,
     "status": "ab-neutral",
     "why": "self A/B kickback: neutral (154 boards changed)"
    },
    {
     "label": "Kickback 0314",
     "field": "slam.kickback.rkcb_0314",
     "skill": "bidding_conventions/kickback",
     "level": 9,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Kickback 1430",
     "field": "slam.kickback.rkcb_1430",
     "skill": "bidding_conventions/kickback",
     "level": 9,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "kickback",
     "title": "Kickback: the step above four of the trump suit asks for keycards",
     "file": "conventions/slam/kickback.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/kickback.bid",
     "rules": 37,
     "tests": 23,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/kickback.notes.md"
    }
   ],
   "see": [
    {
     "title": "Kickback Keycard Ask",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/582"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "kickback",
     "scenarios": [
      "Minor_Game_Or_Slam",
      "Slam_After_Major_Fit"
     ],
     "side": "both",
     "changed": 154,
     "verdict": "neutral",
     "z": 0.3,
     "actor_contract": 9,
     "actor_doubling": 0,
     "status": "ab-neutral",
     "changes": {
      "slam.kickback.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": "No queen ask over the 1-or-4 / 0-or-3 answers.",
   "tests": 23,
   "rules": 37,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/kickback.notes.md"
   ],
   "status": "partial",
   "why": "No queen ask over the 1-or-4 / 0-or-3 answers."
  },
  {
   "id": "bidding_conventions/kokish_game_tries",
   "name": "Kokish game tries",
   "section": "constructive",
   "level": 9,
   "summary": "A structure of game tries after a major-suit raise that uses the next step as a relay, so opener can make several kinds of try.",
   "source": "proposed",
   "members": [
    "bidding_conventions/kokish_game_tries"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Kokish Game Tries",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/588"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/last_train",
   "name": "Last Train",
   "section": "constructive",
   "level": 9,
   "summary": "When the only bid left between a fit and game in the agreed major is one step below it, that bid is a general slam try rather than showing anything in its suit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/last_train"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Last Train",
     "site": "Wikipedia",
     "url": "https://en.wikipedia.org/wiki/Last_Train_(bridge)"
    },
    {
     "title": "Slam Bidding: Last Train Slam Try",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/540"
    }
   ],
   "scenarios": [
    {
     "name": "Last_Train_Game_Try",
     "boards": 500,
     "ns_agree": 0.7095,
     "errors_per_board": 0.492,
     "auctions_match": 0.166,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Last_Train_GT2",
     "boards": 500,
     "ns_agree": 0.6955,
     "errors_per_board": 0.326,
     "auctions_match": 0.156,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7028,
    "errors_per_board": 0.409,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/over_splinters",
   "name": "Over-splinters",
   "section": "constructive",
   "level": 9,
   "summary": "A jump one level beyond a normal splinter, used when the normal splinter bid has another meaning, to show shortness and a fit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/over_splinters"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Fits and More: Over-Splinters",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/530"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/polish_two_suiters",
   "name": "Polish two-suiters",
   "section": "constructive",
   "level": 9,
   "summary": "Weak openings at the two level that show two-suited hands, with the second suit unknown or limited, as used in Polish Club.",
   "source": "proposed",
   "members": [
    "bidding_conventions/polish_two_suiters"
   ],
   "treatments": [
    {
     "label": "Polish two-suiters",
     "field": "two_level.polish_two_suiters.play",
     "skill": "bidding_conventions/polish_two_suiters",
     "level": 9,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "polish-two-suiters",
     "title": "Polish two-suiters: 2♥ and 2♠",
     "file": "conventions/openings/polish-two-suiters.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/polish-two-suiters.bid",
     "rules": 27,
     "tests": 15,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/polish-two-suiters.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": "Interference beyond a double, and opener's strength after the 2NT ask, are not written.",
   "tests": 15,
   "rules": 27,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/polish-two-suiters.notes.md"
   ],
   "status": "partial",
   "why": "Interference beyond a double, and opener's strength after the 2NT ask, are not written."
  },
  {
   "id": "bidding_conventions/serious_3nt",
   "name": "Serious 3NT",
   "section": "constructive",
   "level": 9,
   "summary": "In a game-forcing auction with a major agreed at the three level, 3NT is artificial and says whether the bidder is serious about slam (serious or non-serious by agreement), before control bids begin.",
   "source": "proposed",
   "members": [
    "bidding_conventions/serious_3nt"
   ],
   "treatments": [
    {
     "label": "Non-serious 3NT",
     "field": "slam.non_serious_3nt.play",
     "skill": "bidding_conventions/serious_3nt",
     "level": 9,
     "status": "ab-neutral",
     "why": "self A/B non-serious-3nt: neutral (52 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "serious-3nt",
     "title": "Non-serious 3NT before control bids in a major-fit game force",
     "file": "conventions/slam/serious-3nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/serious-3nt.bid",
     "rules": 6,
     "tests": 12,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/serious-3nt.notes.md"
    }
   ],
   "see": [
    {
     "title": "Slam Bidding: Non-Serious 3NT",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/539"
    }
   ],
   "scenarios": [
    {
     "name": "Serious",
     "boards": 500,
     "ns_agree": 0.5716,
     "errors_per_board": -0.966,
     "auctions_match": 0.072,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.5716,
    "errors_per_board": -0.966,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "non-serious-3nt",
     "scenarios": [
      "Serious"
     ],
     "side": "both",
     "changed": 52,
     "verdict": "neutral",
     "z": 0.1,
     "actor_contract": 4,
     "actor_doubling": 0,
     "status": "ab-neutral",
     "changes": {
      "slam.non_serious_3nt.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 12,
   "rules": 6,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/slam/serious-3nt.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B non-serious-3nt: neutral (52 boards changed)"
  },
  {
   "id": "bidding_conventions/tislevoll",
   "name": "Tislevoll slam try",
   "section": "constructive",
   "level": 9,
   "summary": "After partner opens a major and the opponents preempt, responder's 4♣ and 4♦ are slam tries in partner's major that show or deny a control in the opponents' suit.",
   "source": "proposed",
   "members": [
    "bidding_conventions/tislevoll"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [
    {
     "name": "Tislevoll_after_Opps_Preempt",
     "boards": 500,
     "ns_agree": 0.7122,
     "errors_per_board": 0.0,
     "auctions_match": 0.192,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7122,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "bidding_conventions/transfers_after_double",
   "name": "Transfers after a takeout double",
   "section": "constructive",
   "level": 9,
   "summary": "After partner's opening is doubled for takeout, responder's new-suit bids are transfers to the next suit, so opener can accept or show a fit and responder can describe more hands.",
   "source": "proposed",
   "members": [
    "bidding_conventions/transfers_after_double"
   ],
   "treatments": [
    {
     "label": "Vs takeout double: transfer responses",
     "field": "vs_to_double.new_suit_forcing_tfr",
     "skill": "bidding_conventions/transfers_after_double",
     "level": 9,
     "status": "ab-loses",
     "why": "self A/B transfers-after-1M-X: leans loss (324 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "transfers-after-double",
     "title": "Transfer responses after their takeout double",
     "file": "conventions/competitive/transfers-after-double.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/transfers-after-double.bid",
     "rules": 36,
     "tests": 15,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/transfers-after-double.notes.md"
    }
   ],
   "see": [
    {
     "title": "1-Major (X) Transfers",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/598"
    },
    {
     "title": "1-minor (X) Transfers",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/599"
    }
   ],
   "scenarios": [
    {
     "name": "Transfers_after_1M_X",
     "boards": 500,
     "ns_agree": 0.7183,
     "errors_per_board": -0.086,
     "auctions_match": 0.06,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Xfer_after_1M_X",
     "boards": 500,
     "ns_agree": 0.6939,
     "errors_per_board": 0.146,
     "auctions_match": 0.096,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7061,
    "errors_per_board": 0.03,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "transfers-after-1M-X",
     "scenarios": [
      "Transfers_after_1M_X",
      "Xfer_after_1M_X"
     ],
     "side": "both",
     "changed": 324,
     "verdict": "leans loss",
     "z": -1.5,
     "actor_contract": -207,
     "actor_doubling": 100,
     "status": "ab-loses",
     "changes": {
      "vs_to_double.new_suit_forcing_tfr": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": "Only after a major: transfers after 1m (X) are not written.",
   "tests": 15,
   "rules": 36,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/transfers-after-double.notes.md"
   ],
   "status": "partial",
   "why": "Only after a major: transfers after 1m (X) are not written."
  },
  {
   "id": "bidding_conventions/wilkosz",
   "name": "Wilkosz 2♦",
   "section": "constructive",
   "level": 9,
   "summary": "An opening 2♦ showing a weak two-suited hand with at least five cards in each of two suits, one of them a major.",
   "source": "proposed",
   "members": [
    "bidding_conventions/wilkosz"
   ],
   "treatments": [
    {
     "label": "Wilkosz 2♦",
     "field": "two_level.wilkosz.play",
     "skill": "bidding_conventions/wilkosz",
     "level": 9,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "wilkosz",
     "title": "Wilkosz 2♦",
     "file": "conventions/openings/wilkosz.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/wilkosz.bid",
     "rules": 37,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/wilkosz.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 21,
   "rules": 37,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/openings/wilkosz.notes.md"
   ],
   "status": "tested",
   "why": "21 test cases; no corpus or A/B measure"
  },
  {
   "id": "bidding_conventions/xyz",
   "name": "XYZ",
   "section": "constructive",
   "level": 9,
   "summary": "After any three one-level bids, responder's 2♣ relays to 2♦ and 2♦ is game forcing, extending two-way checkback to every such auction.",
   "source": "proposed",
   "members": [
    "bidding_conventions/xyz"
   ],
   "treatments": [
    {
     "label": "XYZ",
     "field": "other_conventions.xyz",
     "skill": "bidding_conventions/xyz",
     "level": 9,
     "status": "ab-neutral",
     "why": "self A/B xyz-vs-nmf: neutral (242 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "xyz",
     "title": "XYZ: 2♣ relay and 2♦ game force after three one-level bids",
     "file": "conventions/base/xyz.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/xyz.bid",
     "rules": 10,
     "tests": 15,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/xyz.notes.md"
    }
   ],
   "see": [
    {
     "title": "XYZ",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/587"
    }
   ],
   "scenarios": [
    {
     "name": "XYZ",
     "boards": 500,
     "ns_agree": 0.7512,
     "errors_per_board": -0.712,
     "auctions_match": 0.178,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7512,
    "errors_per_board": -0.712,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "xyz-vs-nmf",
     "scenarios": [
      "XYZ"
     ],
     "side": "both",
     "changed": 242,
     "verdict": "neutral",
     "z": -0.7,
     "actor_contract": -28,
     "actor_doubling": 0,
     "status": "ab-neutral",
     "changes": {
      "other_conventions.xyz": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "xyz",
     "off": [
      "other_conventions.xyz=false"
     ],
     "scenarios": [
      "XYZ"
     ],
     "bba_keys": [],
     "notes": [
      "XYZ: 21GF-DEFAULT does not play it or leaves it unset (other_conventions.xyz=None)"
     ],
     "unmeasured": "XYZ: 21GF-DEFAULT does not play it or leaves it unset (other_conventions.xyz=None)",
     "repro": null,
     "status": null
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 15,
   "rules": 10,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/base/xyz.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B xyz-vs-nmf: neutral (242 boards changed)"
  },
  {
   "id": "competitive_bidding/overcalls",
   "name": "Overcalls",
   "section": "competitive",
   "level": 2,
   "summary": "",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/overcalls"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "overcalls",
     "title": "Suit and notrump overcalls",
     "file": "conventions/competitive/overcalls.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/overcalls.bid",
     "rules": 53,
     "tests": 32,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/overcalls.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Basic_Overcall",
     "boards": 500,
     "ns_agree": 0.7625,
     "errors_per_board": -0.29,
     "auctions_match": 0.156,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "We_Overcall",
     "boards": 500,
     "ns_agree": 0.7629,
     "errors_per_board": -0.614,
     "auctions_match": 0.114,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Jump_Overcalls",
     "boards": 500,
     "ns_agree": 0.8414,
     "errors_per_board": -1.294,
     "auctions_match": 0.168,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.7868,
    "errors_per_board": -0.733,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 32,
   "rules": 53,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/overcalls.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.73 IMPs/board against BBA's, NS calls agreeing 79% (1500 boards)"
  },
  {
   "id": "competitive_bidding/takeout_doubles",
   "name": "Takeout Doubles",
   "section": "competitive",
   "level": 2,
   "summary": "A double of an opening bid, when partner has not bid, asks partner to bid: it shows opening values, shortness in their suit and support for the unbid suits, or a hand too strong to overcall.",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/takeout_doubles"
   ],
   "treatments": [
    {
     "label": "Vs preempts: double is takeout",
     "field": "vs_preempts.takeout_double",
     "skill": "competitive_bidding/takeout_doubles",
     "level": 3,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "takeout-double",
     "title": "Takeout doubles",
     "file": "conventions/competitive/takeout-double.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/takeout-double.bid",
     "rules": 98,
     "tests": 40,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/takeout-double.notes.md"
    },
    {
     "name": "vs-preempts",
     "title": "Defence against preempts",
     "file": "conventions/competitive/vs-preempts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.bid",
     "rules": 111,
     "tests": 38,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.notes.md"
    }
   ],
   "see": [
    {
     "title": "Takeout Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/takeout_double.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 4
    },
    {
     "title": "Takeout Doubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/352"
    }
   ],
   "scenarios": [
    {
     "name": "Takeout_Double",
     "boards": 500,
     "ns_agree": 0.7177,
     "errors_per_board": -0.592,
     "auctions_match": 0.096,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Basic_Takeout_Double",
     "boards": 500,
     "ns_agree": 0.7494,
     "errors_per_board": -0.252,
     "auctions_match": 0.12,
     "ns_card": "Basic-Bridge",
     "status": "bba-fair"
    },
    {
     "name": "After_Partner_Takeout_Double",
     "boards": 500,
     "ns_agree": 0.6211,
     "errors_per_board": -0.43,
     "auctions_match": 0.108,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1500,
    "ns_agree": 0.6978,
    "errors_per_board": -0.425,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 78,
   "rules": 209,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/takeout-double.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.42 IMPs/board against BBA's, NS calls agreeing 70% (1500 boards)"
  },
  {
   "id": "competitive_bidding/negative_doubles",
   "name": "Negative Doubles",
   "section": "competitive",
   "level": 3,
   "summary": "After partner opens and the next player overcalls, responder's double is for takeout, usually showing the unbid major or majors, so responder can compete without a long suit or a fit.",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/negative_doubles"
   ],
   "treatments": [
    {
     "label": "Negative doubles",
     "field": "doubles.negative.play",
     "skill": "competitive_bidding/negative_doubles",
     "level": 3,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "after-interference",
     "title": "Our side once the opponents come in",
     "file": "conventions/competitive/after-interference.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.bid",
     "rules": 106,
     "tests": 83,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
    }
   ],
   "see": [
    {
     "title": "Negative Doubles",
     "by": "Larry Cohen",
     "url": "https://www.larryco.com/bridge-articles/negative-doubles"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 8
    },
    {
     "title": "Negative Doubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/353"
    }
   ],
   "scenarios": [
    {
     "name": "Negative_Double",
     "boards": 500,
     "ns_agree": 0.708,
     "errors_per_board": -0.956,
     "auctions_match": 0.128,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Negative_Free_Bid",
     "boards": 500,
     "ns_agree": 0.7516,
     "errors_per_board": -0.816,
     "auctions_match": 0.12,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7275,
    "errors_per_board": -0.886,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "negative-doubles",
     "off": [
      "doubles.negative.play=false"
     ],
     "scenarios": [
      "Negative_Double",
      "Negative_Free_Bid"
     ],
     "bba_keys": [],
     "notes": [
      "Negative_Double: 21GF-DEFAULT does not play it or leaves it unset (doubles.negative.play=None)",
      "Negative_Free_Bid: 21GF-DEFAULT does not play it or leaves it unset (doubles.negative.play=None)"
     ],
     "unmeasured": "Negative_Double: 21GF-DEFAULT does not play it or leaves it unset (doubles.negative.play=None); Negative_Free_Bid: 21GF-DEFAULT does not play it or leaves it unset (doubles.negative.play=None)",
     "repro": null,
     "status": null
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 83,
   "rules": 106,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.89 IMPs/board against BBA's, NS calls agreeing 73% (1000 boards)"
  },
  {
   "id": "competitive_bidding/advancing_overcalls",
   "name": "Responding to Overcalls",
   "section": "competitive",
   "level": 3,
   "summary": "",
   "source": "lessons",
   "members": [
    "competitive_bidding/advancing_overcalls"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "advances",
     "title": "Advancing partner's overcall",
     "file": "conventions/competitive/advances.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.bid",
     "rules": 84,
     "tests": 44,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "After_Partner_Overcalls",
     "boards": 500,
     "ns_agree": 0.5948,
     "errors_per_board": -1.49,
     "auctions_match": 0.08,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Transfer_Advances",
     "boards": 500,
     "ns_agree": 0.6878,
     "errors_per_board": 0.0,
     "auctions_match": 0.13,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.6449,
    "errors_per_board": -0.745,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 44,
   "rules": 84,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.74 IMPs/board against BBA's, NS calls agreeing 64% (1000 boards)"
  },
  {
   "id": "competitive_bidding/balancing",
   "name": "Balancing",
   "section": "competitive",
   "level": 4,
   "summary": "",
   "source": "lessons",
   "members": [
    "competitive_bidding/balancing"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "balancing",
     "title": "The balancing seat",
     "file": "conventions/competitive/balancing.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/balancing.bid",
     "rules": 10,
     "tests": 11,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/balancing.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Balancing",
     "boards": 500,
     "ns_agree": 0.6946,
     "errors_per_board": -0.97,
     "auctions_match": 0.216,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6946,
    "errors_per_board": -0.97,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 11,
   "rules": 10,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/balancing.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.97 IMPs/board against BBA's, NS calls agreeing 69% (500 boards)"
  },
  {
   "id": "competitive_bidding/defense_vs_preempts",
   "name": "Defending against Preempts",
   "section": "competitive",
   "level": 4,
   "summary": "",
   "source": "proposed",
   "members": [
    "competitive_bidding/defense_vs_preempts"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "vs-preempts",
     "title": "Defence against preempts",
     "file": "conventions/competitive/vs-preempts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.bid",
     "rules": 111,
     "tests": 38,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "We_X_Opps_Preempt",
     "boards": 500,
     "ns_agree": 0.6838,
     "errors_per_board": -1.848,
     "auctions_match": 0.308,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "We_X_Opps_Weak_2",
     "boards": 500,
     "ns_agree": 0.6485,
     "errors_per_board": -0.112,
     "auctions_match": 0.282,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Opps_Preempt",
     "boards": 500,
     "ns_agree": 0.7597,
     "errors_per_board": -1.398,
     "auctions_match": 0.23,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Opps_Weak_Two",
     "boards": 500,
     "ns_agree": 0.7689,
     "errors_per_board": -0.474,
     "auctions_match": 0.276,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.7157,
    "errors_per_board": -0.958,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 38,
   "rules": 111,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.notes.md"
   ],
   "status": "bba-fair",
   "why": "background (not isolated): errors -0.96 IMPs/board against BBA's, NS calls agreeing 72% (2000 boards)"
  },
  {
   "id": "competitive_bidding/landy",
   "name": "Landy",
   "section": "competitive",
   "level": 4,
   "summary": "Over their 1NT, 2♣ shows both majors; other overcalls are natural.",
   "source": "proposed",
   "members": [
    "competitive_bidding/landy",
    "competitive_bidding/multi_landy"
   ],
   "treatments": [
    {
     "label": "Defense vs strong 1NT: landy",
     "field": "competitive.vs_1nt_strong.system",
     "option": "landy",
     "skill": "competitive_bidding/landy",
     "level": 5,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "Defense vs strong 1NT: multi landy",
     "field": "competitive.vs_1nt_strong.system",
     "option": "multi_landy",
     "skill": "competitive_bidding/multi_landy",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Multi_Landy: +0.66 IMPs/board, NS calls agreeing 85%"
    },
    {
     "label": "Defense vs weak 1NT: landy",
     "field": "competitive.vs_1nt_weak.system",
     "option": "landy",
     "skill": "competitive_bidding/landy",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "Defense vs weak 1NT: multi landy",
     "field": "competitive.vs_1nt_weak.system",
     "option": "multi_landy",
     "skill": "competitive_bidding/multi_landy",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    }
   ],
   "modules": [
    {
     "name": "multi-landy",
     "title": "Landy and Multi-Landy over their 1NT",
     "file": "conventions/competitive/multi-landy.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/multi-landy.bid",
     "rules": 12,
     "tests": 12,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/multi-landy.notes.md"
    }
   ],
   "see": [],
   "variants": [
    {
     "id": "competitive_bidding/multi_landy",
     "name": "Landy and Multi-Landy over 1NT",
     "level": 7,
     "summary": "Over their 1NT: double shows a four-card major and a longer minor, 2♣ both majors, 2♦ one long major, and 2♥ and 2♠ that major with a minor."
    }
   ],
   "scenarios": [
    {
     "name": "Multi_Landy",
     "boards": 500,
     "ns_agree": 0.853,
     "errors_per_board": 0.662,
     "auctions_match": 0.34,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.853,
    "errors_per_board": 0.662,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "landy",
     "off": [
      "competitive.vs_1nt_strong.system=other",
      "competitive.vs_1nt_weak.system=other"
     ],
     "scenarios": [
      "Multi_Landy"
     ],
     "bba_keys": [
      "Multi-Landy"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 414,
     "changed_ours": 346,
     "changed_bba": 300,
     "rusty_gain": 6,
     "bba_gain": -150,
     "net": 156,
     "net_other": 87,
     "rusty_contract": 152,
     "rusty_doubling": -146,
     "bba_contract": 127,
     "bba_doubling": -277,
     "net_halves": [
      74,
      82
     ],
     "net_per_changed": 0.377,
     "rusty_per_changed": 0.014,
     "bba_per_changed": -0.362,
     "halves_agree": true,
     "no_rule_on": 14,
     "no_rule_off": 24
    }
   ],
   "conv_score": {
    "changed": 414,
    "changed_ours": 346,
    "changed_bba": 300,
    "rusty_gain": 6,
    "bba_gain": -150,
    "net": 156,
    "net_other": 87,
    "rusty_contract": 152,
    "rusty_doubling": -146,
    "bba_contract": 127,
    "bba_doubling": -277,
    "net_halves": [
     74,
     82
    ],
    "net_per_changed": 0.377,
    "rusty_per_changed": 0.014,
    "bba_per_changed": -0.362,
    "halves_agree": true,
    "runs": [
     "landy"
    ],
    "scenarios": [
     "Multi_Landy"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.853,
     "errors_per_board": 0.662,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 12,
   "rules": 12,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/multi-landy.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.38 IMPs per changed board (our gain +6, BBA's -150, 414 boards); background on these deals +0.66 IMPs/board, NS calls agreeing 85%"
  },
  {
   "id": "competitive_bidding/michaels_unusual",
   "name": "Michaels & Unusual 2NT",
   "section": "competitive",
   "level": 4,
   "summary": "Two-suited overcalls. A cue bid of their suit shows five-five in two other suits (over a minor, the majors; over a major, the other major and a minor); a jump to 2NT shows the two lowest unbid suits.",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/michaels_unusual",
    "competitive_bidding/leaping_michaels",
    "competitive_bidding/non_leaping_michaels"
   ],
   "treatments": [
    {
     "label": "Direct jump cuebid over a major: gambling",
     "field": "competitive.direct_jump_cuebid_major",
     "option": "gambling",
     "level": null,
     "status": "tested",
     "why": "a rule plays this"
    },
    {
     "label": "Direct jump cuebid over a major: minor",
     "field": "competitive.direct_jump_cuebid_major",
     "option": "minor",
     "level": null,
     "status": "tested",
     "why": "a rule plays this"
    },
    {
     "label": "Direct jump cuebid over a major: strong",
     "field": "competitive.direct_jump_cuebid_major",
     "option": "strong",
     "level": null,
     "status": "tested",
     "why": "a rule plays this"
    },
    {
     "label": "Direct jump cuebid over a minor: gambling",
     "field": "competitive.direct_jump_cuebid_minor",
     "option": "gambling",
     "level": null,
     "status": "tested",
     "why": "a rule plays this"
    },
    {
     "label": "Direct jump cuebid over a minor: majors",
     "field": "competitive.direct_jump_cuebid_minor",
     "option": "majors",
     "level": null,
     "status": "tested",
     "why": "a rule plays this"
    },
    {
     "label": "Direct jump cuebid over a minor: preempt",
     "field": "competitive.direct_jump_cuebid_minor",
     "option": "preempt",
     "level": null,
     "status": "tested",
     "why": "a rule plays this"
    },
    {
     "label": "Cue of 1♥/1♠: Michaels (the other major and a minor)",
     "field": "direct_cuebids.nat_majors_michaels",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "bba-fair",
     "why": "vs BBA in Michaels_Cuebid, Michaels_and_Unusual, Unusual_2N, Leaping_Michaels, Non_Leaping_Michaels_After_2-Bid: -0.96 IMPs/board, NS calls agreeing 76%"
    },
    {
     "label": "Cue of a natural 1♣/1♦: Michaels (both majors)",
     "field": "direct_cuebids.nat_minors_michaels",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "bba-fair",
     "why": "vs BBA in Michaels_Cuebid, Michaels_and_Unusual, Unusual_2N, Leaping_Michaels, Non_Leaping_Michaels_After_2-Bid: -0.96 IMPs/board, NS calls agreeing 76%"
    },
    {
     "label": "Cue of a possibly short 1♣/1♦: Michaels",
     "field": "direct_cuebids.quasi_michaels",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Cue of an artificial 1♣/1♦: Michaels",
     "field": "direct_cuebids.art_michaels",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Jump 2NT = two lowest unbid",
     "field": "nt_overcalls.jump_2nt_lowest_unbid",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Michaels cuebid",
     "field": "competitive.michaels.play",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Unusual 2NT",
     "field": "competitive.unusual_2nt.play",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 4,
     "status": "bba-fair",
     "why": "vs BBA in Michaels_Cuebid, Michaels_and_Unusual, Unusual_2N, Leaping_Michaels, Non_Leaping_Michaels_After_2-Bid: -0.96 IMPs/board, NS calls agreeing 76%"
    },
    {
     "label": "Unusual 4NT",
     "field": "competitive.unusual_4nt.play",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Michaels_Cuebid, Michaels_and_Unusual, Unusual_2N, Leaping_Michaels, Non_Leaping_Michaels_After_2-Bid: -0.96 IMPs/board, NS calls agreeing 76%"
    },
    {
     "label": "Unusual 1NT",
     "field": "competitive.unusual_1nt.play",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 6,
     "status": "ab-gains",
     "why": "self A/B unusual-1nt: gains (339 boards changed)"
    },
    {
     "label": "Unusual 3NT",
     "field": "competitive.unusual_3nt.play",
     "skill": "competitive_bidding/michaels_unusual",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Leaping Michaels",
     "field": "competitive.leaping_michaels.play",
     "skill": "competitive_bidding/leaping_michaels",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Non-leaping Michaels",
     "field": "competitive.non_leaping_michaels.play",
     "skill": "competitive_bidding/non_leaping_michaels",
     "level": 8,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "two-suited-overcalls",
     "title": "Michaels cue bids and the Unusual 2NT",
     "file": "conventions/competitive/two-suited-overcalls.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/two-suited-overcalls.bid",
     "rules": 241,
     "tests": 61,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/two-suited-overcalls.notes.md"
    }
   ],
   "see": [
    {
     "title": "Michaels Cuebid",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/michaels_cuebid.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 17
    },
    {
     "title": "Competitive Bidding: Michaels Cuebid",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/480"
    },
    {
     "title": "Competitive Bidding: Unusual 2NT",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/481"
    }
   ],
   "variants": [
    {
     "id": "competitive_bidding/leaping_michaels",
     "name": "Leaping Michaels",
     "level": 7,
     "summary": "Over their weak two, a jump to four of a minor shows that minor and the other major (or both majors over a minor), five-five with game values."
    },
    {
     "id": "competitive_bidding/non_leaping_michaels",
     "name": "Non-leaping Michaels",
     "level": 8,
     "summary": "Played instead of Leaping Michaels: over their preempt, a non-jump bid of a new suit at the next level shows that suit and a major."
    }
   ],
   "scenarios": [
    {
     "name": "Michaels_Cuebid",
     "boards": 500,
     "ns_agree": 0.7591,
     "errors_per_board": -1.456,
     "auctions_match": 0.08,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Michaels_and_Unusual",
     "boards": 500,
     "ns_agree": 0.8156,
     "errors_per_board": -0.54,
     "auctions_match": 0.084,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    },
    {
     "name": "Unusual_2N",
     "boards": 500,
     "ns_agree": 0.8574,
     "errors_per_board": -1.306,
     "auctions_match": 0.18,
     "ns_card": "21GF-GIB",
     "status": "bba-poor"
    },
    {
     "name": "Leaping_Michaels",
     "boards": 500,
     "ns_agree": 0.5797,
     "errors_per_board": -1.288,
     "auctions_match": 0.188,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    },
    {
     "name": "Non_Leaping_Michaels_After_2-Bid",
     "boards": 500,
     "ns_agree": 0.7943,
     "errors_per_board": -0.236,
     "auctions_match": 0.244,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2500,
    "ns_agree": 0.763,
    "errors_per_board": -0.965,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "unusual-1nt",
     "scenarios": [
      "GIB_Sandwich_NT_BPH"
     ],
     "side": "both",
     "changed": 339,
     "verdict": "gains",
     "z": 6.8,
     "actor_contract": 26,
     "actor_doubling": 285,
     "status": "ab-gains",
     "changes": {
      "competitive.unusual_1nt.play": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "michaels",
     "off": [
      "competitive.michaels.play=false",
      "direct_cuebids.nat_majors_michaels=false",
      "direct_cuebids.nat_minors_michaels=false"
     ],
     "scenarios": [
      "Michaels_Cuebid",
      "Michaels_and_Unusual"
     ],
     "bba_keys": [
      "Michaels Cuebid"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-fair",
     "changed": 719,
     "changed_ours": 702,
     "changed_bba": 608,
     "rusty_gain": 210,
     "bba_gain": 315,
     "net": -105,
     "net_other": -534,
     "rusty_contract": 175,
     "rusty_doubling": 35,
     "bba_contract": 198,
     "bba_doubling": 117,
     "net_halves": [
      -60,
      -45
     ],
     "net_per_changed": -0.146,
     "rusty_per_changed": 0.292,
     "bba_per_changed": 0.438,
     "halves_agree": true,
     "no_rule_on": 65,
     "no_rule_off": 49
    },
    {
     "name": "unusual-2nt",
     "off": [
      "competitive.unusual_2nt.play=false"
     ],
     "scenarios": [
      "Unusual_2N",
      "Michaels_and_Unusual"
     ],
     "bba_keys": [
      "Unusual 2NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-poor",
     "changed": 652,
     "changed_ours": 635,
     "changed_bba": 647,
     "rusty_gain": -158,
     "bba_gain": 339,
     "net": -497,
     "net_other": -299,
     "rusty_contract": 92,
     "rusty_doubling": -250,
     "bba_contract": 248,
     "bba_doubling": 91,
     "net_halves": [
      -238,
      -259
     ],
     "net_per_changed": -0.762,
     "rusty_per_changed": -0.242,
     "bba_per_changed": 0.52,
     "halves_agree": true,
     "no_rule_on": 107,
     "no_rule_off": 76
    }
   ],
   "conv_score": {
    "changed": 1371,
    "changed_ours": 1337,
    "changed_bba": 1255,
    "rusty_gain": 52,
    "bba_gain": 654,
    "net": -602,
    "net_other": -833,
    "rusty_contract": 267,
    "rusty_doubling": -215,
    "bba_contract": 446,
    "bba_doubling": 208,
    "net_halves": [
     -298,
     -304
    ],
    "net_per_changed": -0.439,
    "rusty_per_changed": 0.038,
    "bba_per_changed": 0.477,
    "halves_agree": true,
    "runs": [
     "michaels",
     "unusual-2nt"
    ],
    "scenarios": [
     "Michaels_Cuebid",
     "Michaels_and_Unusual",
     "Unusual_2N"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 1500,
     "ns_agree": 0.8084,
     "errors_per_board": -1.101,
     "status": "bba-poor"
    }
   },
   "partial": "Direct jump cue bids: over a major the `minor` option and the strong variety's continuations are not written.",
   "tests": 61,
   "rules": 241,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/two-suited-overcalls.notes.md"
   ],
   "status": "partial",
   "why": "Direct jump cue bids: over a major the `minor` option and the strong variety's continuations are not written."
  },
  {
   "id": "competitive_bidding/support_cuebids",
   "name": "Support Cuebids",
   "section": "competitive",
   "level": 4,
   "summary": "A cue bid of the opponents' suit in response to partner's opening or overcall shows a raise of partner's suit with limit-raise values or better, leaving direct raises weaker.",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/support_cuebids"
   ],
   "treatments": [
    {
     "label": "Cue-bid raise",
     "field": "competitive.cue_bid_raise.play",
     "skill": "competitive_bidding/support_cuebids",
     "level": 4,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Support cuebid",
     "field": "overcalls.responses.support_cuebid",
     "skill": "competitive_bidding/support_cuebids",
     "level": 4,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "advances",
     "title": "Advancing partner's overcall",
     "file": "conventions/competitive/advances.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.bid",
     "rules": 84,
     "tests": 44,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md"
    },
    {
     "name": "after-interference",
     "title": "Our side once the opponents come in",
     "file": "conventions/competitive/after-interference.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.bid",
     "rules": 106,
     "tests": 83,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 15
    },
    {
     "title": "Constructive Bidding Opposite 3rd Hand Openings: Cuebid as Limit Raise+ by a Passed Hand",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/116"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 127,
   "rules": 190,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/advances.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/after-interference.notes.md"
   ],
   "status": "tested",
   "why": "127 test cases; no corpus or A/B measure"
  },
  {
   "id": "competitive_bidding/law_of_total_tricks",
   "name": "The Law of Total Tricks",
   "section": "competitive",
   "level": 4,
   "summary": "",
   "source": "proposed",
   "members": [
    "competitive_bidding/law_of_total_tricks"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "total-tricks",
     "title": "The Law of Total Tricks",
     "file": "conventions/competitive/total-tricks.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/total-tricks.bid",
     "rules": 3,
     "tests": 7,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/total-tricks.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 7,
   "rules": 3,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/total-tricks.notes.md"
   ],
   "status": "tested",
   "why": "7 test cases; no corpus or A/B measure"
  },
  {
   "id": "competitive_bidding/cappelletti",
   "name": "Cappelletti over 1NT",
   "section": "competitive",
   "level": 5,
   "summary": "Over their 1NT: double is for penalty, 2♣ shows a one-suited hand, 2♦ both majors, 2♥ and 2♠ that major and a minor, 2NT both minors.",
   "source": "proposed",
   "members": [
    "competitive_bidding/cappelletti",
    "competitive_bidding/modified_cappelletti"
   ],
   "treatments": [
    {
     "label": "Defense vs strong 1NT: cappelletti",
     "field": "competitive.vs_1nt_strong.system",
     "option": "cappelletti",
     "skill": "competitive_bidding/cappelletti",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Cappelletti, Cappelletti_in_4th: -0.19 IMPs/board, NS calls agreeing 83%"
    },
    {
     "label": "Defense vs strong 1NT: modified cappelletti",
     "field": "competitive.vs_1nt_strong.system",
     "option": "modified_cappelletti",
     "skill": "competitive_bidding/modified_cappelletti",
     "level": 5,
     "status": "tested",
     "why": "a rule plays this option"
    },
    {
     "label": "Defense vs weak 1NT: cappelletti",
     "field": "competitive.vs_1nt_weak.system",
     "option": "cappelletti",
     "skill": "competitive_bidding/cappelletti",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    },
    {
     "label": "Defense vs weak 1NT: modified cappelletti",
     "field": "competitive.vs_1nt_weak.system",
     "option": "modified_cappelletti",
     "skill": "competitive_bidding/modified_cappelletti",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    }
   ],
   "modules": [
    {
     "name": "cappelletti",
     "title": "Cappelletti and Modified Cappelletti over their 1NT",
     "file": "conventions/competitive/cappelletti.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/cappelletti.bid",
     "rules": 22,
     "tests": 28,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/cappelletti.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 1
    }
   ],
   "variants": [
    {
     "id": "competitive_bidding/modified_cappelletti",
     "name": "Modified Cappelletti",
     "level": 6,
     "summary": "Played instead of Cappelletti: over their 1NT, 2♣ shows a one-suited minor or a major and a minor, and 2♥ and 2♠ are natural one-suiters."
    }
   ],
   "scenarios": [
    {
     "name": "Cappelletti",
     "boards": 500,
     "ns_agree": 0.8515,
     "errors_per_board": 0.166,
     "auctions_match": 0.302,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    },
    {
     "name": "Cappelletti_in_4th",
     "boards": 500,
     "ns_agree": 0.8164,
     "errors_per_board": -0.538,
     "auctions_match": 0.298,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.8347,
    "errors_per_board": -0.186,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "cappelletti",
     "off": [
      "competitive.vs_1nt_strong.system=other",
      "competitive.vs_1nt_weak.system=other"
     ],
     "scenarios": [
      "Cappelletti",
      "Cappelletti_in_4th"
     ],
     "bba_keys": [
      "Cappelletti"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 805,
     "changed_ours": 739,
     "changed_bba": 614,
     "rusty_gain": 420,
     "bba_gain": 170,
     "net": 250,
     "net_other": -246,
     "rusty_contract": -525,
     "rusty_doubling": 945,
     "bba_contract": -92,
     "bba_doubling": 262,
     "net_halves": [
      158,
      92
     ],
     "net_per_changed": 0.311,
     "rusty_per_changed": 0.522,
     "bba_per_changed": 0.211,
     "halves_agree": true,
     "no_rule_on": 11,
     "no_rule_off": 21
    }
   ],
   "conv_score": {
    "changed": 805,
    "changed_ours": 739,
    "changed_bba": 614,
    "rusty_gain": 420,
    "bba_gain": 170,
    "net": 250,
    "net_other": -246,
    "rusty_contract": -525,
    "rusty_doubling": 945,
    "bba_contract": -92,
    "bba_doubling": 262,
    "net_halves": [
     158,
     92
    ],
    "net_per_changed": 0.311,
    "rusty_per_changed": 0.522,
    "bba_per_changed": 0.211,
    "halves_agree": true,
    "runs": [
     "cappelletti"
    ],
    "scenarios": [
     "Cappelletti",
     "Cappelletti_in_4th"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.8347,
     "errors_per_board": -0.186,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 28,
   "rules": 22,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/cappelletti.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.31 IMPs per changed board (our gain +420, BBA's +170, 805 boards); background on these deals -0.19 IMPs/board, NS calls agreeing 83%"
  },
  {
   "id": "competitive_bidding/defense_vs_1nt",
   "name": "Defending against 1NT",
   "section": "competitive",
   "level": 5,
   "summary": "An agreement on what overcalls and doubles of the opponents' 1NT mean, usually a system that shows two-suited hands at the two level. The card names which one, against strong and weak notrumps.",
   "source": "proposed",
   "members": [
    "competitive_bidding/defense_vs_1nt"
   ],
   "treatments": [],
   "modules": [
    {
     "name": "cappelletti",
     "title": "Cappelletti and Modified Cappelletti over their 1NT",
     "file": "conventions/competitive/cappelletti.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/cappelletti.bid",
     "rules": 22,
     "tests": 28,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/cappelletti.notes.md"
    },
    {
     "name": "dont",
     "title": "DONT over their 1NT",
     "file": "conventions/competitive/dont.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/dont.bid",
     "rules": 12,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/dont.notes.md"
    },
    {
     "name": "meckwell",
     "title": "Meckwell over their 1NT",
     "file": "conventions/competitive/meckwell.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/meckwell.bid",
     "rules": 10,
     "tests": 16,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/meckwell.notes.md"
    },
    {
     "name": "multi-landy",
     "title": "Landy and Multi-Landy over their 1NT",
     "file": "conventions/competitive/multi-landy.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/multi-landy.bid",
     "rules": 12,
     "tests": 12,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/multi-landy.notes.md"
    },
    {
     "name": "suction",
     "title": "Suction over their 1NT",
     "file": "conventions/competitive/suction.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/suction.bid",
     "rules": 16,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/suction.notes.md"
    },
    {
     "name": "vs-1nt",
     "title": "Over their 1NT: what every defence shares",
     "file": "conventions/competitive/vs-1nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-1nt.bid",
     "rules": 47,
     "tests": 16,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-1nt.notes.md"
    }
   ],
   "see": [],
   "scenarios": [
    {
     "name": "Opps_Open_1N_15-17",
     "boards": 500,
     "ns_agree": 0.9373,
     "errors_per_board": 0.17,
     "auctions_match": 0.408,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.9373,
    "errors_per_board": 0.17,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 114,
   "rules": 119,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/cappelletti.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/dont.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/meckwell.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/multi-landy.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/suction.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-1nt.notes.md"
   ],
   "status": "bba-good",
   "why": "background (not isolated): errors +0.17 IMPs/board against BBA's, NS calls agreeing 94% (500 boards)"
  },
  {
   "id": "competitive_bidding/dont",
   "name": "DONT",
   "section": "competitive",
   "level": 5,
   "summary": "Over their strong 1NT: double shows one long suit (partner relays 2♣); 2♣ and 2♦ show that suit and a higher one; 2♥ both majors; 2♠ six or more spades.",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/dont"
   ],
   "treatments": [
    {
     "label": "DONT",
     "field": "competitive.dont.play",
     "skill": "competitive_bidding/dont",
     "level": 5,
     "status": "tested",
     "why": "a rule reads this field"
    },
    {
     "label": "Defense vs strong 1NT: dont",
     "field": "competitive.vs_1nt_strong.system",
     "option": "dont",
     "skill": "competitive_bidding/dont",
     "level": 5,
     "status": "ab-gains",
     "why": "self A/B dont: leans gain (330 boards changed)"
    },
    {
     "label": "Defense vs weak 1NT: dont",
     "field": "competitive.vs_1nt_weak.system",
     "option": "dont",
     "skill": "competitive_bidding/dont",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    }
   ],
   "modules": [
    {
     "name": "dont",
     "title": "DONT over their 1NT",
     "file": "conventions/competitive/dont.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/dont.bid",
     "rules": 12,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/dont.notes.md"
    }
   ],
   "see": [
    {
     "title": "DONT",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/dont.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 18
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 7
    },
    {
     "title": "NT Bidding: DONT and Meckwell",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/541"
    }
   ],
   "scenarios": [
    {
     "name": "DONT",
     "boards": 500,
     "ns_agree": 0.8447,
     "errors_per_board": 0.0,
     "auctions_match": 0.3,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8447,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "dont",
     "scenarios": [
      "DONT"
     ],
     "side": "both",
     "changed": 330,
     "verdict": "leans gain",
     "z": 1.3,
     "actor_contract": 161,
     "actor_doubling": -86,
     "status": "ab-gains",
     "changes": {
      "competitive.vs_1nt_strong.system": "dont"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 21,
   "rules": 12,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/dont.notes.md"
   ],
   "status": "ab-gains",
   "why": "self A/B dont: leans gain (330 boards changed)"
  },
  {
   "id": "competitive_bidding/jordan_2nt",
   "name": "Jordan 2NT",
   "section": "competitive",
   "level": 5,
   "summary": "After partner's opening is doubled for takeout, responder's 2NT shows a limit raise or better in partner's suit, leaving the direct raises weak.",
   "source": "proposed",
   "members": [
    "competitive_bidding/jordan_2nt"
   ],
   "treatments": [
    {
     "label": "Jordan (Truscott) 2NT",
     "field": "competitive.jordan_2nt.play",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 5,
     "status": "bba-good",
     "why": "vs BBA in Jordan_2N: +0.05 IMPs/board, NS calls agreeing 78%"
    },
    {
     "label": "Vs takeout double: 2NT raise of a major",
     "field": "vs_to_double.two_nt_raise_majors.play",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Vs takeout double: 2NT raise of a major, limit",
     "field": "vs_to_double.two_nt_raise_majors.limit",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 5,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Vs takeout double: 2NT raise of a minor",
     "field": "vs_to_double.two_nt_raise_minors.play",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Vs takeout double: 2NT raise of a minor, limit",
     "field": "vs_to_double.two_nt_raise_minors.limit",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Vs takeout double: 2NT raise of a minor, limit or better",
     "field": "vs_to_double.two_nt_raise_minors.limit_plus",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 6,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Vs takeout double: 2NT raise of a major, weak",
     "field": "vs_to_double.two_nt_raise_majors.weak",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 7,
     "status": "gap",
     "why": "no rule reads this field"
    },
    {
     "label": "Vs takeout double: 2NT raise of a minor, weak",
     "field": "vs_to_double.two_nt_raise_minors.weak",
     "skill": "competitive_bidding/jordan_2nt",
     "level": 7,
     "status": "gap",
     "why": "no rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "vs-takeout-double",
     "title": "Raises over their takeout double: Jordan 2NT and BROMAD",
     "file": "conventions/competitive/vs-takeout-double.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.bid",
     "rules": 18,
     "tests": 19,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.notes.md"
    }
   ],
   "see": [
    {
     "title": "Jordan 2NT",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/jordan_2nt.php"
    }
   ],
   "scenarios": [
    {
     "name": "Jordan_2N",
     "boards": 500,
     "ns_agree": 0.78,
     "errors_per_board": 0.05,
     "auctions_match": 0.254,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.78,
    "errors_per_board": 0.05,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "jordan-2nt",
     "off": [
      "competitive.jordan_2nt.play=false"
     ],
     "scenarios": [
      "Jordan_2N"
     ],
     "bba_keys": [
      "Jordan Truscott 2NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 455,
     "changed_ours": 326,
     "changed_bba": 391,
     "rusty_gain": 428,
     "bba_gain": 50,
     "net": 378,
     "net_other": -203,
     "rusty_contract": 407,
     "rusty_doubling": 21,
     "bba_contract": 39,
     "bba_doubling": 11,
     "net_halves": [
      118,
      260
     ],
     "net_per_changed": 0.831,
     "rusty_per_changed": 0.941,
     "bba_per_changed": 0.11,
     "halves_agree": true,
     "no_rule_on": 2,
     "no_rule_off": 3
    }
   ],
   "conv_score": {
    "changed": 455,
    "changed_ours": 326,
    "changed_bba": 391,
    "rusty_gain": 428,
    "bba_gain": 50,
    "net": 378,
    "net_other": -203,
    "rusty_contract": 407,
    "rusty_doubling": 21,
    "bba_contract": 39,
    "bba_doubling": 11,
    "net_halves": [
     118,
     260
    ],
    "net_per_changed": 0.831,
    "rusty_per_changed": 0.941,
    "bba_per_changed": 0.11,
    "halves_agree": true,
    "runs": [
     "jordan-2nt"
    ],
    "scenarios": [
     "Jordan_2N"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.78,
     "errors_per_board": 0.05,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 19,
   "rules": 18,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.83 IMPs per changed board (our gain +428, BBA's +50, 455 boards); background on these deals +0.05 IMPs/board, NS calls agreeing 78%"
  },
  {
   "id": "competitive_bidding/lead_directing_doubles",
   "name": "Lead-directing doubles",
   "section": "competitive",
   "level": 5,
   "summary": "A double of an artificial bid (a cue bid, Stayman, a transfer, a response to an ace ask) or of a slam asks partner to lead that suit, or a specific unusual suit.",
   "source": "proposed",
   "members": [
    "competitive_bidding/lead_directing_doubles",
    "competitive_bidding/anti_lead_directing_doubles"
   ],
   "treatments": [
    {
     "label": "Lead-directing doubles",
     "field": "competitive.lead_directing_double.play",
     "skill": "competitive_bidding/lead_directing_doubles",
     "level": 5,
     "status": "ab-neutral",
     "why": "self A/B lead-directing-doubles: neutral (196 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "lead-directing-doubles",
     "title": "Lead-directing doubles of artificial bids",
     "file": "conventions/competitive/lead-directing-doubles.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/lead-directing-doubles.bid",
     "rules": 2,
     "tests": 6,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/lead-directing-doubles.notes.md"
    }
   ],
   "see": [
    {
     "title": "Lead Directing Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/lead_directing_double.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 24
    },
    {
     "title": "Lead-Directing Doubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/467"
    }
   ],
   "variants": [
    {
     "id": "competitive_bidding/anti_lead_directing_doubles",
     "name": "Anti-lead-directing doubles",
     "level": 9,
     "summary": "When a lead-directing double of an artificial bid is expected, a double asks partner not to lead that suit, and a pass says nothing."
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "lead-directing-doubles",
     "scenarios": [
      "Lead_Directing_Double"
     ],
     "side": "both",
     "changed": 196,
     "verdict": "neutral",
     "z": -0.1,
     "actor_contract": -22,
     "actor_doubling": 19,
     "status": "ab-neutral",
     "changes": {
      "competitive.lead_directing_double.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": "No Lightner double and no doubles of their cue bids; the engine does not choose leads, so the compare cannot show the gain.",
   "tests": 6,
   "rules": 2,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/lead-directing-doubles.notes.md"
   ],
   "status": "partial",
   "why": "No Lightner double and no doubles of their cue bids; the engine does not choose leads, so the compare cannot show the gain."
  },
  {
   "id": "competitive_bidding/lebensohl",
   "name": "Lebensohl",
   "section": "competitive",
   "level": 5,
   "summary": "When they overcall partner's 1NT, responder's 2NT is a relay to 3♣: the two- step route shows a weaker or different hand from a direct bid, and whether responder cue-bids fast or slow tells whether a stopper is held.",
   "source": "taxonomy",
   "members": [
    "competitive_bidding/lebensohl",
    "competitive_bidding/rubensohl"
   ],
   "treatments": [
    {
     "label": "Lebensohl over interference to 1NT",
     "field": "notrump.lebensohl.over_interference",
     "skill": "competitive_bidding/lebensohl",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Lebensohl, Lebensohl2, Lebensohl_vs_Opps_W2_Bal, Lebensohl_vs_Opps_W2_Dir: -0.28 IMPs/board, NS calls agreeing 75%"
    },
    {
     "label": "Lebensohl after doubling a weak two",
     "field": "competitive.lebensohl_weak_twos.play",
     "skill": "competitive_bidding/lebensohl",
     "level": 7,
     "status": "bba-fair",
     "why": "vs BBA in Lebensohl, Lebensohl2, Lebensohl_vs_Opps_W2_Bal, Lebensohl_vs_Opps_W2_Dir: -0.28 IMPs/board, NS calls agreeing 75%"
    },
    {
     "label": "Rubensohl after doubling a weak two",
     "field": "competitive.rubensohl_after_double.play",
     "skill": "competitive_bidding/rubensohl",
     "level": 9,
     "status": "ab-gains",
     "why": "self A/B rubensohl-vs-lebensohl-x: leans gain (743 boards changed)"
    },
    {
     "label": "Rubensohl over interference to 1NT",
     "field": "notrump.rubensohl.over_interference",
     "skill": "competitive_bidding/rubensohl",
     "level": 9,
     "status": "ab-neutral",
     "why": "self A/B rubensohl-vs-lebensohl-nt: neutral (258 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "rubensohl",
     "title": "Rubensohl: transfers after interference over 1NT and after doubling a weak two",
     "file": "conventions/competitive/rubensohl.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/rubensohl.bid",
     "rules": 100,
     "tests": 25,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/rubensohl.notes.md"
    },
    {
     "name": "vs-preempts",
     "title": "Defence against preempts",
     "file": "conventions/competitive/vs-preempts.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.bid",
     "rules": 111,
     "tests": 38,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.notes.md"
    },
    {
     "name": "lebensohl",
     "title": "Lebensohl after they overcall our 1NT",
     "file": "conventions/notrump/lebensohl.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/lebensohl.bid",
     "rules": 36,
     "tests": 30,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/lebensohl.notes.md"
    }
   ],
   "see": [
    {
     "title": "Lebensohl",
     "by": "Larry Cohen",
     "url": "https://www.larryco.com/bridge-articles/lebensohl"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 25
    },
    {
     "title": "NT Bidding: Responding to 1NT in Competition - Lebensohl",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/545"
    }
   ],
   "variants": [
    {
     "id": "competitive_bidding/rubensohl",
     "name": "Rubensohl",
     "level": 9,
     "summary": "A transfer version of Lebensohl: after they overcall partner's 1NT, responder's bids from 2NT up are transfers to the next suit, which lets responder show a suit, a stopper or values at a lower level."
    }
   ],
   "scenarios": [
    {
     "name": "Lebensohl",
     "boards": 500,
     "ns_agree": 0.7302,
     "errors_per_board": -0.124,
     "auctions_match": 0.25,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-good"
    },
    {
     "name": "Lebensohl2",
     "boards": 500,
     "ns_agree": 0.7795,
     "errors_per_board": -0.094,
     "auctions_match": 0.266,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-good"
    },
    {
     "name": "Lebensohl_vs_Opps_W2_Bal",
     "boards": 500,
     "ns_agree": 0.7957,
     "errors_per_board": -0.118,
     "auctions_match": 0.406,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    },
    {
     "name": "Lebensohl_vs_Opps_W2_Dir",
     "boards": 500,
     "ns_agree": 0.6945,
     "errors_per_board": -0.774,
     "auctions_match": 0.338,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 2000,
    "ns_agree": 0.7527,
    "errors_per_board": -0.278,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "rubensohl-vs-lebensohl-nt",
     "scenarios": [
      "Lebensohl",
      "Lebensohl2"
     ],
     "side": "both",
     "changed": 258,
     "verdict": "neutral",
     "z": -0.9,
     "actor_contract": -44,
     "actor_doubling": -12,
     "status": "ab-neutral",
     "changes": {
      "notrump.rubensohl.over_interference": "true"
     }
    },
    {
     "name": "rubensohl-vs-lebensohl-x",
     "scenarios": [
      "Lebensohl_vs_Opps_W2_Bal",
      "Lebensohl_vs_Opps_W2_Dir",
      "Lebensohl_vs_Opps_W2_Bal_or_Dir"
     ],
     "side": "both",
     "changed": 743,
     "verdict": "leans gain",
     "z": 1.0,
     "actor_contract": 182,
     "actor_doubling": -46,
     "status": "ab-gains",
     "changes": {
      "competitive.rubensohl_after_double.play": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "lebensohl-nt",
     "off": [
      "notrump.lebensohl.over_interference=false"
     ],
     "scenarios": [
      "Lebensohl",
      "Lebensohl2"
     ],
     "bba_keys": [
      "Lebensohl after 1NT"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 224,
     "changed_ours": 145,
     "changed_bba": 111,
     "rusty_gain": 58,
     "bba_gain": 42,
     "net": 16,
     "net_other": 33,
     "rusty_contract": -90,
     "rusty_doubling": 148,
     "bba_contract": -23,
     "bba_doubling": 65,
     "net_halves": [
      -44,
      60
     ],
     "net_per_changed": 0.071,
     "rusty_per_changed": 0.259,
     "bba_per_changed": 0.188,
     "halves_agree": false,
     "no_rule_on": 17,
     "no_rule_off": 10
    },
    {
     "name": "lebensohl-weak-twos",
     "off": [
      "competitive.lebensohl_weak_twos.play=false"
     ],
     "scenarios": [
      "Lebensohl_vs_Opps_W2_Bal",
      "Lebensohl_vs_Opps_W2_Dir"
     ],
     "bba_keys": [
      "Lebensohl after double"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-poor",
     "changed": 556,
     "changed_ours": 422,
     "changed_bba": 413,
     "rusty_gain": -79,
     "bba_gain": 293,
     "net": -372,
     "net_other": 24,
     "rusty_contract": -79,
     "rusty_doubling": 0,
     "bba_contract": 308,
     "bba_doubling": -15,
     "net_halves": [
      -131,
      -241
     ],
     "net_per_changed": -0.669,
     "rusty_per_changed": -0.142,
     "bba_per_changed": 0.527,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 780,
    "changed_ours": 567,
    "changed_bba": 524,
    "rusty_gain": -21,
    "bba_gain": 335,
    "net": -356,
    "net_other": 57,
    "rusty_contract": -169,
    "rusty_doubling": 148,
    "bba_contract": 285,
    "bba_doubling": 50,
    "net_halves": [
     -175,
     -181
    ],
    "net_per_changed": -0.456,
    "rusty_per_changed": -0.027,
    "bba_per_changed": 0.429,
    "halves_agree": true,
    "runs": [
     "lebensohl-nt",
     "lebensohl-weak-twos"
    ],
    "scenarios": [
     "Lebensohl",
     "Lebensohl2",
     "Lebensohl_vs_Opps_W2_Bal",
     "Lebensohl_vs_Opps_W2_Dir"
    ],
    "status": "conv-fair",
    "background": {
     "boards": 2000,
     "ns_agree": 0.7527,
     "errors_per_board": -0.278,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 93,
   "rules": 247,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/rubensohl.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-preempts.notes.md",
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/notrump/lebensohl.notes.md"
   ],
   "status": "conv-fair",
   "background": "bba-fair",
   "why": "convention score -0.46 IMPs per changed board (our gain -21, BBA's +335, 780 boards); background on these deals -0.28 IMPs/board, NS calls agreeing 75%"
  },
  {
   "id": "competitive_bidding/meckwell",
   "name": "Meckwell over 1NT",
   "section": "competitive",
   "level": 5,
   "summary": "Over their 1NT: double shows a one-suited minor or both majors; 2♣ and 2♦ show that minor and a major; 2♥ and 2♠ are natural; 2NT shows both minors.",
   "source": "proposed",
   "members": [
    "competitive_bidding/meckwell"
   ],
   "treatments": [
    {
     "label": "Defense vs strong 1NT: meckwell",
     "field": "competitive.vs_1nt_strong.system",
     "option": "meckwell",
     "skill": "competitive_bidding/meckwell",
     "level": 5,
     "status": "ab-neutral",
     "why": "self A/B meckwell: neutral (367 boards changed)"
    },
    {
     "label": "Defense vs weak 1NT: meckwell",
     "field": "competitive.vs_1nt_weak.system",
     "option": "meckwell",
     "skill": "competitive_bidding/meckwell",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    }
   ],
   "modules": [
    {
     "name": "meckwell",
     "title": "Meckwell over their 1NT",
     "file": "conventions/competitive/meckwell.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/meckwell.bid",
     "rules": 10,
     "tests": 16,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/meckwell.notes.md"
    }
   ],
   "see": [
    {
     "title": "Meckwell Defense to 1NT",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/meckwell_defense_to_1nt.php"
    },
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 19
    },
    {
     "title": "NT Bidding: DONT and Meckwell",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/541"
    }
   ],
   "scenarios": [
    {
     "name": "Meckwell",
     "boards": 500,
     "ns_agree": 0.8017,
     "errors_per_board": -0.098,
     "auctions_match": 0.23,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8017,
    "errors_per_board": -0.098,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "meckwell",
     "scenarios": [
      "Meckwell"
     ],
     "side": "both",
     "changed": 367,
     "verdict": "neutral",
     "z": -0.1,
     "actor_contract": -79,
     "actor_doubling": 76,
     "status": "ab-neutral",
     "changes": {
      "competitive.vs_1nt_strong.system": "meckwell"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 16,
   "rules": 10,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/meckwell.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B meckwell: neutral (367 boards changed)"
  },
  {
   "id": "competitive_bidding/responsive_doubles",
   "name": "Responsive Doubles",
   "section": "competitive",
   "level": 5,
   "summary": "After partner doubles for takeout and the next player raises, advancer's double is for takeout too, showing values and usually both unbid suits of a kind (the majors or the minors).",
   "source": "proposed",
   "members": [
    "competitive_bidding/responsive_doubles"
   ],
   "treatments": [
    {
     "label": "Responsive doubles",
     "field": "doubles.responsive.play",
     "skill": "competitive_bidding/responsive_doubles",
     "level": 5,
     "status": "bba-fair",
     "why": "vs BBA in Responsive_Double, Responsive_Double_after_Overcall: -0.26 IMPs/board, NS calls agreeing 77%"
    }
   ],
   "modules": [
    {
     "name": "responsive-doubles",
     "title": "Responsive doubles",
     "file": "conventions/competitive/responsive-doubles.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/responsive-doubles.bid",
     "rules": 12,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/responsive-doubles.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 23
    },
    {
     "title": "Responsive Doubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/354"
    }
   ],
   "scenarios": [
    {
     "name": "Responsive_Double",
     "boards": 500,
     "ns_agree": 0.7986,
     "errors_per_board": -0.352,
     "auctions_match": 0.042,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    },
    {
     "name": "Responsive_Double_after_Overcall",
     "boards": 500,
     "ns_agree": 0.7463,
     "errors_per_board": -0.164,
     "auctions_match": 0.26,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7735,
    "errors_per_board": -0.258,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [
    {
     "name": "responsive-doubles",
     "off": [
      "doubles.responsive.play=false"
     ],
     "scenarios": [
      "Responsive_Double",
      "Responsive_Double_after_Overcall"
     ],
     "bba_keys": [
      "Responsive double"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 325,
     "changed_ours": 173,
     "changed_bba": 244,
     "rusty_gain": 76,
     "bba_gain": -6,
     "net": 82,
     "net_other": -211,
     "rusty_contract": 114,
     "rusty_doubling": -38,
     "bba_contract": -18,
     "bba_doubling": 12,
     "net_halves": [
      50,
      32
     ],
     "net_per_changed": 0.252,
     "rusty_per_changed": 0.234,
     "bba_per_changed": -0.018,
     "halves_agree": true,
     "no_rule_on": 20,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 325,
    "changed_ours": 173,
    "changed_bba": 244,
    "rusty_gain": 76,
    "bba_gain": -6,
    "net": 82,
    "net_other": -211,
    "rusty_contract": 114,
    "rusty_doubling": -38,
    "bba_contract": -18,
    "bba_doubling": 12,
    "net_halves": [
     50,
     32
    ],
    "net_per_changed": 0.252,
    "rusty_per_changed": 0.234,
    "bba_per_changed": -0.018,
    "halves_agree": true,
    "runs": [
     "responsive-doubles"
    ],
    "scenarios": [
     "Responsive_Double",
     "Responsive_Double_after_Overcall"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.7735,
     "errors_per_board": -0.258,
     "status": "bba-fair"
    }
   },
   "partial": null,
   "tests": 10,
   "rules": 12,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/responsive-doubles.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-fair",
   "why": "convention score +0.25 IMPs per changed board (our gain +76, BBA's -6, 325 boards); background on these deals -0.26 IMPs/board, NS calls agreeing 77%"
  },
  {
   "id": "competitive_bidding/support_doubles",
   "name": "Support Doubles and Redoubles",
   "section": "competitive",
   "level": 5,
   "summary": "After opener's one-level opening and responder's one-level suit, when the next player bids, opener's double shows exactly three-card support for responder (a redouble after their double), and a raise shows four.",
   "source": "proposed",
   "members": [
    "competitive_bidding/support_doubles"
   ],
   "treatments": [
    {
     "label": "Support doubles",
     "field": "doubles.support.play",
     "skill": "competitive_bidding/support_doubles",
     "level": 5,
     "status": "bba-poor",
     "why": "vs BBA in Support_Double: -3.12 IMPs/board, NS calls agreeing 86%"
    },
    {
     "label": "Support redouble",
     "field": "doubles.support.rdbl",
     "skill": "competitive_bidding/support_doubles",
     "level": 5,
     "status": "bba-poor",
     "why": "vs BBA in Support_Double: -3.12 IMPs/board, NS calls agreeing 86%"
    }
   ],
   "modules": [
    {
     "name": "support-doubles",
     "title": "Support doubles and redoubles",
     "file": "conventions/competitive/support-doubles.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/support-doubles.bid",
     "rules": 25,
     "tests": 29,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/support-doubles.notes.md"
    }
   ],
   "see": [
    {
     "title": "Support Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/support_double.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 13
    },
    {
     "title": "Support Doubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/355"
    }
   ],
   "scenarios": [
    {
     "name": "Support_Double",
     "boards": 500,
     "ns_agree": 0.8568,
     "errors_per_board": -3.116,
     "auctions_match": 0.144,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8568,
    "errors_per_board": -3.116,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [
    {
     "name": "support-doubles",
     "off": [
      "doubles.support.play=false",
      "doubles.support.rdbl=false"
     ],
     "scenarios": [
      "Support_Double"
     ],
     "bba_keys": [
      "Support double redouble"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 500
     },
     "status": "conv-good",
     "changed": 497,
     "changed_ours": 485,
     "changed_bba": 420,
     "rusty_gain": 565,
     "bba_gain": 151,
     "net": 414,
     "net_other": -1441,
     "rusty_contract": 223,
     "rusty_doubling": 342,
     "bba_contract": 163,
     "bba_doubling": -12,
     "net_halves": [
      243,
      171
     ],
     "net_per_changed": 0.833,
     "rusty_per_changed": 1.137,
     "bba_per_changed": 0.304,
     "halves_agree": true,
     "no_rule_on": 0,
     "no_rule_off": 0
    }
   ],
   "conv_score": {
    "changed": 497,
    "changed_ours": 485,
    "changed_bba": 420,
    "rusty_gain": 565,
    "bba_gain": 151,
    "net": 414,
    "net_other": -1441,
    "rusty_contract": 223,
    "rusty_doubling": 342,
    "bba_contract": 163,
    "bba_doubling": -12,
    "net_halves": [
     243,
     171
    ],
    "net_per_changed": 0.833,
    "rusty_per_changed": 1.137,
    "bba_per_changed": 0.304,
    "halves_agree": true,
    "runs": [
     "support-doubles"
    ],
    "scenarios": [
     "Support_Double"
    ],
    "status": "conv-good",
    "background": {
     "boards": 500,
     "ns_agree": 0.8568,
     "errors_per_board": -3.116,
     "status": "bba-poor"
    }
   },
   "partial": null,
   "tests": 29,
   "rules": 25,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/support-doubles.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-poor",
   "why": "convention score +0.83 IMPs per changed board (our gain +565, BBA's +151, 497 boards); background on these deals -3.12 IMPs/board, NS calls agreeing 86%"
  },
  {
   "id": "competitive_bidding/equal_level_conversion",
   "name": "Equal level conversion",
   "section": "competitive",
   "level": 6,
   "summary": "After a takeout double and partner's forced response, the doubler's bid of another suit at the same level shows a two-suited hand without extra strength, rather than a strong one.",
   "source": "proposed",
   "members": [
    "competitive_bidding/equal_level_conversion"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Equal Level Conversion",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/equal_level_conversion.php"
    }
   ],
   "scenarios": [
    {
     "name": "Equal_Level_Conversion",
     "boards": 500,
     "ns_agree": 0.6998,
     "errors_per_board": -0.584,
     "auctions_match": 0.172,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6998,
    "errors_per_board": -0.584,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/forcing_pass",
   "name": "Forcing pass",
   "section": "competitive",
   "level": 6,
   "summary": "When the partnership has shown game-invitational or better values and an opponent bids, a pass is forcing: it asks partner to double or bid, and shows interest in continuing.",
   "source": "proposed",
   "members": [
    "competitive_bidding/forcing_pass"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Slam Bidding: Forcing Pass Auctions",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/532"
    }
   ],
   "scenarios": [
    {
     "name": "Forcing_Pass",
     "boards": 500,
     "ns_agree": 0.5808,
     "errors_per_board": -0.944,
     "auctions_match": 0.034,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.5808,
    "errors_per_board": -0.944,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/maximal_doubles",
   "name": "Maximal doubles",
   "section": "competitive",
   "level": 6,
   "summary": "When the opponents have competed to the three level just below your suit, a double is a game try rather than penalty, since there is no room for another try.",
   "source": "proposed",
   "members": [
    "competitive_bidding/maximal_doubles"
   ],
   "treatments": [
    {
     "label": "Maximal doubles",
     "field": "doubles.maximal",
     "skill": "competitive_bidding/maximal_doubles",
     "level": 6,
     "status": "ab-gains",
     "why": "self A/B maximal-doubles: leans gain (85 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "maximal-doubles",
     "title": "Maximal doubles",
     "file": "conventions/competitive/maximal-doubles.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/maximal-doubles.bid",
     "rules": 7,
     "tests": 10,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/maximal-doubles.notes.md"
    }
   ],
   "see": [
    {
     "title": "Maximal Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/maximal_double.php"
    },
    {
     "title": "Non-Takeout Doubles: Card-Showing, Maximal, Penalty, Lead-Directing",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/357"
    }
   ],
   "scenarios": [
    {
     "name": "Maximal_Double",
     "boards": 500,
     "ns_agree": 0.7173,
     "errors_per_board": -0.172,
     "auctions_match": 0.042,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-good"
    },
    {
     "name": "Maximal_After_Overcall",
     "boards": 500,
     "ns_agree": 0.7267,
     "errors_per_board": -0.26,
     "auctions_match": 0.054,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.7219,
    "errors_per_board": -0.216,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "maximal-doubles",
     "scenarios": [
      "Maximal_Double",
      "Maximal_After_Overcall"
     ],
     "side": "both",
     "changed": 85,
     "verdict": "leans gain",
     "z": 1.3,
     "actor_contract": 11,
     "actor_doubling": 37,
     "status": "ab-gains",
     "changes": {
      "doubles.maximal": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 10,
   "rules": 7,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/maximal-doubles.notes.md"
   ],
   "status": "ab-gains",
   "why": "self A/B maximal-doubles: leans gain (85 boards changed)"
  },
  {
   "id": "competitive_bidding/fit_showing_jumps",
   "name": "Fit-showing jumps",
   "section": "competitive",
   "level": 7,
   "summary": "In competition, a jump in a new suit shows a good suit there and a fit for partner, so partner can judge how the hands fit.",
   "source": "proposed",
   "members": [
    "competitive_bidding/fit_showing_jumps"
   ],
   "treatments": [
    {
     "label": "Fit-showing jumps",
     "field": "competitive.fit_showing_jumps.play",
     "skill": "competitive_bidding/fit_showing_jumps",
     "level": 7,
     "status": "bba-good",
     "why": "vs BBA in Fit_Showing_Jumps, Fit_Jumps_after_1M_Double: +0.03 IMPs/board, NS calls agreeing 68%"
    }
   ],
   "modules": [
    {
     "name": "fit-showing-jumps",
     "title": "Fit-showing jumps",
     "file": "conventions/competitive/fit-showing-jumps.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/fit-showing-jumps.bid",
     "rules": 23,
     "tests": 22,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/fit-showing-jumps.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 14
    },
    {
     "title": "Fit-Showing Jumps",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/574"
    }
   ],
   "scenarios": [
    {
     "name": "Fit_Showing_Jumps",
     "boards": 500,
     "ns_agree": 0.7179,
     "errors_per_board": 0.206,
     "auctions_match": 0.166,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    },
    {
     "name": "Fit_Jumps_after_1M_Double",
     "boards": 500,
     "ns_agree": 0.6375,
     "errors_per_board": -0.144,
     "auctions_match": 0.084,
     "ns_card": "21GF-GIB",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 1000,
    "ns_agree": 0.6834,
    "errors_per_board": 0.031,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [
    {
     "name": "fit-showing-jumps",
     "off": [
      "competitive.fit_showing_jumps.play=false"
     ],
     "scenarios": [
      "Fit_Showing_Jumps",
      "Fit_Jumps_after_1M_Double"
     ],
     "bba_keys": [
      "Fit showing jumps"
     ],
     "notes": [],
     "unmeasured": null,
     "repro": {
      "differ": 0,
      "boards": 1000
     },
     "status": "conv-good",
     "changed": 855,
     "changed_ours": 850,
     "changed_bba": 307,
     "rusty_gain": 157,
     "bba_gain": -133,
     "net": 290,
     "net_other": 174,
     "rusty_contract": 141,
     "rusty_doubling": 16,
     "bba_contract": -140,
     "bba_doubling": 7,
     "net_halves": [
      134,
      156
     ],
     "net_per_changed": 0.339,
     "rusty_per_changed": 0.184,
     "bba_per_changed": -0.156,
     "halves_agree": true,
     "no_rule_on": 1,
     "no_rule_off": 4
    }
   ],
   "conv_score": {
    "changed": 855,
    "changed_ours": 850,
    "changed_bba": 307,
    "rusty_gain": 157,
    "bba_gain": -133,
    "net": 290,
    "net_other": 174,
    "rusty_contract": 141,
    "rusty_doubling": 16,
    "bba_contract": -140,
    "bba_doubling": 7,
    "net_halves": [
     134,
     156
    ],
    "net_per_changed": 0.339,
    "rusty_per_changed": 0.184,
    "bba_per_changed": -0.156,
    "halves_agree": true,
    "runs": [
     "fit-showing-jumps"
    ],
    "scenarios": [
     "Fit_Jumps_after_1M_Double",
     "Fit_Showing_Jumps"
    ],
    "status": "conv-good",
    "background": {
     "boards": 1000,
     "ns_agree": 0.6834,
     "errors_per_board": 0.031,
     "status": "bba-good"
    }
   },
   "partial": null,
   "tests": 22,
   "rules": 23,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/fit-showing-jumps.notes.md"
   ],
   "status": "conv-good",
   "background": "bba-good",
   "why": "convention score +0.34 IMPs per changed board (our gain +157, BBA's -133, 855 boards); background on these deals +0.03 IMPs/board, NS calls agreeing 68%"
  },
  {
   "id": "competitive_bidding/mathe",
   "name": "Mathe",
   "section": "competitive",
   "level": 7,
   "summary": "A defence to a strong 1♣ opening: double shows the majors, 1NT the minors, and suit bids are natural.",
   "source": "proposed",
   "members": [
    "competitive_bidding/mathe"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Mathe",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/mathe_1c.php"
    },
    {
     "title": "Competitive Bidding: Bidding Over Strong 2C (and 1C) Openings - Mathe",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/191"
    }
   ],
   "scenarios": [
    {
     "name": "Mathe",
     "boards": 500,
     "ns_agree": 0.8618,
     "errors_per_board": -0.276,
     "auctions_match": 0.006,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8618,
    "errors_per_board": -0.276,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/sandwich_nt",
   "name": "Sandwich 1NT",
   "section": "competitive",
   "level": 7,
   "summary": "In the sandwich seat, after the opponents have bid two suits, a 1NT overcall shows the two unbid suits rather than a strong balanced hand.",
   "source": "proposed",
   "members": [
    "competitive_bidding/sandwich_nt"
   ],
   "treatments": [
    {
     "label": "Sandwich NT",
     "field": "competitive.sandwich_nt.play",
     "skill": "competitive_bidding/sandwich_nt",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "sandwich-nt",
     "title": "Sandwich 1NT: the two unbid suits",
     "file": "conventions/competitive/sandwich-nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/sandwich-nt.bid",
     "rules": 6,
     "tests": 8,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/sandwich-nt.notes.md"
    }
   ],
   "see": [
    {
     "title": "Competitive Bidding: Sandwich NT",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/194"
    }
   ],
   "scenarios": [
    {
     "name": "GIB_Sandwich_NT_BPH",
     "boards": 500,
     "ns_agree": 0.7335,
     "errors_per_board": -0.028,
     "auctions_match": 0.058,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7335,
    "errors_per_board": -0.028,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "sandwich-nt",
     "scenarios": [
      "GIB_Sandwich_NT_BPH"
     ],
     "side": "both",
     "changed": 0,
     "verdict": "no boards changed",
     "z": 0.0,
     "actor_contract": 0,
     "actor_doubling": 0,
     "status": null,
     "changes": {
      "competitive.sandwich_nt.play": "true"
     }
    }
   ],
   "conv": [
    {
     "name": "sandwich-nt",
     "off": [
      "competitive.sandwich_nt.play=false"
     ],
     "scenarios": [
      "GIB_Sandwich_NT_BPH"
     ],
     "bba_keys": [],
     "notes": [
      "GIB_Sandwich_NT_BPH: 21GF-GIB does not play it or leaves it unset (competitive.sandwich_nt.play=None)"
     ],
     "unmeasured": "GIB_Sandwich_NT_BPH: 21GF-GIB does not play it or leaves it unset (competitive.sandwich_nt.play=None)",
     "repro": null,
     "status": null
    }
   ],
   "conv_score": null,
   "partial": null,
   "tests": 8,
   "rules": 6,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/sandwich-nt.notes.md"
   ],
   "status": "bba-good",
   "why": "background (not isolated): errors -0.03 IMPs/board against BBA's, NS calls agreeing 73% (500 boards)"
  },
  {
   "id": "competitive_bidding/scrambling_2nt",
   "name": "Scrambling 2NT",
   "section": "competitive",
   "level": 7,
   "summary": "In a competitive auction where a takeout double would be natural, advancer's 2NT asks partner to pick a minor or a two-suited contract, rather than showing values.",
   "source": "proposed",
   "members": [
    "competitive_bidding/scrambling_2nt"
   ],
   "treatments": [
    {
     "label": "Scrambling 2NT",
     "field": "competitive.scrambling_2nt.play",
     "skill": "competitive_bidding/scrambling_2nt",
     "level": 7,
     "status": "ab-neutral",
     "why": "self A/B scrambling-2nt: neutral (11 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "scrambling-2nt",
     "title": "Scrambling 2NT",
     "file": "conventions/competitive/scrambling-2nt.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/scrambling-2nt.bid",
     "rules": 5,
     "tests": 9,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/scrambling-2nt.notes.md"
    }
   ],
   "see": [
    {
     "title": "Scrambling vs Good/Bad 2NT",
     "url": "https://tinyurl.com/Scrambling-vs-Good-Bad-2N"
    },
    {
     "title": "Competitive Auctions: Scrambling 2NT",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/555"
    }
   ],
   "scenarios": [
    {
     "name": "Scrambling_2NT",
     "boards": 500,
     "ns_agree": 0.8586,
     "errors_per_board": 0.208,
     "auctions_match": 0.32,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8586,
    "errors_per_board": 0.208,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "scrambling-2nt",
     "scenarios": [
      "Scrambling_2NT"
     ],
     "side": "both",
     "changed": 11,
     "verdict": "neutral",
     "z": 0.0,
     "actor_contract": 0,
     "actor_doubling": 0,
     "status": "ab-neutral",
     "changes": {
      "competitive.scrambling_2nt.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 9,
   "rules": 5,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/scrambling-2nt.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B scrambling-2nt: neutral (11 boards changed)"
  },
  {
   "id": "competitive_bidding/sos_redouble",
   "name": "SOS redouble",
   "section": "competitive",
   "level": 7,
   "summary": "When a low-level contract is doubled for penalty, a redouble asks partner to choose another suit, rather than showing strength.",
   "source": "proposed",
   "members": [
    "competitive_bidding/sos_redouble"
   ],
   "treatments": [
    {
     "label": "SOS redouble",
     "field": "other_conventions.sos_redouble.play",
     "skill": "competitive_bidding/sos_redouble",
     "level": 7,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "sos-redouble",
     "title": "SOS redouble",
     "file": "conventions/competitive/sos-redouble.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/sos-redouble.bid",
     "rules": 6,
     "tests": 4,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/sos-redouble.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 22
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": "Only 1x (X) P (P): other SOS positions (a passed round, our 1NT doubled) are not written.",
   "tests": 4,
   "rules": 6,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/sos-redouble.notes.md"
   ],
   "status": "partial",
   "why": "Only 1x (X) P (P): other SOS positions (a passed round, our 1NT doubled) are not written."
  },
  {
   "id": "competitive_bidding/bromad",
   "name": "BROMAD",
   "section": "competitive",
   "level": 8,
   "summary": "Bergen raises used over the opponents' takeout double of partner's major (Bergen Raises Over Major Doubles), with the structure adjusted for the double.",
   "source": "proposed",
   "members": [
    "competitive_bidding/bromad"
   ],
   "treatments": [
    {
     "label": "BROMAD",
     "field": "competitive.bromad.play",
     "skill": "competitive_bidding/bromad",
     "level": 8,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "vs-takeout-double",
     "title": "Raises over their takeout double: Jordan 2NT and BROMAD",
     "file": "conventions/competitive/vs-takeout-double.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.bid",
     "rules": 18,
     "tests": 19,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 19,
   "rules": 18,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/vs-takeout-double.notes.md"
   ],
   "status": "tested",
   "why": "19 test cases; no corpus or A/B measure"
  },
  {
   "id": "competitive_bidding/collante",
   "name": "Collante",
   "section": "competitive",
   "level": 8,
   "summary": "After partner's 1♣ and their 1♦ (or 1♦ and 1♥), a double shows four cards in the next suit up and a bid of it shows five or more.",
   "source": "proposed",
   "members": [
    "competitive_bidding/collante"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [
    {
     "name": "WB5_Collante",
     "boards": 500,
     "ns_agree": 0.6524,
     "errors_per_board": -1.188,
     "auctions_match": 0.064,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6524,
    "errors_per_board": -1.188,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/exit_transfers",
   "name": "Exit transfers",
   "section": "competitive",
   "level": 8,
   "summary": "When the opponents double partner's 1NT, redouble and suit bids are transfers to the next suit to escape, and pass forces a redouble for two- suited runouts.",
   "source": "proposed",
   "members": [
    "competitive_bidding/exit_transfers"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Exit Transfers",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/exit_transfers.php"
    }
   ],
   "scenarios": [
    {
     "name": "Exit_Transfers",
     "boards": 500,
     "ns_agree": 0.8168,
     "errors_per_board": -0.174,
     "auctions_match": 0.182,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8168,
    "errors_per_board": -0.174,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/ghestem",
   "name": "Ghestem",
   "section": "competitive",
   "level": 8,
   "summary": "Played instead of Michaels and the Unusual 2NT: 2NT, a cue bid and a jump cue bid each show a specific pair of suits.",
   "source": "proposed",
   "members": [
    "competitive_bidding/ghestem"
   ],
   "treatments": [
    {
     "label": "Ghestem",
     "field": "competitive.ghestem.play",
     "skill": "competitive_bidding/ghestem",
     "level": 8,
     "status": "ab-neutral",
     "why": "self A/B ghestem-vs-michaels: neutral (516 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "ghestem",
     "title": "Ghestem two-suited overcalls",
     "file": "conventions/competitive/ghestem.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/ghestem.bid",
     "rules": 24,
     "tests": 14,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/ghestem.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "ghestem-vs-michaels",
     "scenarios": [
      "Michaels_Cuebid",
      "Michaels_and_Unusual"
     ],
     "side": "both",
     "changed": 516,
     "verdict": "neutral",
     "z": -0.5,
     "actor_contract": -55,
     "actor_doubling": 12,
     "status": "ab-neutral",
     "changes": {
      "competitive.ghestem.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 14,
   "rules": 24,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/ghestem.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B ghestem-vs-michaels: neutral (516 boards changed)"
  },
  {
   "id": "competitive_bidding/mitchell_stayman",
   "name": "Mitchell Stayman",
   "section": "competitive",
   "level": 8,
   "summary": "After partner's minor opening and their 1NT overcall, responder's 2♣ shows both majors (five-four) with modest values, and opener chooses.",
   "source": "proposed",
   "members": [
    "competitive_bidding/mitchell_stayman"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [
    {
     "name": "Mitchell_Stayman",
     "boards": 500,
     "ns_agree": 0.8158,
     "errors_per_board": 0.0,
     "auctions_match": 0.286,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8158,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/raptor",
   "name": "Raptor 1NT",
   "section": "competitive",
   "level": 8,
   "summary": "An overcall of 1NT that shows a four-card major and a longer minor, rather than a strong balanced hand.",
   "source": "proposed",
   "members": [
    "competitive_bidding/raptor"
   ],
   "treatments": [
    {
     "label": "Raptor 1NT",
     "field": "competitive.raptor_1nt.play",
     "skill": "competitive_bidding/raptor",
     "level": 8,
     "status": "ab-loses",
     "why": "self A/B raptor: loses (483 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "raptor",
     "title": "Raptor 1NT: a four-card major and a longer minor",
     "file": "conventions/competitive/raptor.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/raptor.bid",
     "rules": 23,
     "tests": 12,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/raptor.notes.md"
    }
   ],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [
    {
     "name": "raptor",
     "scenarios": [
      "We_Overcall_1N"
     ],
     "side": "both",
     "changed": 483,
     "verdict": "loses",
     "z": -4.4,
     "actor_contract": 0,
     "actor_doubling": -431,
     "status": "ab-loses",
     "changes": {
      "competitive.raptor_1nt.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 12,
   "rules": 23,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/raptor.notes.md"
   ],
   "status": "ab-loses",
   "why": "self A/B raptor: loses (483 boards changed)"
  },
  {
   "id": "competitive_bidding/rodrigue",
   "name": "Rodrigue",
   "section": "competitive",
   "level": 8,
   "summary": "After partner's minor and their 1♠, a double shows four hearts, and five or more hearts are shown by 2m with 8–10 points or 2♥ with 11 or more.",
   "source": "proposed",
   "members": [
    "competitive_bidding/rodrigue"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [
    {
     "name": "WB5_Rodrigue",
     "boards": 500,
     "ns_agree": 0.5571,
     "errors_per_board": -1.524,
     "auctions_match": 0.0,
     "ns_card": "21GF-SPECIALS2",
     "status": "bba-poor"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.5571,
    "errors_per_board": -1.524,
    "status": "bba-poor"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/snapdragon",
   "name": "Snapdragon doubles",
   "section": "competitive",
   "level": 8,
   "summary": "When three suits have been bid, one by each of three players, fourth hand's double shows the unbid suit and tolerance for partner's.",
   "source": "proposed",
   "members": [
    "competitive_bidding/snapdragon"
   ],
   "treatments": [
    {
     "label": "Snapdragon doubles",
     "field": "competitive.snapdragon.play",
     "skill": "competitive_bidding/snapdragon",
     "level": 8,
     "status": "ab-neutral",
     "why": "self A/B snapdragon: neutral (336 boards changed)"
    }
   ],
   "modules": [
    {
     "name": "snapdragon",
     "title": "Snapdragon doubles",
     "file": "conventions/competitive/snapdragon.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/snapdragon.bid",
     "rules": 15,
     "tests": 8,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/snapdragon.notes.md"
    }
   ],
   "see": [
    {
     "title": "Snapdragon Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/snapdragon_double.php"
    },
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 24
    },
    {
     "title": "Snapdragon Doubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/568"
    }
   ],
   "scenarios": [
    {
     "name": "Snapdragon_Double",
     "boards": 500,
     "ns_agree": 0.7942,
     "errors_per_board": -0.602,
     "auctions_match": 0.088,
     "ns_card": "21GF-SPECIALS",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7942,
    "errors_per_board": -0.602,
    "status": "bba-fair"
   },
   "ab": [
    {
     "name": "snapdragon",
     "scenarios": [
      "Snapdragon_Double"
     ],
     "side": "both",
     "changed": 336,
     "verdict": "neutral",
     "z": -1.0,
     "actor_contract": -210,
     "actor_doubling": 155,
     "status": "ab-neutral",
     "changes": {
      "competitive.snapdragon.play": "true"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 8,
   "rules": 15,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/snapdragon.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B snapdragon: neutral (336 boards changed)"
  },
  {
   "id": "competitive_bidding/suction",
   "name": "Suction",
   "section": "competitive",
   "level": 8,
   "summary": "Over their 1NT, each two-level suit bid shows either the next suit up or the other two suits, so the overcall is ambiguous by design and partner bids the next suit to find out.",
   "source": "proposed",
   "members": [
    "competitive_bidding/suction"
   ],
   "treatments": [
    {
     "label": "Defense vs strong 1NT: suction",
     "field": "competitive.vs_1nt_strong.system",
     "option": "suction",
     "skill": "competitive_bidding/suction",
     "level": 5,
     "status": "ab-neutral",
     "why": "self A/B suction: neutral (400 boards changed)"
    },
    {
     "label": "Defense vs weak 1NT: suction",
     "field": "competitive.vs_1nt_weak.system",
     "option": "suction",
     "skill": "competitive_bidding/suction",
     "level": 5,
     "status": "gap",
     "why": "no rule plays this option"
    }
   ],
   "modules": [
    {
     "name": "suction",
     "title": "Suction over their 1NT",
     "file": "conventions/competitive/suction.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/suction.bid",
     "rules": 16,
     "tests": 21,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/suction.notes.md"
    }
   ],
   "see": [
    {
     "title": "Suction",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/suction.php"
    }
   ],
   "scenarios": [
    {
     "name": "Suction",
     "boards": 500,
     "ns_agree": 0.8347,
     "errors_per_board": 0.186,
     "auctions_match": 0.26,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.8347,
    "errors_per_board": 0.186,
    "status": "bba-good"
   },
   "ab": [
    {
     "name": "suction",
     "scenarios": [
      "Suction"
     ],
     "side": "both",
     "changed": 400,
     "verdict": "neutral",
     "z": 0.8,
     "actor_contract": -32,
     "actor_doubling": 84,
     "status": "ab-neutral",
     "changes": {
      "competitive.vs_1nt_strong.system": "suction"
     }
    }
   ],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 21,
   "rules": 16,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/suction.notes.md"
   ],
   "status": "ab-neutral",
   "why": "self A/B suction: neutral (400 boards changed)"
  },
  {
   "id": "competitive_bidding/thrump_double",
   "name": "Thrump double",
   "section": "competitive",
   "level": 8,
   "summary": "After partner opens and the opponents preempt at the three level, responder's double asks opener to bid 3NT with a stopper, for a hand with values and no fit or long suit.",
   "source": "proposed",
   "members": [
    "competitive_bidding/thrump_double"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Thrump Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/thrump_double.php"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/unusual_vs_unusual",
   "name": "Unusual vs Unusual",
   "section": "competitive",
   "level": 8,
   "summary": "After they show two suits with Michaels or the Unusual 2NT, cue bids of their suits show hands in the other two suits: one cue bid a raise of partner, the other a strong hand in the fourth suit.",
   "source": "proposed",
   "members": [
    "competitive_bidding/unusual_vs_unusual"
   ],
   "treatments": [
    {
     "label": "Unusual vs Unusual",
     "field": "competitive.unusual_vs_unusual.play",
     "skill": "competitive_bidding/unusual_vs_unusual",
     "level": 8,
     "status": "tested",
     "why": "a rule reads this field"
    }
   ],
   "modules": [
    {
     "name": "two-suited-overcalls",
     "title": "Michaels cue bids and the Unusual 2NT",
     "file": "conventions/competitive/two-suited-overcalls.bid",
     "url": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/two-suited-overcalls.bid",
     "rules": 241,
     "tests": 61,
     "notes": "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/two-suited-overcalls.notes.md"
    }
   ],
   "see": [
    {
     "title": "25 More Bridge Conventions You Should Know",
     "kind": "book",
     "chapter": 21
    },
    {
     "title": "Unusual vs. Unusual and Unusual vs. Michaels",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/470"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 61,
   "rules": 241,
   "notes": [
    "https://github.com/bridge-craftwork/rusty-bidding-bot/blob/main/conventions/competitive/two-suited-overcalls.notes.md"
   ],
   "status": "tested",
   "why": "61 test cases; no corpus or A/B measure"
  },
  {
   "id": "competitive_bidding/crash",
   "name": "CRASH",
   "section": "competitive",
   "level": 9,
   "summary": "A defence to a strong 1♣ opening: overcalls show two-suited hands by colour, rank and shape (CRASH: Colour, RAnk, SHape).",
   "source": "proposed",
   "members": [
    "competitive_bidding/crash"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "CRASH",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/crash.php"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/good_bad_2nt",
   "name": "Good/bad 2NT",
   "section": "competitive",
   "level": 9,
   "summary": "In a competitive auction where the opponents have just bid at the two level, 2NT is artificial and shows a weak hand that wants to compete to the three level; bidding the three level directly is stronger.",
   "source": "proposed",
   "members": [
    "competitive_bidding/good_bad_2nt"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Competitive Auctions: Good/Bad 2NT in Competition",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/554"
    }
   ],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/rosenkranz",
   "name": "Rosenkranz double",
   "section": "competitive",
   "level": 9,
   "summary": "When the opponents overcall partner's opening and advancer raises partner's overcall, a double or redouble shows a top honour in partner's suit, and a raise denies one.",
   "source": "proposed",
   "members": [
    "competitive_bidding/rosenkranz"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Rosenkranz Double",
     "site": "Bridge Bum",
     "url": "https://www.bridgebum.com/rosenkranz_double.php"
    },
    {
     "title": "Rosenkrantz Redoubles",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/569"
    }
   ],
   "scenarios": [
    {
     "name": "Rosenkranz_Double",
     "boards": 500,
     "ns_agree": 0.7177,
     "errors_per_board": 0.0,
     "auctions_match": 0.064,
     "ns_card": "21GF-GIB",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.7177,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/spear",
   "name": "Spear",
   "section": "competitive",
   "level": 9,
   "summary": "How to intervene after the opponents' 1♣ or 1♦ opening and 1NT response: suit bids and double describe both-majors, one-major and strong hands.",
   "source": "proposed",
   "members": [
    "competitive_bidding/spear"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Spear",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/571"
    }
   ],
   "scenarios": [
    {
     "name": "Spear",
     "boards": 500,
     "ns_agree": 0.827,
     "errors_per_board": -0.618,
     "auctions_match": 0.244,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-fair"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.827,
    "errors_per_board": -0.618,
    "status": "bba-fair"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "competitive_bidding/transfer_advances",
   "name": "Transfer advances",
   "section": "competitive",
   "level": 9,
   "summary": "After partner's overcall, advancer's bids are transfers to the next suit, so the overcaller can accept or show more, and advancer can describe more hands.",
   "source": "proposed",
   "members": [
    "competitive_bidding/transfer_advances"
   ],
   "treatments": [],
   "modules": [],
   "see": [
    {
     "title": "Transfer Advances of Overcalls",
     "site": "Bridge Winners",
     "url": "https://bridgewinners.com/article/view/transfer-advances-of-overcalls/"
    },
    {
     "title": "Transfer Advances Over Negative Double",
     "by": "Robert S. Todd",
     "site": "Advancing in Bridge",
     "url": "https://www.advinbridge.com/this-week-in-bridge/597"
    }
   ],
   "scenarios": [
    {
     "name": "Transfer_Advances",
     "boards": 500,
     "ns_agree": 0.6878,
     "errors_per_board": 0.0,
     "auctions_match": 0.13,
     "ns_card": "21GF-DEFAULT",
     "status": "bba-good"
    }
   ],
   "scenarios_missing": [],
   "bba": {
    "boards": 500,
    "ns_agree": 0.6878,
    "errors_per_board": 0.0,
    "status": "bba-good"
   },
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "precision/1c_mixed",
   "name": "Precision 1♣ (Mixed)",
   "section": "precision",
   "level": 7,
   "summary": "",
   "source": "lessons",
   "members": [
    "precision/1c_mixed"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "precision/1c_opener",
   "name": "Precision 1♣ (Opener)",
   "section": "precision",
   "level": 7,
   "summary": "",
   "source": "lessons",
   "members": [
    "precision/1c_opener"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  },
  {
   "id": "precision/1c_responder",
   "name": "Precision 1♣ (Responder)",
   "section": "precision",
   "level": 7,
   "summary": "",
   "source": "lessons",
   "members": [
    "precision/1c_responder"
   ],
   "treatments": [],
   "modules": [],
   "see": [],
   "scenarios": [],
   "scenarios_missing": [],
   "bba": null,
   "ab": [],
   "conv": [],
   "conv_score": null,
   "partial": null,
   "tests": 0,
   "rules": 0,
   "notes": [],
   "status": "gap",
   "why": "no module implements it"
  }
 ]
}
