Product Review — Fight Night (Mar 11)
Post-build review of briefs 001, 003, 004. Code is feature-complete but several product-level gaps need addressing before Wednesday.
Stations at the Event
| Station |
Hardware |
Software |
Status |
| Main Stage |
2 Macs running Slippi netplay |
Arena matchmaking, bracket advancement, prediction pools |
Built. Needs integration test. |
| Bracket Display |
Secondary monitor/projector |
viewer.html — polls arena every 3s, SVG bracket tree, LIVE badges |
Built. QR code for betting in corner. |
| Operator Console |
Mattie's phone or laptop |
admin.html — create tournament, start matches, force-advance |
Built. Missing rematch button. |
| Betting Terminal |
Every spectator's phone |
/bet page — Privy sign-in, one-tap betting, auto-transitions |
Built. Privy + Monad untested. |
| Challenge Cabinet |
1 Mac + GCC adapter + controller |
nojohns challenge phillip — human vs bot, scoreboard |
Not started. P2. |
Product Cohesiveness Issues
- Bracket viewer and bet page are visually disconnected — different design languages (standalone HTML vs React app). Spectator scanning QR may not feel like the same product.
- No "what is this?" onboarding — bet page assumes context. No explainer screen, no 10-second pitch for walk-up spectators.
- No operator runbook — admin panel has buttons but no documented sequence, failure modes, or recovery steps.
- No spectator-facing match info — bettors can't see the game from the bet page. Betting blind unless watching the physical screen.
- Registration requires Mattie — admin.html is the only way to register. Needs to work on another computer, or ideally be delegatable to a helper.
UX Gaps
- Betting feels emotionally empty — mechanically works, but no leaderboard, no social proof, no "Alex is up 3 bets." Solo phone experience.
- No match notifications for entrants — tournament participants have no way to know when their match is starting.
- MON has no meaning — spectators can't do anything with winnings. No cashout, no prize, no context for value.
Critical Risks
| Risk |
Severity |
Status |
| Privy doesn't support Monad chain 143 |
Critical |
UNTESTED |
| WiFi blocks Slippi UDP at venue |
Critical |
UNTESTED (test Wed afternoon) |
| Character select stuck (dead air) |
High |
NOT STARTED (Tuesday session) |
| Arena wallet runs dry |
High |
Logging built, funding NOT DONE |
| Admin panel missing rematch button |
Medium |
Endpoint exists, no UI |
| Privy free tier limit for 30-50 users |
Medium |
UNKNOWN |
| Operator overwhelmed (Mattie solo) |
Medium |
NEEDS RUNBOOK |
| One-machine fallback not tested |
Medium |
NOT STARTED |
| Faucet abuse (one person drains 50 wallets) |
Low |
Cap built, no rate limiting |
Suggested Hardening (Brief 008)
Filed as .loop/briefs/008-hardening.md:
- Test Privy + Monad — kill-switch decision
- One-machine local fallback for
nojohns fight
- Rematch button in admin.html
- Operator runbook (printed)
- Registration flow on non-operator machine
- Vertical slice: tournament create → match → bet → resolve end-to-end
- Betting leaderboard (stretch)
- Live odds on bracket viewer (stretch)
Code Quality Notes (from review)
Brief 001 (Bracket):
- All 6 tasks built. Clean separation: models → bracket → tournament → API → viewer → admin.
- Admin panel missing: rematch, expire match, manual bye. Only force-advance.
- Character list has typo (
YOUNKLINK), duplicate MEWTWO.
- Viewer optimized for 1920x1080, no horizontal scroll for >16 entries.
Brief 003 (Disconnect Recovery):
- All 8 tasks built. Fully decoupled match/pool lifecycle.
_expire_stale_matches() properly renamed, pool cancellation is independent.
_log_wallet_balance() called after all onchain ops.
Brief 004 (Prediction Markets):
- All 6 tasks built. Privy integration, /bet page, faucet, QR, claim flow.
- BetPage.tsx is clean — good empty states, hides crypto units, "N bets remaining."
- Faucet is idempotent, capped at 50, validates addresses.
- Fixed 0.05 MON bet size, reserves 0.01 for gas.
Related
- Brief 008 (hardening):
.loop/briefs/008-hardening.md
- Go-live checklist:
tournaments/PROGRAM.md
Product Review — Fight Night (Mar 11)
Post-build review of briefs 001, 003, 004. Code is feature-complete but several product-level gaps need addressing before Wednesday.
Stations at the Event
viewer.html— polls arena every 3s, SVG bracket tree, LIVE badgesadmin.html— create tournament, start matches, force-advance/betpage — Privy sign-in, one-tap betting, auto-transitionsnojohns challenge phillip— human vs bot, scoreboardProduct Cohesiveness Issues
UX Gaps
Critical Risks
Suggested Hardening (Brief 008)
Filed as
.loop/briefs/008-hardening.md:nojohns fightCode Quality Notes (from review)
Brief 001 (Bracket):
YOUNKLINK), duplicateMEWTWO.Brief 003 (Disconnect Recovery):
_expire_stale_matches()properly renamed, pool cancellation is independent._log_wallet_balance()called after all onchain ops.Brief 004 (Prediction Markets):
Related
.loop/briefs/008-hardening.mdtournaments/PROGRAM.md