Appearance
Dependency readiness
Verified against the baseline on 2026-09-12 after backend dev fast-forwarded to 9ae45d7. These are readiness classifications for analytics, not issue closures or proof of deployed behavior. “Blocked” names a specific upstream contract; product questions are in decisions.
A01 is merged in backend #78 at f4ba2c3; A02 and A07 pure slices are merged in #79 (40b3263) and #80 (216fd63). This does not make missing observation, review, funding, earning, hold, payout, fraud, group, or RBAC producers ready; #37/#41/#42/#68 remain open and unassigned.
The #37 producer landed in backend #82 at 5f7c88b: an additive MetricObservation table with stable unique ScrapeJob source ID, immutable attribution, required raw views plus nullable raw engagement metrics, source observedAt/recordedAt, global deterministic sequence, raw-platform/source-time provenance, recorded-order correction disposition, and restrictive source foreign keys. It dual-writes normalized raw observations and legacy budget-clamped ViewSnapshot in one reconciliation transaction; bridge-backed initial submissions write in their creation transaction, while legacy/direct initial paths remain partial. Migration precedes the writer, old versions remain compatible, rollback retains facts, and no legacy backfill or fabricated scraped_at is allowed. Focused offline tests, build, schema validation, and diff checks pass; fresh/upgrade disposable PostgreSQL evidence remains required. This prerequisite is outside the 17 analytics PR boundaries; A02 remains incomplete until its reader/API and #41/#42 filters land.
Merge-topology correction: backend dev is d937bfe with #86/#87 landed; frontend dev is e4b5f5c with #31 landed. #88/#89/#90 were merged into stale feature/review-transition-command and are absent from dev. Dev-targeted carry-forward PRs #91 (eaee854, scraper), #92 (9f38877, payout), and #93 (151a80f, history) are open; A07 PR #95 is stacked on #93 and A02 historical status PR #96 is stacked on #95. Disposable PostgreSQL behavioral evidence for transition/history ordering is blocked: no TEST_DATABASE_URL, configured databases are remote/non-test, and local PostgreSQL is down. #41/#42 remain incomplete until the corrected stack merges and database evidence passes.
A02 normalized reader landed in backend #83 at c3568c4, after #82. It reads only normalized facts with a bounded per-submission baseline query, strict caller/scope and asOf checks, and prospective partial coverage; it never unions unkeyed legacy snapshots. Build and focused offline tests pass. Its disposable PostgreSQL behavior test and the #82 migration gates remain unrun, protected routes landed through #85 at 9ae45d7, and #41/#42 still block historical status modes.
The active #41/#42 prerequisite stack is frontend-first and remains open: frontend #31 at 517379e validates expectedStatus, commandId, and denial reason; backend #86/#87 provide the v2 contract and atomic admin transition; dev-targeted carry-forward PRs #91 (eaee854 scraper), #92 (9f38877 payout), and #93 (151a80f history) are OPEN and are not on dev. A07 protected review analytics is in #95 (4a08fe3), stacked on #93: its six review-related suites, build and diff check pass; the route uses bounded canonical event reads, v1/v2 normalization, partial diagnostics, aggregate-before-pagination, and recordedAt ordering. Conflicting campaign attribution is excluded as malformed. It adds no platform filter, current inference, schema or migration, and retains the exact SUBMISSION_MODERATION TODO. A02 historical status is PR #96 (d113a4e), stacked on #95, with frozen cohort scope: per-submission history uses (occurredAt, recordedAt, eventId), no prior event is unknown, and malformed, campaign-conflicting, or discontinuous history makes that submission unknown; historical mode performs no current-accepted query. Its 11 analytics/routes suites, creator-route checks, build and diff check pass; no migration or RBAC map changed. #41/#42 remain incomplete, #68 normalized accountability coverage remains a blocker, and disposable PostgreSQL ordering behavior remains blocked by the missing loopback _test database. The payout-review adapter branch remains an independent sibling; no active Discord review writer exists because the dashboard owns that path.
| Dependency | Classification | Verified state / smallest prerequisite | Responsible issue / analytics gate |
|---|---|---|---|
| Tracking lifecycle | Ready and verified in code | Creation-based, moderation-independent expiry/cadence, active-job coalescing, transactional application guard; preserve #71. | #24 closed; no rebuild. |
| Worker operation/recovery | Partially ready | Three platform executors, claim leases, stale-owner CAS exist. Lease renewal, aligned outcome taxonomy, supervised deployment/crash smoke unproven. | #36; scraper #8 only if shared-host worker isolation applies. Release coverage gate, not blocker to offline analytics contracts. |
| Metric history | Partially ready | Snapshots retain views/likes/comments/shares; same tracking job cannot apply twice transactionally. A02 #79 now supplies pure deterministic projection and labelled legacy adaptation. Missing canonical source/job identity, source versus recorded time, correction ordering, atomic initial observation, saves/followers support contract. | #37. Complete observed-time reads wait for this producer and historical status filters also require #41/#42. |
| Precise rates | Ready and verified | Immutable CampaignRateVersion/SubmissionRateVersion, DECIMAL(20,6), exact resolver, backfill, provenance, audited appends. Eleven focused offline tests passed this session. | #60/#61 closed; group candidate persistence is separate. |
| Funding | Missing | String budget is configuration; no invoice/payment/funding journal or verified allocations. Need exact net credited/allocated facts with unique provider source and timestamps. | #31–#33. Required before A03 can report verified funding; invoice UI stays outside analytics. |
| Funded lifecycle | Partially ready | Launch/pause/end/archive routes and flags exist; no atomic funding gate/canonical economic intervals. #34/#35 have a body-defined cycle. | #34/#35. Agree pure transition + funding-read interface, then stack launch gate; do not wait on both as black boxes. |
| Earnings and budget | Missing authoritative facts | CPM-aware calculators and a tracking campaign lock exist; no immutable earning/spend journal, unique economic source, or single atomic invariant across writers. | #53/#54. A03 blocked on these plus funding/history contracts. |
| Payout accounting | Blocked | Legacy Payout/PayoutItem history exists; approval advances cumulative paid counters before send. No durable earning reservations/allocations/provider-operation state machine. | #56/#59, then #57/#58. Blocks authoritative paid/held/reserved in A03–A06. |
| Whop money movement | Unclear and requiring a decision / external verification | Existing Whop identity/chat SDK is not payment-recipient proof. Provider capability, sandbox and policy gates lack fresh evidence here. | Separate payout owner and Phase 0; does not block fixture/read-interface work. No provider assumptions or requests sent this session. |
| Group membership | Partially ready | Campaign ownership, interval history, archival, locks/indexes exist. Real membership writes hit UUID validation despite CUID storage. | #76 is a separate small prerequisite before group mutation/integration fixtures; source-level defect verified. Reported 15 failed integration tests were not rerun here. |
| Group rates / attribution | Missing persistence/integration | Resolver accepts time-bounded group candidates, but no group rate model/loader. Membership cohort rules selected in financial contract; no historical identity guessing. | #26/#27; #28 delivered through A09/A16 after relevant facts exist. |
| Review | Partially ready | Queue, current track record and canonical status audit producer exist. A07's pure projection and protected route are in #80 and #95 (4a08fe3), stacked on #93; normalized v1/v2 reads, partial diagnostics, aggregate-before-pagination, malformed conflicting campaign exclusion and recorded-time ordering are covered by six review suites plus build/diff checks. A02 historical status is in #96 (d113a4e), stacked on #95, with exact per-submission unknown behavior and no current-accepted query in historical mode; 11 analytics/routes suites, creator-route checks, build and diff check pass. Frontend A14 is PR #33 (97f7662), open/clean/mergeable on feature/review-analytics-ui → dev; it separates committed-event summaries from queue state and implements UTC exclusive-to/campaign/status filters, aggregate/day buckets, lazy history, stable asOf pagination, explicit partial/unavailable/unknown actor labels, full reasons and invalidation after successful moderation. Reviewer filtering is absent because the backend contract does not expose it. #41/#42/#51/#52/#63/#68 remain OPEN and unassigned (revalidated 2026-09-12); #91/#92/#93/#95/#96/#33 remain open, and disposable PostgreSQL ordering evidence plus DB/manual/browser evidence remain outstanding. | #41, #42, #43, coordinated with #68. A07/A02/A14 remain in progress; do not claim completion from branch tests alone. |
| Fraud / finality | Missing, policy gate | Heuristic badges and payout decisions exist; no durable evaluations/holds/resolutions/recovery ledger. Bulk approval does not exclude auto-badges. | #55; D-01/D-02/D-03. A08 and payout finalization blocked. |
| Sponsor reports | Ready and verified current feature; financial coverage partial | Token grants, bounded signed snapshot timeline, approved metrics, recorded completed gross allocations, privacy controls exist. Not shared with admin detail; legacy allocation coverage can be incomplete. | #67 closed. A10 reuses shared reads without recreating link management. |
| Audit events | Ready and verified foundation; producers partially ready | Canonical append-only store/targets, idempotency and transaction-aware recorder; legacy stores retired. Backend #86 requires the v2 event contract without a migration; stacked #87 supplies atomic admin transition, current CPM clamp, notification, and event. Domain-specific payout/funding producers remain. | #30 closed; #68 owns contextual/producers, with #41/#53/etc. No generic audit UI rewrite. |
| RBAC | Partially ready, separately owned | Hybrid capabilities and owner/grant UI landed. Business policies remain pending; old business owner guard defect remains. | #75/#77, frontend #29. Foundation analytics proceeds with current guards and explicit TODOs. |
| Private creator access | Missing enforcement on current campaign reads | /api/campaigns routes remain unauthenticated. Existing memberships are enough for access owner to work; analytics must not expose new sensitive data there. | #50, outside analytics. Creator finance uses own authenticated endpoints; private-campaign release coordinates this gate. |
Contracts to request from upstream owners
“Request” means orchestration handoff in this workspace; do not message people or post on GitHub without explicit authorization.
| Producer | Minimum stable export needed | Safe work while absent |
|---|---|---|
| #37 | Observation ID/source ID, submission/platform, observed/recorded time, nullable metrics, baseline/order/correction disposition; append/replay guarantees. | A01 fixtures; A02 pure reader tests with labelled legacy coverage, no invented source time or status history. |
| #31/#33/#34/#35 | Exact receipts and campaign allocations, adjustments, verified state/effective time, lifecycle earning intervals; available committed balance. | Pure funding DTO/projection tests; no reported funded number from budget text. |
| #53/#54/#27 | Exact earning/spend/adjustment entries, creator/campaign/submission/funding provenance, eligible interval, resolved rate and membership source, posting time, source uniqueness. | A01 contracts; independent performance work. |
| #55 | Hold/evaluation/resolution IDs, affected entry amounts, reason category, rule version, occurrence time and effective finality state; recovery assessments. | Risk DTO fixtures; no live hold count from badges. |
| #56–#59 | Amount-level reservation/paid/released allocations, stable operation, gross/net/deduction mapping, provider evidence and event times, recovery/offset state. | History serialization fixtures; preserve and label recorded legacy gross allocations. |
| #41/#42/#68 | One reliable committed transition per command with canonical actor, target, from/to state, reason, time, and ordering; historical coverage boundary. Dev-targeted carry-forwards #91/#92/#93 are open and off dev; A07 #95 is stacked on #93. | A07 protected route/tests and A02 historical status branch can proceed as review-ready work, but #41/#42 remain incomplete and current queue stocks remain separately labelled. Rebase as parents land and run disposable PostgreSQL behavioral evidence for transition/history ordering before claiming A07/A02 completion. |
| #75/#77 | Reviewed attachment decision at named routes, fail-closed behavior, owner-access release evidence. | All analytics contracts/read code behind existing guards; no central-policy edits. |
Schema changes for these producers stay in their existing MVP workstreams. Apply migration rules before scheduling their migrations or enabling new writers. Analytics units themselves require no migration by default; add indexes only with measured query evidence and a separate reviewed rollout.