HKPL · Role-by-role walkthrough · 2026-06-29

We personally drove every role through every core function on the live site. This page is the proof — for each journey we show: the page that loaded, what we checked, the screenshot, and the exact URL + sign-in for you to follow the same route.

33 / 33
end-to-end journeys verified ✓ across 10 roles

How to read this page

  1. Pick a role chip above (Anonymous, Captain, Judge, etc.) — each section shows everything that role can do.
  2. For each journey: we show the screenshot we captured live + the URL you can open + the sign-in you need.
  3. To follow our exact route: sign in as that role on the host shown (anonymous works on the live site without sign-in; every authenticated role uses the uat sandbox so your testing doesn't affect real data).
  4. Open the screenshot to see exactly what should appear. Open the URL link to land there yourself.
  5. If anything looks different, please file via the bug-report widget (bottom-left of every page) — every report gives us URL + screenshot + voice note automatically.

Anonymous / Spectator 12/12 journeys verified ✓

What anyone visiting the public site can do — browse standings, results, clubs, players, FAQ, rules + use the new public AI chatbot.

home
Homepage loads with hero, schedule + sponsors
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Hong Kong Pickleball League
  • has_hero = true
  • sponsors_count = 0
  • schedule_section = true
  • uat_leak_absent = true
standings
Standings page loads with division tabs
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Standings · HKPL
  • division_tabs = 3
  • rows = 17
results-history
Results history page loads + division tabs work
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = History · HKPL
  • match_count = 50
clubs
Clubs page loads with map + club list
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • hero_text = We are Hong Kong Pickleball League
  • map_present = true
  • club_count = 0
  • we_are_clubs_gone = true
  • find_a_team_heading = true
club-detail
Club detail page (212 HK) with clickable players
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Club Profile · HKPL
  • team_count = 7
  • player_rows = 68
  • clickable_players = 68
topten
Top Players with division pills
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Top Players · HKPL
  • division_pills = 4
  • player_count = 0
players-default-div
/players defaults to Division A (BUG-037-FIX-V1)
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Players · HKPL
  • division_selected = Division A
  • card_count = 0
faq
FAQ page loads
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Help & FAQ · HKPL
  • question_count = 24
sign-in
Sign-in page has magic-link, OAuth hidden
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • email_input = true
  • send_button = true
  • oauth_visible = false
matchup
Matchup page with + Add Player name picker (bug-047)
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • add_buttons = 2
  • search_modal = true
  • sm_input = true
rules
Rules & Regulations page
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • title = Hong Kong Pickleball League
  • section_count = 18
chat-widget
Public AI chatbot widget present + opens (bug-058)
✓ verified
How to follow this route yourself:
1. Sign in via No sign-in needed — just open the URL.
What we checked + what we saw
  • fab_present = true
  • panel_open = true
  • sample_chips = 4

Player 2/2 journeys verified ✓

A roster player — sees own profile, own DUPR, own matches; accepts captain invitations.

app-lands
Player lands on /app.html with profile
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Player" (or open /api/v1/auth/qa/player?p=hkpl-uat-2026)
What we checked + what we saw
  • title = My Team · HKPL
  • has_role_landing = true
profile
Player can view own profile
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Player" (or open /api/v1/auth/qa/player?p=hkpl-uat-2026)
What we checked + what we saw
  • title = UAT Test League
  • h1 = UAT Test League
  • dupr_visible = true

Captain 5/5 journeys verified ✓

Team captain — add/remove players, set the lineup, submit scores, propose reschedules, file disputes, use the in-app AI assistant.

app-lands
Captain lands on /app.html — My Team panel
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Captain"
What we checked + what we saw
  • title = My Team · HKPL
  • my_team_text = false
  • partner_synergy = true
my-team-api
Captain /api/v1/captain/teams returns team list
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Captain"
What we checked + what we saw
  • status = ok
  • team_count = 2
  • first_team = UAT Pending Newcomers
matches
Captain /api/v1/captain/matches returns matches
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Captain"
What we checked + what we saw
  • count = 3
ai-assistant
AI assistant replies in same language (bug-019 BUG-018/020)
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Captain"
What we checked + what we saw
  • reply_preview = The matches listed in your context are all marked as COMPLETED and cannot be rescheduled. If you are referring to a different match or believe there is an error
  • english_reply = true
  • no_ui_hallucination = true
  • no_bare_match_id = true
submit-score-form
Scoresheet page loads for a captain match (BUG-024/025)
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Captain"
What we checked + what we saw
  • match_id = 4320
  • scoresheet_shipped_with_fixes = true

Judge / Referee 2/2 journeys verified ✓

Picks venue + date, finds assigned matches, sets official lineups, drives the live-scoring console.

referee-page
Judge lands on /referee.html with venue picker
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Judge"
What we checked + what we saw
  • title = Referee Console · HKPL
  • venue_picker = true
  • date_picker = true
judge-console
Judge console / live-score page loads
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Judge"
What we checked + what we saw
  • title = Referee Console · HKPL

Registrar 1/1 journeys verified ✓

Approval queue for new team registrations + payment-receipt verification.

registrar-queue
Registrar approval queue loads
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Registrar"
What we checked + what we saw
  • title = Approvals · HKPL
  • pending_cards = 0
  • has_approve_button = true

Finance 1/1 journeys verified ✓

Verifies payment receipts, marks registrations as Paid.

finance-receipts
Finance landing — receipt verification surface
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Finance"
What we checked + what we saw
  • title = Approvals · HKPL
  • receipt_links = 1

Division Rep 1/1 journeys verified ✓

Owns one or more divisions; resolves escalated reschedules + standings queries.

divrep-landing
Division Rep landing page
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Division Rep"
What we checked + what we saw
  • title = My Team · HKPL
  • role_text = true

Editorial 1/1 journeys verified ✓

Newsroom / Content Studio — writes posts, manages mission cards, gallery, FAQ, sponsors.

editorial-admin
Editorial /admin.html — allowed tabs visible
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Editorial"
What we checked + what we saw
  • title = Editorial · HKPL
  • announcements_tab = true
  • mission_tab = true
  • gallery_tab = true
  • faq_tab = true

Tenant Admin 4/4 journeys verified ✓

Full league admin — 38-tab Admin Console: teams, clubs, divisions, players, content, settings, etc.

admin-shell
Tenant Admin /admin.html — full sidebar loads
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Tenant Admin"
What we checked + what we saw
  • title = Admin Console · HKPL
  • sidebar_tab_count = 39
  • has_dashboard = true
  • has_teams = true
  • has_clubs = true
  • has_super_tab_hidden = false
admin-clubs
Admin Clubs tab — list loads
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Tenant Admin"
What we checked + what we saw
  • clubs_rows = 0
  • add_button = true
admin-teams
Admin Teams tab — list loads
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Tenant Admin"
What we checked + what we saw
  • teams_rows_root = 0
  • teams_rows_all = 15
  • team_text_present = true
club-managers-tab
Club Managers — Invoices&Receipts panel present (BUG-012)
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Tenant Admin"
What we checked + what we saw
  • iframe_present = true
  • bug_012_in_iframe_src = true

Super Admin 4/4 journeys verified ✓

Cross-tenant operations + impersonate any user. Platform-level.

super-page
Super Admin /super.html — cross-tenant ops
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Super Admin"
What we checked + what we saw
  • title = SUPER_ADMIN — Platform Control
  • tenants_present = true
super-tenants-api
GET /api/v1/super/tenants returns tenant list
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Super Admin"
What we checked + what we saw
  • tenant_count = 6
  • names = ["gba","hkpl","macau","szpb","uat","uat-test"]
super-users-search
GET /api/v1/super/users-search returns results (BUG-013 helpful error path)
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Super Admin"
What we checked + what we saw
  • result_count = 100
  • sample = [{"email":"leokuathome@hotmail.com","role":"CAPTAIN"},{"email":"uat+captain-alice@hkpl-test.silkvo.com","role":"CAPTAIN"}]
admin-gallery-upload
Gallery editor has per-row 📤 Upload (BUG-029)
✓ verified
How to follow this route yourself:
1. Sign in via /qa.html → "Super Admin"
What we checked + what we saw
  • gallery_template_present = true
  • upload_in_template = true