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.
| Verdict | Question | Result | Observed |
|---|---|---|---|
| ✓ OK | Non-numeric scores ("twenty-one") | ✓ Rejected | http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_invalid_scores","message":"Game 5 (MI |
| ✓ OK | Negative score (-5) | ✓ Rejected | http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_invalid_scores","message":"Game 5 (MI |
| ✓ OK | Tie 0-0 in last game | ✓ Rejected | http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_tie","message":"G |
| ✓ OK | Tie 21-21 (no winner) | ✓ Rejected | http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_tie","message":"G |
| ✓ OK | Deuce 23-21 (valid pickleball deuce) | ✓ Accepted | http=200 |
| ✓ OK | Wildly out-of-range (99-3) | ✓ Rejected (with reason) | http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"score_target","code":"game_overshot_target", |
| ✓ OK | Only 4 games submitted (5 required) | ✓ Rejected | http=400 {"error":"rules_engine_blocked","blocks":[{"rule_type":"match_game_sequence","code":"wrong_game_coun |
| ✓ OK | Empty submission (no games) | ✓ Rejected (400) | http=400 {"error":"games_required"} |
| Verdict | Question | Result | Observed |
|---|---|---|---|
| ✓ OK | Captain submits clean valid scores | ✓ Accepted | http=200 |
| ⚠ Friction | Captain realizes mistake and tries to re-submit | 🟡 Blocked with hint to ask Registrar | http=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 |
| ✓ OK | Duplicate submission (network retry simulation) | ✓ Blocked (no double-write) | http=409 |
| ✓ OK | Registrar can manually correct after submit | ✓ Yes, Registrar can override | http=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 |
| Verdict | Question | Result | Observed |
|---|---|---|---|
| ✓ OK | Random PLAYER tries to submit | ✓ Blocked (403) | http=403 {"error":"Forbidden"} |
| ✓ OK | Non-captain teammate fetches /scoresheet for their match | 🟡 Blocked entirely | http=403 can_edit=undefined |
| ✓ OK | Non-captain teammate tries to submit | ✓ Blocked (403) | http=403 |
| ✓ OK | Public SPECTATOR fetches /scoresheet | ✓ Blocked | http=403 |
| Verdict | Question | Result | Observed |
|---|---|---|---|
| ✓ OK | Captain on a scoresheet sees a way to file a dispute | ✓ Word "dispute" present | "dispute" found in page text |
| Verdict | Question | Result | Observed |
|---|---|---|---|
| ✓ OK | Scoresheet — horizontal scroll on iPhone width | ✓ Fits | scrollWidth>390=false |
| ⚠ Friction | Scoresheet — tap targets under 36px tall (hard for thumbs) | ⚠ 7 small targets | BUTTON "×"; A "Review & confirm →"; INPUT "A" |
| ✓ OK | Score inputs use numeric keyboard on phones (type=number or inputmode=numeric) | ✓ Yes (20 fields) | number-inputs=10, inputmode=10 |
| ✓ OK | Captain home — horizontal scroll | ✓ Fits | scrollWidth>390=false |
| ✓ OK | Lineup planner — horizontal scroll | ✓ Fits | scrollWidth>390=false |
| ⚠ Friction | Lineup planner — tap targets <36px | ⚠ 4 small | BUTTON "×"; A "Review & confirm →"; A "←" |
| Verdict | Question | Result | Observed |
|---|---|---|---|
| ✓ OK | Captain 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 |





