← Committee reportHappy-path walk

Score-submit flow — operational deep-dig

25 tests across validation, recovery, permissions, mobile UX, empty states.

The happy path is verified — this dig looks for what a real user actually breaks. Honest grading: ✓ OK = works as expected, ⚠ Friction = it works but the UX could be kinder, ✗ Bug = a real defect.

22
✓ OK
3
⚠ Friction
0
✗ Bug

A. Score validation

VerdictQuestionResultObserved
✓ OKNon-numeric scores ("twenty-one")✓ Rejectedhttp=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_invalid_scores","message":"Game 5 (MI
✓ OKNegative score (-5)✓ Rejectedhttp=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_invalid_scores","message":"Game 5 (MI
✓ OKTie 0-0 in last game✓ Rejectedhttp=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_tie","message":"G
✓ OKTie 21-21 (no winner)✓ Rejectedhttp=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_tie","message":"G
✓ OKDeuce 23-21 (valid pickleball deuce)✓ Acceptedhttp=200
✓ OKWildly out-of-range (99-3)✓ Rejected (with reason)http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_overshot_target",
✓ OKOnly 4 games submitted (5 required)✓ Rejectedhttp=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"match_game_sequence","code":"wrong_game_coun
✓ OKEmpty submission (no games)✓ Rejected (400)http=400 {"error":"games_required"}

B. Recovery — captain made a mistake

VerdictQuestionResultObserved
✓ OKCaptain submits clean valid scores✓ Acceptedhttp=200
⚠ FrictionCaptain realizes mistake and tries to re-submit🟡 Blocked with hint to ask Registrarhttp=409 {"error":"match_already_signed_or_completed","detail":"This match already has at least one signature or is completed. Re-submitting would invalidate pending co-sign codes. Contact
✓ OKDuplicate submission (network retry simulation)✓ Blocked (no double-write)http=409
✓ OKRegistrar can manually correct after submit✓ Yes, Registrar can overridehttp=200 {"ok":true,"match":{"id":4284,"tenant_id":"uat","division_id":"94392371-9a9f-4d45-a5a8-a46ad81f5a84","season_id":179,"group_name":null,"teamA_id":"559eae8a-c8b9-4506-a962-941e74bc372e","teamB_id":"abb

C. Permission edges

VerdictQuestionResultObserved
✓ OKRandom PLAYER tries to submit✓ Blocked (403)http=403 {"error":"Forbidden"}
✓ OKNon-captain teammate fetches /scoresheet for their match🟡 Blocked entirelyhttp=403 can_edit=undefined
✓ OKNon-captain teammate tries to submit✓ Blocked (403)http=403
✓ OKPublic SPECTATOR fetches /scoresheet✓ Blockedhttp=403

D. Dispute discoverability

VerdictQuestionResultObserved
✓ OKCaptain on a scoresheet sees a way to file a dispute✓ Word "dispute" present"dispute" found in page text

E. Mobile UX

VerdictQuestionResultObserved
✓ OKScoresheet — horizontal scroll on iPhone width✓ FitsscrollWidth>390=false
⚠ FrictionScoresheet — tap targets under 36px tall (hard for thumbs)⚠ 7 small targetsBUTTON "×"; A "Review & confirm →"; INPUT "A"
✓ OKScore inputs use numeric keyboard on phones (type=number or inputmode=numeric)✓ Yes (20 fields)number-inputs=10, inputmode=10
✓ OKCaptain home — horizontal scroll✓ FitsscrollWidth>390=false
✓ OKLineup planner — horizontal scroll✓ FitsscrollWidth>390=false
⚠ FrictionLineup planner — tap targets <36px⚠ 4 smallBUTTON "×"; A "Review & confirm →"; A "←"

F. Empty / missing-data states

VerdictQuestionResultObserved
✓ OKCaptain opens scoresheet for a non-existent match id✓ Friendly empty state⏳ 3 items need your team’s attention · 2 need YOU × Both captains confirmed — uploading the result to DUPR BLACK ACE 3–2 YamaBoar · Division A · 01 Jul ✓ Captain submitted → ✓ Both confirmed → ⏳ Uploa
✓ OK/my-lineup.html with no ?match= (captain just lands)✓ Friendly landing⏳ 3 items need your team’s attention · 2 need YOU × Both captains confirmed — uploading the result to DUPR BLACK ACE 3–2 YamaBoar · Division A · 01 Jul ✓ Captain submitted → ✓ Both confirmed → ⏳ Uploa

Screens captured during this dig

Captain on the scoresheet — can they file a dispute from here?
Captain on the scoresheet — can they file a dispute from here?
Mobile (iPhone) — scoresheet
Mobile (iPhone) — scoresheet
Mobile — captain home
Mobile — captain home
Mobile — lineup planner
Mobile — lineup planner
Bogus match id — empty state
Bogus match id — empty state
/my-lineup.html with no match — landing
/my-lineup.html with no match — landing