{
  "version": "v4",
  "date": "2026-10-28",
  "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."
    },
    {
      "id": "storyteller-storytelling",
      "name": "Storyteller / Storytelling",
      "source_labels": [
        "Storyteller System",
        "Storytelling System"
      ],
      "note": "Owner-requested consolidation of related rules families for popularity reporting. This does not assert identical rules, settings or distinct audiences."
    }
  ],
  "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 or v3.",
    "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 community identities and duplicate association edges in the registry. Ranking aggregation is specified by each index methodology: October intentionally counts each source once per directly associated system, including repeats within a family. Never interpret those sums as unique people.",
    "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, shared rules, Discord and Reddit registries and associations form one immutable classification version. Mapping or link corrections require the next combined version. Live check results are separate observations."
  },
  "reddit_policy": {
    "selection": "Review publicly readable tabletop RPG communities using their own pages, descriptions, metadata and discussions, with the public r/rpg directory as a discovery source. Exclude private communities and generic or unrelated fandoms without specific RPG evidence. Restricted posting is recorded where known; not_recorded means access type was not captured, not private.",
    "identity": "One record per case-insensitive subreddit name, with stable project community_id reddit-<lowercase name>. Preserve supplied Reddit t5 fullname where retrieved; an empty fullname is an explicit research gap, not an invented ID. Check display_name and known fullname before accepting future counts. A rename or identity change requires editorial review.",
    "associations": "Explicit evidence-backed system links, including standalone and unclassified systems. family_subset links are the frozen crosswalk from reviewed system associations through this same family CSV. Independently evidenced family-wide links use family, without automatic links to sibling systems. Game-line links can have narrower edition scope documented in notes.",
    "zero_mappings": "No association means no confirmed mapping in this non-exhaustive pass, not no community or zero subscribers. No placeholder community rows.",
    "verification": "checked_on is the date public source evidence was reviewed, not a live count observation. Chrome pages and web-provided public pages or metadata were reviewed; some web evidence is cached. Live metadata requests were blocked. Every subscriber_lookup_status is not_live_verified; no counts or personal/post data are stored.",
    "counts": "Store future observations separately using this version, timestamp, status, subreddit name and returned t5 fullname. Read data.subscribers from subreddit about metadata using approved access as needed; weekly visitors, contributions and online presence are different measures. Missing, blocked, unavailable and rate-limited lookups must not become zero.",
    "aggregation": "Deduplicate community identities and duplicate association edges in the registry. Ranking aggregation is specified by each index methodology: October intentionally counts each source once per directly associated system, including repeats within a family. Never interpret those sums as unique people.",
    "versioning": "Family assignments, Discord companions, Reddit companions, rules and manifest share one immutable version. Correct a name, link or mapping by publishing the next combined release; never overwrite archived files."
  },
  "family_mergers": [
    {
      "from_ids": [
        "storyteller-system",
        "storytelling-system"
      ],
      "to_id": "storyteller-storytelling",
      "name": "Storyteller / Storytelling",
      "reason": "Owner-requested consolidation of related rules families for popularity reporting. This does not assert identical rules, settings or distinct audiences."
    }
  ]
}
