Skip to content

Historical snapshot archived 2026-09-25. This records an earlier review or plan, not current implementation or live ticket state. For current work, follow root AGENTS.md, the relevant BloxClips skill, and owning repository source/tests. Preserve approved decisions as evidence; verify their present authority before acting.

Investigation Notes ​

Audit trail maintained during documentation.


Confirmed ​

AreaFindingEvidence
Submission createValidates URL, campaign, platform, duplicates, account ownershipsubmissions.ts:237-539
Submission createReturns 412 if LinkedSocialAccount missingsubmissions.ts:443-452
Submission createReturns 403 if account owned by another usersubmissions.ts:454-459
Submission createCreates PENDING + initial ViewSnapshotsubmissions.ts:474-527
Admin acceptBudget pre-check (100% hard block)admin.ts:1498-1515
Admin acceptSets acceptedAt, nextPollAt=nowadmin.ts:1518-1527
Admin acceptBudget clamp may freeze campaignadmin.ts:1537-1572
Admin acceptAuto-close at 95%admin.ts:1574-1580
Admin acceptCreates UserNotificationadmin.ts:1582-1596
Admin acceptAudit logadmin.ts:1599-1617
Tracking tickRuns every 30 minscheduler.ts:32
Tracking tick12h/24h adaptive cadencepollScheduler.ts:13-17
Tracking tickYouTube batch (50), TikTok/IG Apify batchrunTrackingTick.ts
Tracking tickBudget clamp per scraperunTrackingTick.ts:74
Tracking tick3 failures → FLAGGED + trackingStoppedAtrunTrackingTick.ts:121-137
Tracking tickExpiry at acceptedAt + trackingDurationDaysrunTrackingTick.ts:178-187
Payout requestCooldown 24h, daily rescrape cap 200payouts.ts:279, 304
Payout requestCreates Payout(REQUESTED) → async rescrapepayouts.ts:419-453
Payout rescrapeDelta math: payableViews - priorPaidViewsprocessRequest.ts:146
Payout rescrapeBudget clamp appliedrescrape.ts:88
Payout approveBumps paidViewsTotal/paidAmountTotaladminPayoutReview.ts:499-509
Payout approveSticky status: REJECTED→DENIED, FLAGGED→FLAGGEDadminPayoutReview.ts:486-497
Payout approveTax form snapshot + affiliate sweepadminPayoutReview.ts:514-557
Payout sendTOTP required, dispatch to railadminPayoutReview.ts:714-822
Payout send failTerminal: reverts paid-totals, reverses affiliateadminPayoutReview.ts:843-865
Budget clampFirst-come-first-earned by createdAtcampaignBudget.ts:183-184
Budget clampBurn multiplier = 1/(1-fee)fees.ts:burnMultiplier
Earnings calcThreshold gate (minViews) → $0calculateSubmissionEarnings.ts:126-133
Account verificationRequired per platform/accountLinkedSocialAccount unique constraint
Discord approvalLegacy code removed/commentedsubmissions.ts:37-124, buttonHandler.ts:155-158
Email gateDisabled in frontend + backendSubmitVideoModal.tsx:285-290, submissions.ts:270-284

Suspected ​

AreaHypothesisWhy
Admin self-reviewAdmin can accept own submissionNo ownership check in admin.ts:1459
Tax form snapshot timingSnapshot at approve may stale by sendadminPayoutReview.ts:514-521 captures at approve
Affiliate sweep timingSweep at approve, not sendadminPayoutReview.ts:545-557
YouTube quota exhaustionNo monitoring/circuit breakeryoutube.ts has no quota handling
Apify cost enforcementTracker exists but no limitscostTracker.ts records only
Race condition budget acceptPre-check + clamp not atomicadmin.ts:1498-1572 two separate operations
Tracking stop scatteredMultiple paths set trackingStoppedAtrunTrackingTick.ts, adminPayoutReview.ts
Frozen campaign submitviewsFrozen not checked on createsubmissions.ts:291 missing check
ViewSnapshot for deniedCreated at PENDING, never cleanedsubmissions.ts:515-527
DELETE submission endpointFrontend calls, backend exists with gapsadmin.ts:3039

Unknown ​

QuestionImpact
What happens if campaign deadline passes but active=true?Scheduler closes it (scheduler.ts:48-55)
Can trackingDurationDays be 0 or negative?Schema: Int @default(30), no constraint
How is creatorHandle populated for YouTube?youtube.ts returns creatorHandle from API
What if manualViewCount < frozenViewCount?Priority: manual > frozen > current (consistent)
Does customRate override for both short/long?Yes, single field overrides campaign default
Can customViewCap exceed campaign cap?Yes, admin can set any value
What if frozenViewCount set but campaign not frozen?Possible via manual admin action
How are previewVideoUrl/previewImageUrl used?Frontend embed preview (SubmissionReviewRow)
Is Submission.duration ever used?Stored, not used in earnings
What triggers Campaign.paused?Manual admin, no auto
Can acceptingSubmissions be true while viewsFrozen=true?Yes, separate flags; tick checks both
What happens to PayoutItem on payout REJECTED?Stays with decision=REJECTED, submission DENIED
How are ReferralCommission linked to payout?sourcePayoutId unique on ReferralCommission
Is there a max customRate?Validation: 0-1000 (schemas.ts:79)
What if ratePerK = 0?Earnings = 0, budget not consumed
Can platformFeeRate > 0.99?Schema: max 0.99

Contradictions ​

ContradictionLocation ALocation B
"Approved" vs "Accepted"Frontend: getStatusBadge shows "Accepted" for ACCEPTEDPayout: APPROVED decision, COMPLETED status
"Rejected" vs "Denied"Submission: DENIEDPayout: REJECTED status + REJECTED decision
"Pending" meaningSubmission: PENDINGPayout: REQUESTED/SCRAPING/READY_FOR_REVIEW/AWAITING_SEND
Email gateBackend: commented outFrontend: commented out (both disabled)
Discord approvalsubmissions.ts: commented functionbuttonHandler.ts: returns "use dashboard"
Legacy vs delta payoutSubmission.paidOut (legacy)Submission.paidViewsTotal (delta)
paidAmount vs paidAmountTotalLegacy single amountDelta cumulative
ViewSnapshot for all statusesCreated at PENDINGOnly ACCEPTED tracked thereafter
trackingStoppedAt set onExpiry, 3 failures, payout reject/flagMultiple code paths
frozenViewCount prioritymanual > frozen > currentConsistent across 4+ locations
campaign.viewsFrozen vs acceptingSubmissionsSeparate flagsBoth checked in tick query

Questions for the Team ​

  1. Email gate: Intent to re-enable? If so, when?
  2. DELETE submission: Should admin be able to delete? Soft delete vs hard?
  3. Banned user submit: Add ban check to POST /api/submissions?
  4. Rejection reason on submission: Add rejectionReason field to Submission model?
  5. Self-review prevention: Block admin from reviewing own submissions?
  6. Legacy payout migration: Plan to migrate paidOut=true to delta flow?
  7. Apify cost limits: Add daily/monthly caps per user?
  8. YouTube quota monitoring: Add quota tracking + alerting?
  9. Fraud badges in tracking tick: Compute badges continuously, not just at payout?
  10. Tracking stop consolidation: Single stopTracking(submissionId, reason) function?
  11. ViewSnapshot cleanup: Delete snapshots for DENIED/FLAGGED submissions?
  12. Frozen campaign submit check: Block submissions to viewsFrozen campaigns?
  13. Status enum: Move to Prisma enum or shared constant?
  14. Custom rate/cap validation: Prevent values that break budget math?
  15. Payout item badge action: Auto-flag items with VIEW_SPIKE/LOW_LIKE_RATIO?
  16. Tax form snapshot at send: Move snapshot capture to send time?
  17. Affiliate sweep at send: Move sweep from approve to send?
  18. Race condition budget: Wrap accept+clamp in transaction?
  19. addedByAdmin field: Remove or implement admin manual add?
  20. messageId field: Remove legacy Discord field?
  21. Integration tests: Priority for runTrackingTick, processPayoutRequest?
  22. Rate limit submission create: Add userLimiter to POST /api/submissions?
  23. Cross-campaign cooldown: Increase from 10 min?
  24. Campaign viewsFrozen re-open: Only at <95%? What if manual view reduction?
  25. duration field: Remove or use for long/short classification?