{
  "id": "publisher_spaf",
  "title": "Publisher SPAF / traffic-source status",
  "aliases": ["SPAF", "spaf", "traffic source review", "placement approval"],
  "description": "Phase-1 SPAF gate is upload presence only (uploaded | missing). Separate from account approval and agreement execution. Richer approval workflow labels are deferred.",
  "sourceSystem": "mngt",
  "schemaTables": ["Admin.Affiliate_info"],
  "tools": ["get_publisher_spaf_status"],
  "statusFields": [
    {
      "field": "business.spaf_status",
      "description": "Phase-1 locked tool output for get_publisher_spaf_status (TW-309 / TW-313). Derived in RO view — never return Affiliate_info.spafupload path.",
      "values": [
        {
          "value": "uploaded",
          "meaning": "Non-empty spafupload reference on Affiliate_info — SPAF artifact pointer present.",
          "confirmed": true,
          "notes": "Upload ≠ traffic-source approval. Phase 1 does not expose pending_review / approved / rejected."
        },
        {
          "value": "missing",
          "meaning": "No SPAF upload recorded on Affiliate_info — not launch-ready on SPAF grounds.",
          "confirmed": true
        }
      ],
      "notes": "Locked Phase-1 values: uploaded | missing only."
    },
    {
      "field": "Admin.Affiliate_info.spafupload",
      "description": "Pointer/path to uploaded SPAF artifact. Presence feeds spaf_status; path itself is deny.",
      "values": [
        {
          "value": "empty",
          "meaning": "No SPAF upload recorded → spaf_status=missing.",
          "confirmed": true
        },
        {
          "value": "present",
          "meaning": "Upload reference present → spaf_status=uploaded.",
          "confirmed": true
        }
      ]
    }
  ],
  "fieldAllowlist": [
    "Affiliate",
    "spaf_status",
    "traffic_type",
    "traffic_type_other",
    "traffic_geo",
    "traffic_source",
    "traffic_channel",
    "verticles",
    "campaign_eligibility",
    "approved",
    "company"
  ],
  "fieldDeny": [
    "spafupload",
    "agreement",
    "SSN",
    "Tax_ID",
    "paypal_email",
    "pass_clr",
    "email",
    "telephone",
    "address1",
    "address2"
  ],
  "reviewStatus": "draft",
  "refs": [
    "https://admedia-jira.atlassian.net/browse/TW-285",
    "https://admedia-jira.atlassian.net/browse/TW-309",
    "https://admedia-jira.atlassian.net/browse/TW-313",
    "https://admedia-jira.atlassian.net/wiki/spaces/PM1/pages/758743051/Publisher+Onboarding+and+Launch+SOP",
    "https://admedia-jira.atlassian.net/wiki/spaces/ADOPS/pages/106463234/Publisher+Traffic+Source+Review+Guide",
    "docs/MNGT-RO-VIEWS.md"
  ],
  "notes": [
    "Phase-1 derivation (view): uploaded iff NULLIF(TRIM(spafupload),'') IS NOT NULL; else missing.",
    "Prefer returning structured status + traffic scope metadata; do not dump SPAF evidence files or paths into ChatGPT.",
    "Deferred (post Phase 1): pending_review / approved / rejected / re_review_required when a confirmed approval column exists."
  ]
}
