The 31 items the committee filed on 3 July, in your own words, each with the root cause we found and the fix — verified live on the sandbox. Plus the four engineering items you asked for (rulebook enforcement, DUPR health board, integrity checker, and more).
Clubs and teams paying, and the Registrar approving them.
You said: "a new club should pay for the club registration fees same as the team registration… the club page needs the upload button for the receipt."
Done. The club-registration form now requires a payment-receipt upload, and the backend stores it for Finance/Registrar to verify.
You said: "Adding a new team from club management does not require payment proof."
Done. The "Register a new team" form on the club page now requires a receipt before it can submit — matching the main registration flow.
You said: "Club name should come with a red star… for all compulsory fields, please come with a red star to make it consistent."
Done. Every required field across the registration forms now shows a red asterisk consistently.
You said: "Cannot approve more than one approval… need to refresh every time to approve."
Done. Root cause was a shared button left disabled after the first approve. The queue now lets you approve one after another with no refresh.
You said: "Reject function does not work after entering the reason."
Done. Same root cause as above — reject now works every time with the reason recorded.
The team dashboard — rosters, scores, invitations, alerts.
You said: "Can captain and co-captain mobiles be displayed?"
Done. The captain & co-captain now show as tap-to-call numbers on the team card. (The display was built correctly — the sandbox captains just had no phone on file, so we added them. It now reads e.g. 📱 +852 6600 0014.)
You said: "Captain cannot read the alert message."
Done. The alert banner had broken grammar ("1 item need… · 1 need YOU"). It now reads plainly: 1 item needs your action.
You said: "The roster view is very messy after adding the player status."
Done. The availability control + Remove moved onto their own line so the roster reads cleanly.
You said: "Created a team, cannot add players to team roster."
Done. The club team card now has a "+ Add player" button that jumps straight into the roster wizard for that team.
You said: "The preview button needs to show all matches played… not just once, but 5 games in total."
Done. Results now show every game of a tie (LD, MD, MIX1-3) with each score, not just one.
You said: "The 'referee a match' button does not work, it jumps to the sign-in page."
Done. Captains & division reps are now allowed on the referee console, so the button opens it instead of bouncing to sign-in.
You said: "I'm a team captain of one team, how can I plan the lineup for my opponent — it does not make sense."
Resolved. You can only plan your own team's lineup.
You said: "I still cannot add multiple roles to one player."
By design — and now explained. A person has one real role. To test the app as someone else you don't stack roles, you stand in their shoes with the persona switcher. We added a clear note on the Users page that links straight to it.
The League Admin and Editor surfaces.
You said: "The upload photo button does not work, also no error message."
Done. We tested the upload endpoint live — it works (returns the image). The real problem was the feedback was 10px and invisible. It now shows a clear "✓ Photo added — remember to Save," and errors read plainly.
You said: "Can the social game page have the 'send feedback' function? Also, can we upload the games in a CSV format?"
Done — both. Added the feedback widget, plus a CSV bulk-upload with a downloadable template. It validates every row and tells you which rows failed (proven: 2 imported, 1 rejected with a clear reason).
You said: "The description of each page is not clear, can include more description."
Done. Every admin page now shows a plain one-line description under its title (all 38 tabs).
You said: "Someone raised a dispute but the admin has to check the panel manually — there should be an alert on the dashboard."
Done. Open disputes now raise an alert on the admin dashboard and a badge on the sidebar.
You said: "The information under 'Sections - show / hide' is messy."
Done. Each toggle's checkbox now sits tidily next to its label.
You said: "Day of play under 'register a new team' needs to start with upper case."
Done. Monday…Sunday now capitalised.
You said: "Can we have the preview function of the brand colour and accent colour?"
Done. Picking a brand or accent colour now updates the page preview live as you drag.
You said: "The error message on the club admin portal is not clear enough."
Done. It was dumping raw code. Now it reads plainly — e.g. "Website must be a full link starting with https://" and "Sponsor #1 needs a name" — and it auto-fixes a bare link like www.x.com so it just saves.
The links, menus, and shortcuts everyone uses.
You said: "The links in the League are too many. Club ranking should go to Clubs, Top 10 should go to Players. Organize the links under League better."
Done. Exactly as asked — Top Ten now lives under Players, Club Rankings under Clubs, and the League menu keeps only competition views.
You said: "The links on the top navigation bar are not consistent with the bottom links, please make it the same."
Done — permanently. The footer is now built from the same source as the top menu, so the two can never drift apart again. Every nav destination appears in the footer.
You said: "The Facebook link should link to [the HKPL Facebook page]."
Done. The Facebook link (and Instagram) are wired to the league's real social pages.
You said: "Add a shortcut here to act as a club admin (e.g. 212 club admin)… this page misses the club admin portal shortcut."
Done. The role picker and sandbox page now link straight into acting as a club manager.
Someone suggested: "Can we have a bookmark function to save important disputes into a dispute knowledge-management system?"
Parked. This is a new feature idea (a dispute knowledge base), not a broken thing — and it needs a product decision on what the "KB" should be (bookmarks? tags? a precedent library?). Left it out until you decide you want it. Nothing else depends on it.
Beyond the reported bugs — the "is it really wired / does it really guard" questions.
Yes — proven live. Adding a 4.484-rated player to Division B (cap 3.699) is refused with "Player DUPR 4.484 exceeds division cap of 3.699." An in-band player is accepted. Every way onto a roster (add-player, join-request, invite-accept, borrow) asks the rulebook first, and fails safe if the engine ever errors.
See it: §3 of the playbook.
Yes. The "Full run" button on the admin health card actually calls the DUPR Partner API — auth, reads, and a real match create → view → delete round-trip. Last run: 10 functions work + 1 reachable, 0 broken (3 are not-granted by design — bulk invite-user isn't on our key; player onboarding is "Login with DUPR").
Who sees it: the League Admin, on /admin.html. See §7 of the playbook.
Built. 12 read-only cross-checks for contradictions — orphan rosters, a match won by a team that didn't play, duplicate DUPR ids, stranded approvals, etc. Last run: 0 errors, 0 warnings.
Who sees it: the League Admin, on /admin.html. See §8 of the playbook.
Fixed. The role button existed but the test user was never created, so it 404'd. Now you can sign in as Cup Admin and run tournaments.
Try it: become Cup Admin.