Appearance
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.
| Repository | Full inspected commit |
|---|---|
| Bloxclips-backend | 226381bdef25f92a77d01f406e993c4c50f9350b |
| BloxClips-frontend | 907963f1f440f30a135c952950166d5d4ea469ef |
| metric-scraper | 7fedb346f3fb9520ad380e5b9eaab5791ee97d96 |
Source anchors
| ID | Finding | Code | Verified implication |
|---|---|---|---|
| E01 | Creator current-value finance | src/api/routes/stats.ts; campaign stats | Overview 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. |
| E02 | Hybrid inferred charts | src/utils/viewSnapshots.ts; src/api/routes/stats.ts | Reader 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. |
| E03 | Creator payout reads | src/api/routes/payouts.ts; history | Balance 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. |
| E04 | Public campaign finance | src/api/routes/campaigns.ts; public mount | No 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. |
| E05 | Staff CPM/RPM mismatch | campaign list calculation; campaign detail calculation | List 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. |
| E06 | Approval versus actual payment | approval transaction; send handler; src/utils/rails/dispatcher.ts | Approval 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. |
| E07 | Staff summaries and creator identities | user earnings; stats | Current 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. |
| E08 | Submission estimates and leaderboard | src/api/routes/submissions.ts; leaderboard | Submissions 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. |
| E09 | Observation producer and legacy loss | src/utils/tracking/scrapeJobs.ts; initial create; snapshot model | Campaign 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. |
| E10 | Sponsor scope and payment basis | src/utils/campaignReports/domain.ts; src/api/routes/adminCampaignReports.ts | RepeatableRead, 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. |
| E11 | Review producer reliability | status transition; status audit; unbounded sort | Separate 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. |
| E12 | Fraud signals are advisory | src/utils/payouts/badges.ts; bulk approval | Low-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. |
| E13 | Group temporal foundation and actual defect | prisma/schema.prisma; locking; audit schema | Campaign-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. |
| E14 | Creator overview presentation | features/overview/api/overview.ts; surfaces/content-rewards/screens/overview/components/SnapshotPanel.tsx; surfaces/content-rewards/screens/overview/components/PayoutPanel.tsx | Current overview fetches stats/list/leaderboard/recent submissions/balance; fixed SVG sparkline and vs-yesterday copy; balance panel consumes clipper-only values. |
| E15 | Creator campaigns and rate labels | features/campaigns/lib/formatters.ts; surfaces/content-rewards/screens/campaigns/CampaignDetailScreen.tsx; features/campaigns/components/CampaignPayoutRequirements.tsx | Card 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. |
| E16 | Creator page-only history summary | features/submissions/hooks/useSubmissionHistory.ts; surfaces/content-rewards/screens/submissions/components/SubmissionHistorySummary.tsx | Ten-row page, current-page search, summary reduces loaded rows; earned amount is estimatedEarnings on current ACCEPTED rows. UI copy can imply confirmed payouts. |
| E17 | Creator payout consumers | features/payouts/types.ts; surfaces/content-rewards/screens/payouts/components/PayoutBalanceCard.tsx; surfaces/content-rewards/screens/payouts/components/PayoutHistoryCard.tsx | Payout page chooses combinedNet/combinedEligible; history lacks campaign allocation/gross-net detail and pagination. |
| E18 | Staff overview/chart consumers | features/admin/dashboard/hooks/useAdminDashboardData.ts; surfaces/content-rewards/screens/admin/overview/components/AdminPerformancePanel.tsx; surfaces/content-rewards/components/DashboardChart.tsx | Chart 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. |
| E19 | Staff campaign filters/sort | features/admin/campaign-detail/api/adminCampaignDetail.ts; features/admin/campaign-detail/hooks/useAdminCampaignDetail.ts; surfaces/content-rewards/screens/admin/campaign-detail/components/AdminCampaignDetailHeader.tsx | Handwritten numeric totalSpent; page=50 and client sort only current page; no complete funding/spend/expense/payout fields. |
| E20 | Review frontend | features/admin/submissions/api/adminSubmissions.ts; features/admin/submissions/types.ts | Queue/status/mutation/snapshots consumers exist, but no reliable review event/actor/time analytics contract. |
| E21 | Risk/payout staff frontend | features/admin/payout-list/hooks/useAdminPayoutList.ts; features/admin/payout-detail/types.ts; features/admin/payout-detail/hooks/useAdminPayoutDetail.ts | PageTotalAmount 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. |
| E22 | Group frontend | features/admin/clipper-groups/types.ts; features/admin/clipper-groups/api/adminClipperGroups.ts | Campaign/archive/roster/history contracts exist; no group/member financial or performance aggregation. |
| E23 | Tests and migration baseline | scripts/runTests.cjs; src/utils/rates/domain.test.ts; tests/public-report-api.test.mjs | Offline 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. |
| E24 | RBAC and frontend navigation | src/utils/rbac/actionPolicy.ts; src/utils/whopStaffAuthorization.ts; surfaces/content-rewards/lib/dashboardAccess.ts; surfaces/content-rewards/hooks/useDashboardSession.ts | Finance/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. |
| E25 | Exact rates already landed | src/utils/rates/domain.ts; src/utils/rates/history.ts; prisma/schema.prisma | Exact 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. |
| E26 | Scraper main worker | src/results/normalize.ts; src/worker/job-repository.ts; src/worker/worker.ts | Normalized 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
| Feature | Evidence | Limit |
|---|---|---|
| Precise rates | Backend #70, frontend #23/#25 | Resolver/configuration delivered, not durable earnings/funding or every frontend consumer. |
| Continuous lifecycle / YouTube | Backend #71, scraper #1 | Preserve moderation-independent tracking. Deployment/renewal/provenance remain separate. |
| Canonical audit / migration reconciliation | Backend #69, #72, frontend #22 | Legacy stores retired in code/migrations. Historical reported backfill counts describe different runs/environments, not expected universal DB counts. |
| Sponsor reports / expiry | Backend #74, frontend #28/#30 | Delivered #67; paid-gross allocation gaps disclosed; shared admin source still A10. |
| Hybrid RBAC | Backend #73, frontend #27 | Foundation landed; #75/#77 and frontend #29 remain; #76 integration defect verified in source. |
| Historical payout generations | Backend commits 981abd2 (delta cashout), later approval/send split in current routes; git log -p -G "totalEarnings \+=" -- src/api/routes/stats.ts inspected | Existing 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
- Cross-repo README, architecture, data model, request/data flows, background jobs, frontend integration, frontend, auth, risks, MVP scope, readiness/backlog, owner decisions. Some older sections are superseded by this source audit.
- Submissions, metrics/tracking, review, payout dependencies, Clipper Groups, audit plan. Use current code for superseded tracking/audit behavior.
- Payout research index, current audit, target architecture, handoff, open policy options, Phase 0. Provider claims/pins remain historical, not newly verified; old precedence/clean-data proposals are not current decisions.
- Backend rate policy, sponsor report, canonical audit, RBAC and verification. Future audit producers must read the linked repository audit skill before implementation.
- Sibling dependency map, waves, conflicts and domain handoffs: tracking/history, precise rates, funding/lifecycle, earnings, payouts, groups, fraud, review, RBAC and analytics. Their broad one-session boundaries are replaced for analytics by the 17-PR plan; other MVP ownership remains separate.
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.