{
  "market": "good-morning-oxfordshire",
  "updated": "2026-06-25",
  "status": "internal_prep_only",
  "sourceIssue": "MY-2571",
  "relatedIssues": [
    "MY-2577"
  ],
  "buttondownList": "goodmorningoxfordshire",
  "boundary": "Do not publish live rankings, prize winners, private emails or sponsor-backed rewards until Buttondown attribution is verified and the editor approves the public launch.",
  "capture": {
    "subscribeRoute": "/subscribe/",
    "shareRoute": "/share/",
    "metadataFields": [
      {
        "field": "metadata__referral_source",
        "source": "Incoming subscribe URL ?ref= token",
        "publicUse": "Never displayed raw; used only to attribute a confirmed subscriber to an inviter."
      },
      {
        "field": "metadata__reader_token",
        "source": "Browser-local share token generated on /share/",
        "publicUse": "Can be mapped to an approved display name after opt-in."
      },
      {
        "field": "metadata__signup_market",
        "source": "Static hidden field",
        "publicUse": "Market filter for Oxfordshire referral dashboards."
      },
      {
        "field": "tag",
        "source": "Buttondown embedded form tag website-subscribe",
        "publicUse": "Operational filter only; never shown to readers."
      }
    ]
  },
  "publicLeaderboardContract": {
    "route": "/leaderboard/",
    "jsonRoute": "/leaderboard/wiring/readiness.json",
    "columns": [
      {
        "name": "Rank",
        "rule": "Sort by confirmed referral count after fraud checks."
      },
      {
        "name": "Display name",
        "rule": "Initials, first name plus broad area, or opted-in community name only."
      },
      {
        "name": "Area",
        "rule": "Reader-selected broad area such as Oxford, Abingdon, Didcot, Witney, Bicester or Banbury; no street-level data."
      },
      {
        "name": "Confirmed referrals",
        "rule": "Count confirmed Buttondown subscribers with matching referral_source, excluding reversals and abuse."
      },
      {
        "name": "Reward tier",
        "rule": "Show reward label only; prize fulfilment remains manually approved."
      }
    ],
    "privacyRule": "Only redacted display names, broad areas, counts and reward labels can be published."
  },
  "verificationGates": [
    "Buttondown subscriber.created or equivalent event is received with metadata fields intact.",
    "Confirmation state is checked before a referral increments public totals.",
    "Self-referrals, duplicate aliases and same-household abuse patterns are excluded before scoring.",
    "A private attribution table exists separately from the public leaderboard view.",
    "Leaderboard cache can be rebuilt without exposing raw subscriber records.",
    "Manual kill switch hides public rankings if abuse, privacy or sponsor-risk flags appear."
  ],
  "launchSequence": [
    "Keep /share/ and /subscribe/ static referral capture in place.",
    "Verify Buttondown stores referral_source, reader_token and signup_market from embedded form submissions.",
    "Backfill a private referral ledger from confirmed subscribers only.",
    "Generate a redacted leaderboard JSON containing publicColumns only.",
    "Review reward wording and sponsor-backed prize terms manually.",
    "Publish public rankings only after the editor approves the live leaderboard."
  ],
  "blockedUntilVerified": [
    "Do not publish live ranks, prize winners or sponsor-backed rewards.",
    "Do not expose raw emails, Buttondown subscriber IDs, API keys or private attribution tables.",
    "Do not count unconfirmed subscribers, self-referrals or duplicate aliases.",
    "Do not let referral reward sponsors blur into editorial coverage or paid issue sponsorship."
  ],
  "nextSafeStep": "Run a Buttondown sandbox/live-form metadata preflight, export only confirmed test subscribers, then generate a redacted leaderboard JSON from the public contract above."
}
