HKPL Committee Review · Round 10 · 6 July 2026

Scheduling, player registration, and one-person-many-jobs — all built and tested

This round is about the three things you raised in your last testing pass: the season schedule (how every team gets its Monday games), player registration (which felt like it was missing), and letting one person hold more than one job. Everything below is live on the sandbox now. Every screenshot is the real, working screen — and every claim was checked by actually doing the action and confirming it saved, not just that a page opened.

5 / 5
scheduling requests built
3
new capabilities
131 / 131
teams have a home court
0
unverified claims

① The season schedule all 5 requests done

You said: once teams are assigned to their brackets, on Day 1 every team should see all their games — half home, half away — all defaulted to Monday 7pm, with every home game at the team's home court, and captains adjusting the exact day later. That is exactly what it now does.

Auto Schedule screen
One screen does it all. Pick a division → press Preview. The intro says it plainly: “Every game is placed on Monday 7pm at the home team's court — captains adjust the exact day afterwards.” The five things you asked for are all here: balanced home/away (“Each pair once · balanced H/A”), flexible brackets (one pool / auto-split / assign yourself), Monday default (Mon selected), home courts (the green 主場 note), and bye / rain weeks (“dates to skip”). Nothing is saved until you press Create.
Generated schedule preview for Division A
The result, on real Division A (17 teams → 136 games). Every fixture is 07/13 (Mon) 19:00, 07/20 (Mon) 19:00, and so on — one round per Monday. Each game's venue is the home team's own court (Kowloon Park, Sha Tin, Discovery Bay…). The green bar confirms it: “Home/away balanced — every team 8–8 home games.” You can export the whole thing to CSV or print it.
What you asked forWhat it does nowStatus
Half home, half away for every teamSingle round-robin with a balance pass — proven on Division A: every team gets exactly 8 home / 8 awayBuilt ✓
Amendable brackets (e.g. 5×9 + 1×8)One pool, auto-split into pools of N, or hand-assign each team to a block — re-preview freely before savingBuilt ✓
Skip bye weeks & rain weeks“Bye / rain weeks — dates to skip”: any Monday you block is left empty and the calendar slides onBuilt ✓
Default ALL games to Monday 7pmEvery game is stamped Monday 19:00 by default; captains amend the exact day afterwardsBuilt ✓
Home games at the team's home courtEvery home game is placed at the home team's court. We've now set a home court for all 131 teams, so it works on Day 1Built ✓

Verified by actually committing a schedule: we generated and saved a full division schedule, then read the saved games straight from the database — all games landed on a Monday, every venue matched the home team's court, and the home/away split was balanced. Not “the button returned OK” — the actual saved rows.

② Player registration clarified + made obvious

You were worried the player-registration workflow wasn't there. Here's the honest picture — and the correct way it works now.

Why it looked missing

The register page led with Register a Club and Register a Team. A single player who just wanted to join didn't have an obvious front door — so it felt like players couldn't register at all.

What we changed

We added two clear front doors for players: a dedicated “Register as a Player” tab on the public page, and a one-tap “Become a player” button for anyone already following the league. Nothing about captains or clubs is required to start.

Register as a Player
Front door 1 — the public Register page. The new “Player” tab: “No team or club needed to start. Sign in, then complete your player profile — you're in the league right away.” Sign-in is a secure email link, no password.
Become a player and find a team
Front door 2 — for someone already watching. A spectator sees “Become a player” on their home screen, then “Find a team to join — the captain reviews and approves.”

The correct flow, start to finish

  1. Sign up as a player. Register page → Player tab (or “Become a player” if you're already following). Sign in with a secure email link — no password.
  2. Complete your profile. Add your name and your DUPR. You're now a player in the league and can appear in standings and results.
  3. Find a team. Search teams by name and apply to join the one you want.
  4. The captain approves you. Your application lands in that captain's queue. When they approve, you're on the roster.

The important part — rosters stay controlled. Registering as a player gets you into the league on your own, but getting onto a specific team's roster still goes through the captain's approval. So players can self-serve, and captains keep full control of who's on their team.

Verified end to end: we drove the whole path on the sandbox — a spectator tapped “Become a player” (and their account really became a Player), applied to a team (the request was saved as pending), and the captain approved it (the player really landed on the roster). Every step checked against the saved record.

③ One person, more than one job new

Some people wear two hats — a captain who also referees, an organiser who also runs a club. Rather than juggle two accounts, one person keeps one login and simply switches view.

Also acts as — add an extra role
An admin grants the extra job. In Admin → Users, the “Also acts as…” panel: here a Captain has been given an extra Registrar role. It's added as a hidden, linked account — it never clutters your member lists.
Switch view toggle
The person just switches view. They get a “Switch view” toggle in the header and flip between Captain and Registrar with one tap — one login, two jobs.

Safe by design, and verified: only an admin can grant a role, and admin-level roles can't be handed out this way. A person can only switch into their own linked views — we tried to switch into a stranger's account and it was correctly refused. Removing a role instantly disables it. All confirmed against the live database.

What else we fixed this round

Alongside the three big pieces, we closed the smaller things surfaced in your testing and cleaned up the rough edges around them.

AreaFix
ScheduleSet a home court for all 131 teams so a schedule can be generated on any division immediately — no “missing home court” dead-end.
ScheduleRemoved a misleading “not enough court-slots per week” warning that didn't apply once games play at each team's own home court.
ScheduleRenamed the confusing format labels to plain English: “Each pair once · balanced H/A” and “Play twice (home + away).”
FeedbackThe “Send feedback” button is now on every page — including the Auto Schedule screen where it was missing — so you can flag anything from anywhere.
RegistrationAdded the dedicated “Register as a Player” path and the spectator “Become a player” entry, plus a clear “Find a team to join” search.
RolesBuilt the whole “Also acts as…” / “Switch view” multi-job capability described above.

These sit on top of the ~30 reports from your earlier testing rounds that were already closed and summarised in the Round 8 review.

How we tested — the honest standard

A page loading is not proof it works. For everything in this document we held to one rule: drive the real action a real user would, then read the saved record to confirm it actually happened.

Try it yourself

Everything here is on the sandbox at uat.silkvo.com. Use the one-click role picker to sign in as any role, and the “Send feedback” button (bottom-right of every page) to flag anything you find — it comes straight to us.

Schedule: sign in as League Admin → Auto Schedule → pick a division → Preview.

Registration: open /register.html → Player tab; or sign in as a Spectator and tap “Become a player.”

Multi-role: sign in as League Admin → Users → “+ Add role” on any person → then that person sees “Switch view.”