{
  "ok": true,
  "scope": "promotion_reward_repository_preview",
  "status": "blocked_before_live_promotion_reward_repository",
  "date": "2026-06-24",
  "repository": {
    "code": "promotion_reward_repository",
    "status": "preview_promotion_reward_repository_ready",
    "repositoryKind": "promotion_submission_and_reward_repository",
    "readMethods": [
      "listPromotionCampaigns",
      "getPromotionCopyForOwner",
      "getPromotionSubmissionForOwner",
      "listRewardGrantsForOwner",
      "getAdminPromotionQueue",
      "getRewardSettlementPreview"
    ],
    "writeMethods": [
      "generatePromotionCopyFuture",
      "createPromotionSubmission",
      "recordFirstReviewDecision",
      "recordLikeCountEvidence",
      "settleRewardGrantOnce",
      "recordSecondReviewDecision"
    ],
    "liveTables": [
      "promotion_campaigns",
      "promotion_copy_generations",
      "promotion_submissions",
      "promotion_review_events",
      "promotion_reward_grants",
      "points_ledger_entries"
    ],
    "transactionBoundary": "review_or_settlement_decision_then_idempotent_points_grant",
    "idempotencyKey": "submissionId:rewardStage",
    "promotionGate": "promotion_tables_rls_points_ledger_idempotency_like_source_and_admin_review_ready"
  },
  "request": {
    "userId": "preview-user-id",
    "campaignId": "night_ai_referral_v1",
    "platform": "douyin",
    "submissionId": "promotion-submission-preview-001",
    "rewardStage": "second_review",
    "likeCount": 128,
    "likeCountSource": "manual_admin",
    "postUrl": "https://douyin.example.com/video/preview"
  },
  "campaign": {
    "id": "night_ai_referral_v1",
    "title": "夜色同款陪伴体验推荐",
    "platform": "douyin",
    "allowedPlatforms": [
      "douyin",
      "xiaohongshu",
      "kuaishou",
      "wechat_channels"
    ],
    "copyTone": "暧昧陪伴 + 小说互动 + 角色广场",
    "firstReviewRewardRange": "200-1000",
    "secondReviewAfterDays": 7,
    "likeTiers": [
      {
        "minLikes": 0,
        "maxLikes": 50,
        "points": 300
      },
      {
        "minLikes": 51,
        "maxLikes": 100,
        "points": 500
      },
      {
        "minLikes": 101,
        "maxLikes": 200,
        "points": 600
      },
      {
        "minLikes": 201,
        "maxLikes": null,
        "points": "600 + every_extra_100_likes_add_100"
      }
    ]
  },
  "aiCopyPlan": {
    "method": "generatePromotionCopyFuture",
    "status": "blocked",
    "targetTable": "promotion_copy_generations",
    "promptInputs": [
      "campaign_id",
      "role_highlight",
      "app_entry_url",
      "reward_rule_summary"
    ],
    "sampleCopy": "想体验能持续推进剧情的 AI 陪伴？晚风AI 已准备角色广场、小说互动和积分奖励入口。",
    "safetyChecks": [
      "no_platform_impersonation",
      "no_false_cash_reward_claim",
      "no_unapproved_sensitive_content"
    ],
    "notLiveYet": [
      "model_provider_call",
      "copy_generation_history_write"
    ]
  },
  "submissionPlan": {
    "method": "createPromotionSubmission",
    "targetTable": "promotion_submissions",
    "userId": "preview-user-id",
    "submissionId": "promotion-submission-preview-001",
    "postUrl": "https://douyin.example.com/video/preview",
    "statusAfterSubmit": "submitted",
    "userVisibleTimeline": [
      "已提交链接",
      "首审中",
      "首审奖励待发放",
      "7 天后二审",
      "点赞奖励待结算",
      "已结算"
    ]
  },
  "reviewFlow": {
    "firstReview": {
      "method": "recordFirstReviewDecision",
      "decision": "approve_preview",
      "rewardStage": "first_review",
      "points": 600,
      "requiredEvidence": [
        "post_url_accessible",
        "content_matches_campaign",
        "no_obvious_violation"
      ]
    },
    "secondReview": {
      "method": "recordSecondReviewDecision",
      "decision": "approve_preview",
      "rewardStage": "second_review",
      "waitDays": 7,
      "likeCount": 128,
      "likeCountSource": "manual_admin",
      "points": 600,
      "requiredEvidence": [
        "like_count_evidence",
        "review_event",
        "idempotency_key"
      ]
    }
  },
  "rewardGrantPlan": {
    "selectedStage": "second_review",
    "grant": {
      "method": "settleRewardGrantOnce",
      "status": "blocked",
      "rewardStage": "second_review",
      "targetTable": "promotion_reward_grants",
      "ledgerTable": "points_ledger_entries",
      "points": 600,
      "idempotencyKey": "promotion-submission-preview-001:second_review",
      "requiredBeforeGrant": [
        "authenticated_user_id",
        "approved_review_event",
        "reward_grant_not_exists_for_idempotency_key",
        "points_ledger_transaction_ready",
        "admin_actor_or_system_worker"
      ]
    }
  },
  "adminQueuePreview": {
    "queue": "promotion_review_queue",
    "filters": [
      "campaign_id",
      "platform",
      "status",
      "reward_stage",
      "like_count_source"
    ],
    "columns": [
      "submission_id",
      "user_id",
      "campaign_id",
      "platform",
      "post_url",
      "status",
      "like_count",
      "reward_stage",
      "points_to_grant"
    ],
    "sampleRows": [
      {
        "submissionId": "promotion-submission-preview-001",
        "userId": "preview-user-id",
        "campaignId": "night_ai_referral_v1",
        "platform": "douyin",
        "status": "second_review_pending",
        "likeCount": 128,
        "pointsToGrant": 600
      }
    ]
  },
  "readPlan": {
    "ownerSubmission": {
      "method": "getPromotionSubmissionForOwner",
      "source": "promotion_submissions",
      "ownerFilter": "user_id = authenticated_user_id and id = requested_submission_id"
    },
    "ownerRewardGrants": {
      "method": "listRewardGrantsForOwner",
      "source": "promotion_reward_grants + points_ledger_entries",
      "defaultSort": "created_at desc"
    },
    "adminQueue": {
      "method": "getAdminPromotionQueue",
      "source": "promotion_submissions + promotion_review_events + promotion_reward_grants",
      "sensitivePayloadRule": "external platform raw payloads are not exposed in queue rows"
    }
  },
  "blockers": [
    "live_promotion_reward_repository_not_implemented",
    "promotion_tables_not_migrated",
    "promotion_owner_rls_not_verified",
    "points_ledger_promotion_grant_not_live",
    "points_grant_idempotency_not_verified",
    "like_count_source_not_confirmed",
    "ai_copy_model_prompt_not_live",
    "admin_promotion_review_queue_not_live",
    "manual_like_count_evidence_required"
  ],
  "nextStep": "replace preview with promotion submission tables, owner RLS, admin review queue, like-count evidence source, and idempotent points ledger grant",
  "boundaries": [
    "promotion_reward_repository_preview_only",
    "does_not_generate_real_ai_copy",
    "does_not_publish_to_external_platform",
    "does_not_read_external_like_count",
    "does_not_grant_real_points",
    "does_not_write_production_database",
    "does_not_call_model_provider",
    "does_not_call_social_platform_api"
  ]
}