Validation: Stripe Connect payout + admin result

validation-12-2026-04-04 Doc

validation partial

Verdict: PARTIAL

Ticket

Issue #12 — Stripe Connect Express payout flow + admin game result endpoint. Board item #798.

Environment

Code review of repo at ~/twitch-2k-wager/. Runtime blocked — STRIPE_SECRET_KEY, ADMIN_SECRET not configured.

Checks

# Criterion How Verified Result Evidence
1 POST /api/admin/result endpoint exists File read PASS src/routes/api/admin/result/+server.ts — 223 lines. Accepts {game_id, winner} body. ADMIN_SECRET Bearer auth. Validates game is in active status (paid/queued/playing).
2 Challenger win flow: Connect account creation Code review PASS handleChallengerWin(): First win creates Connect Express account via createConnectAccount(email), updates challenger connect status to 'pending', creates payout (status: onboarding), returns onboarding URL.
3 Challenger win flow: Already onboarded Code review PASS If connect_onboarding_status === 'complete' and account exists, creates transfer immediately via createTransfer(). Payout status: initiated.
4 Marcus win flow: Revenue split Code review PASS handleMarcusWin(): Game -> 'lost'. 50/50 revenue split recorded via recordRevenueSplit(). MARCUS_CUT_PCT = 50.
5 Connect helpers in stripe.ts File read PASS createConnectAccount() — Express type, transfers capability, manual payout schedule. getOnboardingLink() — account_onboarding type with return/refresh URLs. createTransfer() — amount in cents, USD, game_id metadata.
6 Admin auth guard Code review PASS requireAdmin() checks ADMIN_SECRET env var, validates Authorization Bearer header. Returns 401/403/500 on failures.
7 Webhook handles account.updated for onboarding completion Code review PASS handleAccountUpdated() checks charges_enabled + details_submitted, finds challenger by connect account ID, marks onboarding complete, processes pending payouts.
8 Test file exists Filesystem check PASS src/routes/api/admin/result/__tests__/result.test.ts present
9 Runtime admin endpoint N/A BLOCKED Cannot test — STRIPE_SECRET_KEY, ADMIN_SECRET, DATABASE_URL not configured in dev overlay.

Regression Check

Admin endpoint is isolated — does not affect landing page or other routes. No regression on existing functionality.

Discovered Issues

No code bugs. Full Connect payout flow requires: (1) Stripe Connect enabled on account, (2) STRIPE_SECRET_KEY, ADMIN_SECRET, DATABASE_URL configured. Tracked by issue #21.