{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://agent.pricerightdigital.com/campaign-package-schema.json",
  "title": "Price Right Digital Campaign Package",
  "description": "A preparation-only campaign package for briefs, channel reuse plans, UTM-safe routing, and handoff notes. It does not prove launch, publishing, sending, boosting, scheduling, routing, or downstream completion.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "package_id",
    "created_at",
    "source_system",
    "source_url",
    "campaign",
    "source_assets",
    "audience",
    "funnel",
    "channel_plan",
    "content_reuse",
    "routing",
    "validation",
    "handoff",
    "downstream_status"
  ],
  "properties": {
    "package_id": {
      "type": "string",
      "description": "Unique campaign package identifier."
    },
    "created_at": {
      "type": "string",
      "description": "ISO 8601 timestamp when the package was created."
    },
    "source_system": {
      "type": "string",
      "description": "System that prepared the package."
    },
    "source_url": {
      "type": "string",
      "description": "URL where package preparation originated."
    },
    "campaign": {
      "type": "object",
      "description": "Campaign planning summary. Do not treat it as launch evidence.",
      "additionalProperties": false,
      "required": [
        "campaign_name",
        "campaign_class",
        "objective",
        "start_window",
        "end_window",
        "primary_cta",
        "destination_url",
        "campaign_notes"
      ],
      "properties": {
        "campaign_name": {
          "type": "string",
          "description": "Machine-safe campaign name. Use lowercase or underscore formats for UTM use."
        },
        "campaign_class": {
          "type": "string",
          "enum": [
            "inventory_push",
            "seasonal_prep",
            "show_or_event",
            "clearance",
            "service",
            "owner_proof",
            "review_capture",
            "newsletter_list_growth",
            "reactivation",
            "general_reference"
          ],
          "description": "Campaign category."
        },
        "objective": {
          "type": "string",
          "description": "Planning objective without invented performance claims."
        },
        "start_window": {
          "type": "string",
          "description": "Planned timing window start, if known."
        },
        "end_window": {
          "type": "string",
          "description": "Planned timing window end, if known."
        },
        "primary_cta": {
          "type": "string",
          "description": "Primary call to action. Shopper CTAs must route to pricerightrv.com."
        },
        "destination_url": {
          "type": "string",
          "format": "uri",
          "description": "Destination URL for shopper or internal routing."
        },
        "campaign_notes": {
          "type": "string",
          "description": "Planning notes. Do not claim launch or downstream execution."
        }
      }
    },
    "source_assets": {
      "type": "array",
      "description": "Validated or proposed source assets used for planning.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "asset_id",
          "asset_type",
          "source_url",
          "source_status",
          "verification_status",
          "allowed_reuse",
          "blocked_reuse",
          "notes"
        ],
        "properties": {
          "asset_id": {
            "type": "string",
            "description": "Source asset identifier."
          },
          "asset_type": {
            "type": "string",
            "enum": [
              "inventory_reference",
              "review_proof",
              "newsletter_issue",
              "campaign_brief",
              "show_page",
              "service_page",
              "landing_page",
              "verified_source",
              "internal_note"
            ],
            "description": "Source asset type."
          },
          "source_url": {
            "type": "string",
            "description": "Source URL or internal reference."
          },
          "source_status": {
            "type": "string",
            "description": "Current source status as known from approved evidence."
          },
          "verification_status": {
            "type": "string",
            "enum": [
              "verified",
              "verified_but_time_sensitive",
              "unverified",
              "not_claimed",
              "blocked",
              "needs_human_review"
            ],
            "description": "Verification status for the asset."
          },
          "allowed_reuse": {
            "type": "array",
            "description": "Allowed reuse opportunities supported by source evidence.",
            "items": {
              "type": "string",
              "description": "One item."
            }
          },
          "blocked_reuse": {
            "type": "array",
            "description": "Reuse opportunities blocked by missing evidence or policy.",
            "items": {
              "type": "string",
              "description": "One item."
            }
          },
          "notes": {
            "type": "string",
            "description": "Source notes and limitations."
          }
        }
      }
    },
    "audience": {
      "type": "object",
      "description": "Planning audience. Do not include private customer data.",
      "additionalProperties": false,
      "properties": {
        "audience_name": {
          "type": "string",
          "description": "Audience label."
        },
        "audience_notes": {
          "type": "string",
          "description": "Non-private planning notes."
        },
        "excluded_segments": {
          "type": "array",
          "description": "Segments excluded due to policy, privacy, or relevance.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        }
      }
    },
    "funnel": {
      "type": "object",
      "description": "Funnel planning fields.",
      "additionalProperties": false,
      "required": [
        "funnel_stage",
        "buyer_intent",
        "message_angle",
        "proof_type"
      ],
      "properties": {
        "funnel_stage": {
          "type": "string",
          "enum": [
            "tof",
            "mof",
            "bof",
            "retention",
            "reactivation"
          ],
          "description": "Funnel stage."
        },
        "buyer_intent": {
          "type": "string",
          "description": "Assumed intent level for planning only."
        },
        "message_angle": {
          "type": "string",
          "description": "Draft message angle based on validated facts."
        },
        "proof_type": {
          "type": "string",
          "description": "Proof type such as verified source, approved review proof, or internal reference."
        }
      }
    },
    "channel_plan": {
      "type": "object",
      "description": "Channel status map. Published confirmation requires downstream evidence.",
      "additionalProperties": false,
      "required": [
        "facebook",
        "instagram",
        "google_business_profile",
        "youtube",
        "youtube_shorts",
        "newsletter",
        "sms",
        "paid_search",
        "paid_social",
        "landing_page",
        "internal_only"
      ],
      "properties": {
        "facebook": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for facebook. Do not mark published_confirmed without downstream confirmation."
        },
        "instagram": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for instagram. Do not mark published_confirmed without downstream confirmation."
        },
        "google_business_profile": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for google_business_profile. Do not mark published_confirmed without downstream confirmation."
        },
        "youtube": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for youtube. Do not mark published_confirmed without downstream confirmation."
        },
        "youtube_shorts": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for youtube_shorts. Do not mark published_confirmed without downstream confirmation."
        },
        "newsletter": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for newsletter. Do not mark published_confirmed without downstream confirmation."
        },
        "sms": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for sms. Do not mark published_confirmed without downstream confirmation."
        },
        "paid_search": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for paid_search. Do not mark published_confirmed without downstream confirmation."
        },
        "paid_social": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for paid_social. Do not mark published_confirmed without downstream confirmation."
        },
        "landing_page": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for landing_page. Do not mark published_confirmed without downstream confirmation."
        },
        "internal_only": {
          "type": "string",
          "enum": [
            "requested",
            "allowed",
            "blocked",
            "not_requested",
            "drafted",
            "handed_off",
            "published_confirmed"
          ],
          "description": "Planning status for internal_only. Do not mark published_confirmed without downstream confirmation."
        }
      }
    },
    "content_reuse": {
      "type": "object",
      "description": "Content reuse planning and validators.",
      "additionalProperties": false,
      "required": [
        "primary_reuse_opportunities",
        "blocked_reuse_opportunities",
        "required_validators",
        "channel_variants",
        "meaning_preservation_notes",
        "compliance_notes"
      ],
      "properties": {
        "primary_reuse_opportunities": {
          "type": "array",
          "description": "Reuse ideas supported by validated sources.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        },
        "blocked_reuse_opportunities": {
          "type": "array",
          "description": "Blocked reuse ideas due to missing evidence or policy.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        },
        "required_validators": {
          "type": "array",
          "description": "Validators needed before claims or handoff.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        },
        "channel_variants": {
          "type": "object",
          "description": "Draft channel variant notes only.",
          "additionalProperties": {
            "type": "string"
          }
        },
        "meaning_preservation_notes": {
          "type": "string",
          "description": "How source meaning will be preserved across variants."
        },
        "compliance_notes": {
          "type": "string",
          "description": "Compliance, privacy, and hard-contract notes."
        }
      }
    },
    "routing": {
      "type": "object",
      "description": "UTM and destination routing.",
      "additionalProperties": false,
      "required": [
        "official_customer_site",
        "destination_url",
        "utm_source",
        "utm_medium",
        "utm_campaign",
        "utm_content",
        "utm_term",
        "routing_notes"
      ],
      "properties": {
        "official_customer_site": {
          "type": "string",
          "format": "uri",
          "description": "Official shopper site."
        },
        "destination_url": {
          "type": "string",
          "format": "uri",
          "description": "CTA destination. Shopper actions must point to pricerightrv.com."
        },
        "utm_source": {
          "type": "string",
          "description": "UTM source, lowercase and non-private."
        },
        "utm_medium": {
          "type": "string",
          "description": "UTM medium for the channel."
        },
        "utm_campaign": {
          "type": "string",
          "description": "UTM campaign, lowercase with underscores."
        },
        "utm_content": {
          "type": "string",
          "description": "UTM content, if used. Do not include private data."
        },
        "utm_term": {
          "type": "string",
          "description": "UTM term, if used. Do not include private data."
        },
        "routing_notes": {
          "type": "string",
          "description": "Routing QA notes. UTM values do not prove conversion or launch."
        }
      }
    },
    "validation": {
      "type": "object",
      "description": "Validation requirements before handoff or claims.",
      "additionalProperties": false,
      "required": [
        "fact_integrity_required",
        "compliance_required",
        "style_required",
        "routing_qa_required",
        "hard_contract_required",
        "validation_status",
        "missing_evidence"
      ],
      "properties": {
        "fact_integrity_required": {
          "type": "boolean",
          "description": "Whether fact-integrity checks are required."
        },
        "compliance_required": {
          "type": "boolean",
          "description": "Whether compliance checks are required."
        },
        "style_required": {
          "type": "boolean",
          "description": "Whether style checks are required."
        },
        "routing_qa_required": {
          "type": "boolean",
          "description": "Whether routing QA is required."
        },
        "hard_contract_required": {
          "type": "boolean",
          "description": "Whether strict no-unsupported-claims contract applies."
        },
        "validation_status": {
          "type": "string",
          "enum": [
            "draft",
            "planning_only",
            "ready_for_handoff",
            "blocked_missing_required_fields",
            "blocked_missing_source_evidence",
            "needs_human_review",
            "failed_validation"
          ],
          "description": "Validation state."
        },
        "missing_evidence": {
          "type": "array",
          "description": "Evidence still missing before claims or handoff.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        }
      }
    },
    "handoff": {
      "type": "object",
      "description": "Prepared handoff. This is not execution.",
      "additionalProperties": false,
      "required": [
        "handoff_name",
        "source_run_id",
        "owner_team",
        "target_system",
        "payload_summary",
        "required_fields",
        "missing_fields",
        "next_human_or_system_action",
        "handoff_status"
      ],
      "properties": {
        "handoff_name": {
          "type": "string",
          "description": "Handoff name."
        },
        "source_run_id": {
          "type": "string",
          "description": "Source run or preparation ID."
        },
        "owner_team": {
          "type": "string",
          "description": "Responsible owner team."
        },
        "target_system": {
          "type": "string",
          "description": "Target system for a later approved handoff."
        },
        "payload_summary": {
          "type": "string",
          "description": "Safe summary of prepared payload."
        },
        "required_fields": {
          "type": "array",
          "description": "Fields required for handoff.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        },
        "missing_fields": {
          "type": "array",
          "description": "Missing handoff fields.",
          "items": {
            "type": "string",
            "description": "One item."
          }
        },
        "next_human_or_system_action": {
          "type": "string",
          "description": "Next required approved action."
        },
        "handoff_status": {
          "type": "string",
          "enum": [
            "drafted",
            "ready_for_handoff",
            "handed_off",
            "awaiting_downstream_confirmation",
            "downstream_confirmed",
            "failed_downstream",
            "archived"
          ],
          "description": "Handoff status."
        }
      }
    },
    "downstream_status": {
      "type": "string",
      "enum": [
        "not_sent",
        "handed_off",
        "awaiting_confirmation",
        "confirmed",
        "failed"
      ],
      "description": "Downstream status. Do not mark confirmed without direct evidence."
    }
  }
}
