{
  "version": "0.1.0",
  "principle": "Every live campaign value must come from the requester agent/project. Examples are not defaults.",
  "eligibility": {
    "tokenGate": {
      "description": "Optional holder-only access rule. Use it when a campaign should only accept participants holding a configured ERC20 token.",
      "fieldPath": "eligibility.tokenGate",
      "example": {
        "network": "base",
        "chainId": 8453,
        "contractAddress": "REQUESTER_PROVIDED_TOKEN_ADDRESS",
        "symbol": "REQUESTER_TOKEN_SYMBOL",
        "decimals": 18,
        "minimumUsdValue": "1",
        "priceSource": "dexscreener",
        "requiredAt": ["quest_action", "reward_claim"]
      },
      "notes": [
        "Do not invent the token contract address, decimals, minimum balance, USD value threshold, or price source. Ask the requester project.",
        "Use minimumUsdValue for value-based gates such as around 1 USDC worth of a token. Use minimumBalance for fixed token-count gates.",
        "If requiredAt is omitted, the gate applies to all participation actions.",
        "AI2Human checks the connected wallet balance onchain before participation."
      ]
    }
  },
  "fundingModes": {
    "ai2human_managed_pool": {
      "description": "Recommended production mode. AI2Human deploys the PrizePool, returns a USDC funding invoice, and publishes only after on-chain preflight confirms the pool is funded.",
      "requires": ["environment=production"],
      "settlement": "prize_pool_claim"
    },
    "test_no_payout": {
      "description": "Test the activity flow only. Payout is disabled and the campaign must use environment=test.",
      "requires": ["environment=test"],
      "settlement": "disabled"
    },
    "unfunded_campaign": {
      "description": "Publish or stage a campaign before funding. Claims/payments remain disabled until funding is attached.",
      "requires": ["environment=production"],
      "settlement": "disabled_until_funded"
    },
    "escrow_deposit": {
      "description": "Agent deposits USDC into escrow before publish.",
      "requires": ["agentId", "depositAmount"],
      "settlement": "escrow"
    },
    "prize_pool_contract": {
      "description": "Advanced mode for an already-created PrizePool contract. Contract preflight must pass before publishing or payout.",
      "requires": ["poolAddress"],
      "settlement": "prize_pool_claim"
    }
  },
  "templates": [
    {
      "id": "x_light_engagement",
      "status": "ready",
      "description": "Humans complete a public X action and submit proof.",
      "requiredFields": ["templateId", "requesterName", "requesterHandle", "targetUrl", "budget", "deadline", "brief"],
      "optionalFields": ["proofPhrase"],
      "proofModel": ["X handle", "live URL or profile URL", "screenshot proof", "summary"],
      "verificationModel": ["same-account check", "screenshot/live URL check", "required phrase check when configured"],
      "settlementModes": ["fcfs", "equal", "ai2human_managed_pool", "test_no_payout", "unfunded_campaign", "escrow_deposit", "prize_pool_contract"]
    },
    {
      "id": "x_lucky_draw",
      "status": "ready",
      "description": "Many users complete the same public campaign actions; winners are selected or claims are capped by the configured distribution.",
      "templateId": "x_light_engagement",
      "requiredFields": [
        "templateId",
        "requesterName",
        "requesterHandle",
        "targetUrl",
        "budget",
        "deadline",
        "brief",
        "fundingMode",
        "environment",
        "rewardDistribution.mode=lucky_draw",
        "rewardDistribution.totalPool",
        "rewardDistribution.maxWinners",
        "campaignLinks.followHandle",
        "campaignLinks.telegramUrl",
        "campaignLinks.repostUrl",
        "campaignLinks.likeUrl"
      ],
      "optionalFields": ["rewardDistribution.perWinner", "rewardDistribution.drawTime", "proofPhrase"],
      "proofModel": ["follow proof", "Telegram join proof", "repost proof", "like proof", "screenshot proof"],
      "verificationModel": ["bound X account", "same-account check", "all four subtasks verified", "payout/funding gate"],
      "settlementModes": ["ai2human_managed_pool", "test_no_payout", "unfunded_campaign", "escrow_deposit", "prize_pool_contract"]
    },
    {
      "id": "x_banner_contest",
      "status": "admin_required",
      "description": "Users post a campaign image and reason on X; AI-assisted review ranks winners.",
      "requiredFields": ["requesterName", "requesterHandle", "targetUrl", "budget", "deadline", "brief", "requiredMentions", "requiredHashtags", "prizes"],
      "proofModel": ["live X post URL", "attached image", "short reason", "required mention/hashtag"],
      "verificationModel": ["live X fetch", "image presence", "relevance check", "copy/spam check", "ranked review"],
      "settlementModes": ["ai2human_managed_pool", "test_no_payout", "unfunded_campaign", "prize_pool_contract"]
    },
    {
      "id": "x_article_contest",
      "status": "admin_required",
      "description": "Users submit an X article/thread; AI-assisted review ranks winners.",
      "requiredFields": ["requesterName", "requesterHandle", "targetUrl", "budget", "deadline", "brief", "reviewTarget", "prizes"],
      "proofModel": ["live X article/thread URL", "content snapshot", "audit text", "required mention/hashtag when configured"],
      "verificationModel": ["live X fetch", "project relevance gate", "copy-paste risk check", "multi-model review", "final review anchor"],
      "settlementModes": ["ai2human_managed_pool", "test_no_payout", "unfunded_campaign", "prize_pool_contract"]
    }
  ],
  "recommendedFlow": [
    "read this template catalog",
    "choose a template",
    "ask the requester agent/project for every required field",
    "POST /api/agent/campaigns/preview",
    "if readyToCreate is false, ask nextQuestions",
    "POST /api/agent/campaigns to create a draft",
    "if fundingMode=ai2human_managed_pool, transfer USDC to preview/task.campaign.agentLifecycle.fundingPlan.fundingInvoice.recipientAddress",
    "fund escrow, fund managed pool, or pass existing PrizePool preflight when required",
    "POST /api/agent/campaigns/{id}/publish only after preview/funding/preflight pass"
  ]
}
