Skip to content

Evidence index ​

Inspected 2026-09-06; links pin source commits rather than mutable branch heads. Key delegated inventory conclusions were checked against these main-worktree code paths by the owner. The temporary agent reports are not required for handoff. No secrets, real report tokens or database rows are included.

RepositoryFull inspected commit
Bloxclips-backend226381bdef25f92a77d01f406e993c4c50f9350b
BloxClips-frontend907963f1f440f30a135c952950166d5d4ea469ef
metric-scraper7fedb346f3fb9520ad380e5b9eaab5791ee97d96

Source anchors ​

IDFindingCodeVerified implication
E01Creator current-value financesrc/api/routes/stats.ts; campaign statsOverview uses current policy/capped estimates and paidOut (146); campaign route has one += at 390, lacks selected manual/frozen fields and resolver use. Historical -G search also shows a single addition; no deletion-of-duplicate fix is attributed.
E02Hybrid inferred chartssrc/utils/viewSnapshots.ts; src/api/routes/stats.tsReader has global hasSnapshots fallback, upload-date/current-value inference, adjacent-day requirement and positive delta clamp. Snapshot-rate selection has improved, but this remains an estimate, not earning postings. Days subtraction plus inclusive loop produces days+1 labels.
E03Creator payout readssrc/api/routes/payouts.ts; historyBalance subtracts approved gross in AWAITING_SEND/PROCESSING/COMPLETED from mutable earnings, then fees it. /me selects 50 operation rows with net amount/time/method only. Referral fields are separate, so overview and full payout page can differ in scope.
E04Public campaign financesrc/api/routes/campaigns.ts; public mountNo auth on list/detail/top route mount. List totalSpent uses current CPM and accepted capped views; budget is parsed string. Do not add new cross-creator liabilities to this public contract.
E05Staff CPM/RPM mismatchcampaign list calculation; campaign detail calculationList uses cpm; detail uses rpm but both return totalSpent. Detail platform/status scopes differ between table and summary. This is directly verified, not merely an issue allegation.
E06Approval versus actual paymentapproval transaction; send handler; src/utils/rails/dispatcher.tsApproval increments paidViewsTotal/paidAmountTotal before AWAITING_SEND; send reads state then unconditionally updates; legacy dispatcher supports Stripe/PayPal/USDT. PayoutItem snapshots rates but amounts remain Float. No Whop operation/allocation journal in schema.
E07Staff summaries and creator identitiesuser earnings; statsCurrent earnings/legacy paid flags power user reads. Stats distinct creator count groups legacy userId, pending payout count only PENDING, raw currentViews and capped effective accepted views are different quantities.
E08Submission estimates and leaderboardsrc/api/routes/submissions.ts; leaderboardSubmissions estimate using current calculator then fee; leaderboard uses submission-created period plus ExternalLeaderboardPayment. Neither proves campaign paid allocation. /stats/campaigns and /stats/chart currently lack creator feature consumers.
E09Observation producer and legacy losssrc/utils/tracking/scrapeJobs.ts; initial create; snapshot modelCampaign advisory lock + appliedAt guard + business writes share transaction. Snapshot stores clamp.finalCurrentViews and now, not source scraped_at; initial snapshot is a later best-effort write. Failures may update lastPolledAt. No snapshot source key, saves/followers or correction provenance.
E10Sponsor scope and payment basissrc/utils/campaignReports/domain.ts; src/api/routes/adminCampaignReports.tsRepeatableRead, 90-day signed LAG with pre-window history, current ACCEPTED metrics, complete grant recheck after assembly. Completed APPROVED item gross is campaign-attributed; legacy detection limited to known linked payouts with no items. Includes creator details when selected (default true in API), not unrestricted financial records.
E11Review producer reliabilitystatus transition; status audit; unbounded sortSeparate read/check/update/budget/audit calls, mixed actor ID, best-effort status event, no full historical transition coverage. Derived sorts load all candidates. Current status/track record cannot prove reviewer throughput.
E12Fraud signals are advisorysrc/utils/payouts/badges.ts; bulk approvalLow-engagement/spike badges are strings, spike uses raw delta rather than elapsed-time velocity, negative deltas clamped. Bulk approval deliberately excludes manual flags, not auto-badges. No durable fraud/hold/finality/recovery models.
E13Group temporal foundation and actual defectprisma/schema.prisma; locking; audit schemaCampaign-owned CUID groups, joinedAt/leftAt intervals, archive and locks exist; no rate model or analytics. Audit groupId/webUserId UUID validation mismatches CUID schema (#76). Historical null identity cannot be reconstructed from names.
E14Creator overview presentationfeatures/overview/api/overview.ts; surfaces/content-rewards/screens/overview/components/SnapshotPanel.tsx; surfaces/content-rewards/screens/overview/components/PayoutPanel.tsxCurrent overview fetches stats/list/leaderboard/recent submissions/balance; fixed SVG sparkline and vs-yesterday copy; balance panel consumes clipper-only values.
E15Creator campaigns and rate labelsfeatures/campaigns/lib/formatters.ts; surfaces/content-rewards/screens/campaigns/CampaignDetailScreen.tsx; features/campaigns/components/CampaignPayoutRequirements.tsxCard prefers exact RPM; detail/requirements retain legacy payout computation labelled CPM. Remaining budget is client parsed/clamped config less totalSpent. Detail finds campaign from listing response.
E16Creator page-only history summaryfeatures/submissions/hooks/useSubmissionHistory.ts; surfaces/content-rewards/screens/submissions/components/SubmissionHistorySummary.tsxTen-row page, current-page search, summary reduces loaded rows; earned amount is estimatedEarnings on current ACCEPTED rows. UI copy can imply confirmed payouts.
E17Creator payout consumersfeatures/payouts/types.ts; surfaces/content-rewards/screens/payouts/components/PayoutBalanceCard.tsx; surfaces/content-rewards/screens/payouts/components/PayoutHistoryCard.tsxPayout page chooses combinedNet/combinedEligible; history lacks campaign allocation/gross-net detail and pagination.
E18Staff overview/chart consumersfeatures/admin/dashboard/hooks/useAdminDashboardData.ts; surfaces/content-rewards/screens/admin/overview/components/AdminPerformancePanel.tsx; surfaces/content-rewards/components/DashboardChart.tsxChart only accepts period/campaign filtering; cards remain global; failed fetch can retain prior chart data. Chart assumes nonnegative scale and divides x by length-1.
E19Staff campaign filters/sortfeatures/admin/campaign-detail/api/adminCampaignDetail.ts; features/admin/campaign-detail/hooks/useAdminCampaignDetail.ts; surfaces/content-rewards/screens/admin/campaign-detail/components/AdminCampaignDetailHeader.tsxHandwritten numeric totalSpent; page=50 and client sort only current page; no complete funding/spend/expense/payout fields.
E20Review frontendfeatures/admin/submissions/api/adminSubmissions.ts; features/admin/submissions/types.tsQueue/status/mutation/snapshots consumers exist, but no reliable review event/actor/time analytics contract.
E21Risk/payout staff frontendfeatures/admin/payout-list/hooks/useAdminPayoutList.ts; features/admin/payout-detail/types.ts; features/admin/payout-detail/hooks/useAdminPayoutDetail.tsPageTotalAmount and selection approvedNet are UI sums, not paid ledger. Existing detailed gross/net/fee/timestamps and badges can be reused; no durable held-liability aggregate.
E22Group frontendfeatures/admin/clipper-groups/types.ts; features/admin/clipper-groups/api/adminClipperGroups.tsCampaign/archive/roster/history contracts exist; no group/member financial or performance aggregation.
E23Tests and migration baselinescripts/runTests.cjs; src/utils/rates/domain.test.ts; tests/public-report-api.test.mjsOffline runner isolates credentials, but some suites assert source text; tests called integration create/delete fixture rows. Rate suites 11 pass and frontend API suite 9 pass this session; no DB/production runtime claims.
E24RBAC and frontend navigationsrc/utils/rbac/actionPolicy.ts; src/utils/whopStaffAuthorization.ts; surfaces/content-rewards/lib/dashboardAccess.ts; surfaces/content-rewards/hooks/useDashboardSession.tsFinance/analytics action policies pending; old owner check defective (#77), new live-roster owner helper exists. Creator shell supports CLIPPER; staff admin path allowlist still limited. Do not recreate old role plan.
E25Exact rates already landedsrc/utils/rates/domain.ts; src/utils/rates/history.ts; prisma/schema.prismaExact rate validation/micro math, effective version selection, highest candidate/ties. groupCandidates is explicit optional input; no persisted group loader. Campaign/individual append immutability is enforced by migration triggers.
E26Scraper main workersrc/results/normalize.ts; src/worker/job-repository.ts; src/worker/worker.tsNormalized nullable broad metrics and scraped_at; three-platform claim/execution; leasedAt+workerId CAS completion. No lease renewal in repository/loop. Deployment/crash recovery not proven. No dev branch exists.

Merged history reviewed ​

FeatureEvidenceLimit
Precise ratesBackend #70, frontend #23/#25Resolver/configuration delivered, not durable earnings/funding or every frontend consumer.
Continuous lifecycle / YouTubeBackend #71, scraper #1Preserve moderation-independent tracking. Deployment/renewal/provenance remain separate.
Canonical audit / migration reconciliationBackend #69, #72, frontend #22Legacy stores retired in code/migrations. Historical reported backfill counts describe different runs/environments, not expected universal DB counts.
Sponsor reports / expiryBackend #74, frontend #28/#30Delivered #67; paid-gross allocation gaps disclosed; shared admin source still A10.
Hybrid RBACBackend #73, frontend #27Foundation landed; #75/#77 and frontend #29 remain; #76 integration defect verified in source.
Historical payout generationsBackend commits 981abd2 (delta cashout), later approval/send split in current routes; git log -p -G "totalEarnings \+=" -- src/api/routes/stats.ts inspectedExisting generations coexist; historical logs do not substantiate the issue’s duplicate-add claim. No current totals certified from historical prose.

Migration files reviewed ​

  • 20260829120000_add_clipper_groups: interval check and active membership partial uniqueness; later campaign scope migrations preserve campaign ownership.
  • 20260831120000_add_scrape_jobs, 20260831213000_hold_tracking_jobs_until_applied: durable queue and outstanding job coalescing.
  • 20260903120000_add_precise_rate_versions, 20260903210000_backfill_precise_rate_versions: exact immutable versions and mandatory neutral existing-policy backfill. Do not rewrite original checksums.
  • 20260903163000_*, 20260903180000_*, 20260903193000_retire_legacy_audit_logs: canonical audit/legacy conversion and retirement. Do not repeat prior destructive actions.
  • 20260905170000_campaign_sponsor_reports: report grant plus nullable nonnegative shares. No invented historical share backfill.
  • Hybrid capability/reconciliation migrations landed through #73/#72. Future owners inspect exact applied migration status on their explicit target; this session did not run migrations.

Canonical documents read / linked context ​

Validation limits ​

Branch refs were fetched; no branch switch, worktree creation, product edit or remote mutation occurred. No database credentials/PII were inspected or copied. Only the two focused offline test invocations in verification were run. Full source/model/history inspection supports implemented/missing findings; it does not certify deployed schema, provider capability or browser readiness.