{
  "version": "v2",
  "date": "2026-10-18",
  "source": "data/core_books.csv",
  "policy": "One row per exact system_name. Assign a family only when every source record for that system resolves to the same shared family. Preserve explicit Standalone labels; leave ambiguous and unsupported cases unclassified. A family must have at least two distinct source system names associated with its normalized labels, even if one of those systems remains unclassified across editions.",
  "groups": [
    {
      "id": "dnd-d20",
      "name": "D&D / d20",
      "source_labels": [
        "d20 System",
        "Archmage Engine / d20",
        "D&D / AD&D",
        "AD&D-derived",
        "D&D 5e",
        "D&D / OSR",
        "D&D / OSR (Without Number)",
        "D&D Basic",
        "D&D Basic / B-X",
        "D&D Basic / BECMI",
        "d20 System / D&D",
        "D&D 4e",
        "d20 System / Pathfinder",
        "Pathfinder 2e",
        "Pathfinder 2e / Starfinder 2e",
        "Mastercraft / d20",
        "d20 System / Saga",
        "d20-derived",
        "d20-derived / True20"
      ],
      "note": "Broad v1 grouping of the catalogue's D&D, d20, Pathfinder and related labels. Specific Mork Borg, Into the Odd and Mutants & Masterminds labels remain separate. OSR alone is not enough for assignment."
    },
    {
      "id": "basic-role-playing",
      "name": "Basic Role-Playing",
      "source_labels": [
        "Basic Role-Playing",
        "Basic Role-Playing-derived",
        "Basic Role-Playing-derived / Dragonbane",
        "Basic Role-Playing / RuneQuest",
        "Basic Role-Playing / RuneQuest-derived",
        "Pendragon / Basic Role-Playing-derived"
      ],
      "note": "Groups the catalogue's explicit BRP and BRP-derived labels, including RuneQuest-related labels."
    },
    {
      "id": "powered-by-the-apocalypse",
      "name": "Powered by the Apocalypse",
      "source_labels": [
        "Powered by the Apocalypse",
        "Powered by the Apocalypse-derived / City of Mist",
        "Ironsworn / Powered by the Apocalypse-derived"
      ],
      "note": "Includes the catalogue's explicit PbtA-derived labels. Forged in the Dark remains separate."
    },
    {
      "id": "fate-fudge",
      "name": "Fate / Fudge",
      "source_labels": [
        "Fate",
        "Fate / Fudge",
        "Fudge",
        "Fate Accelerated"
      ],
      "note": "Broad v1 grouping retaining the Fate/Fudge relationship already recorded in the catalogue."
    },
    {
      "id": "d6-system",
      "name": "D6 / OpenD6",
      "source_labels": [
        "D6 System",
        "D6 Legend",
        "Mini Six / OpenD6",
        "OpenD6"
      ],
      "note": "Groups the named D6/OpenD6 labels. A generic label mentioning six-sided dice is not enough for assignment."
    },
    {
      "id": "torg-masterbook",
      "name": "Torg / MasterBook",
      "source_labels": [
        "Torg / MasterBook",
        "MasterBook",
        "Torg"
      ],
      "note": "Retains the Torg/MasterBook relationship recorded in the catalogue."
    },
    {
      "id": "unisystem",
      "name": "Unisystem",
      "source_labels": [
        "Unisystem",
        "Cinematic Unisystem"
      ],
      "note": "Groups the two named Unisystem variants."
    },
    {
      "id": "rolemaster",
      "name": "Rolemaster",
      "source_labels": [
        "Rolemaster",
        "Rolemaster-derived / HARP"
      ],
      "note": "Includes the catalogue's explicitly Rolemaster-derived label."
    },
    {
      "id": "earthdawn-step-system",
      "name": "Earthdawn / Step System",
      "source_labels": [
        "Step System / Earthdawn",
        "Earthdawn-derived"
      ],
      "note": "Groups the catalogue's Earthdawn and Earthdawn-derived labels."
    },
    {
      "id": "mork-borg",
      "name": "Mörk Borg",
      "source_labels": [
        "Mörk Borg",
        "Mörk Borg / OSR"
      ],
      "note": "Keeps the specifically named Mork Borg grouping separate from the broad D&D/d20 grouping."
    },
    {
      "id": "cortex",
      "name": "Cortex",
      "source_labels": [
        "Cortex",
        "Cortex Plus",
        "Cortex Prime"
      ],
      "note": "Groups the named Cortex variants."
    },
    {
      "id": "gumshoe",
      "name": "GUMSHOE",
      "source_labels": [
        "GUMSHOE",
        "GUMSHOE One-2-One"
      ],
      "note": "Includes the named One-2-One variant. A label describing a precursor is not treated as membership."
    },
    {
      "id": "mutants-and-masterminds",
      "name": "Mutants & Masterminds",
      "source_labels": [
        "d20-derived / Mutants & Masterminds",
        "Mutants & Masterminds 3e"
      ],
      "note": "Keeps the specifically named Mutants & Masterminds grouping separate from the broad D&D/d20 grouping."
    }
  ],
  "ambiguous_labels": [
    "d20 System / Tri-Stat",
    "Interlock / Fuzion"
  ],
  "excluded_relationship_labels": [
    "Dying Earth / GUMSHOE precursor",
    "OSR / Death in Space"
  ],
  "discord_policy": {
    "selection": "Publicly advertised tabletop RPG communities with a working guild invite resolved on checked_on. Prefer publishers, creators, community organizers or server descriptions. No private campaign or paid-only invites.",
    "identity": "One server record per Discord guild ID, not per invite URL. Preserve server_id across invite changes and renames. No member observations or personal data are stored here.",
    "associations": "System associations are explicit and evidence-backed; game-line entries can include narrower edition scope described in notes. A family_subset association is the frozen crosswalk from one or more reviewed system links through this same release's family CSV. It does not claim full-family coverage. Never inherit a family server onto all its systems. The schema also permits independently evidenced family-wide links (scope family) without direct system links; none are asserted in v2.",
    "zero_mappings": "No edge means no confirmed mapping in this non-exhaustive research pass, not that no public server exists. Do not fabricate a null-server record or a member count of zero.",
    "aggregation": "Deduplicate by discord_guild_id within every result. A server mapped to several families is one shared audience; its whole membership cannot be attributed to each game or treated as unique people across servers.",
    "verification": "Invite resolution confirms a public link and guild identity, not an audit of internal channels. Source pages support relevance. Dates are evidence checks, not collection dates for a popularity index.",
    "versioning": "The family CSV, rules, server registry and associations form one immutable classification version. Any mapping or invite correction requires the next combined version; live check results are separate observations."
  }
}
