Recent updates
May 17–18, 2026 — USA Lacrosse 2026 (dropdown voting, COTY merge), All State voting/admin, and coach stat ranking weights.
Summary of new features and fixes. Use the testing checklist before closing out items.
Edit public/admin-recent-changes.html when adding the next release.
Latest — coach stat ranking weights
- NewPer-coach stat weights: Each coach team can customize how Stats Rank is calculated in View All Player Stats on the All State vote page. Weights are saved per login (
awards_team_id) and season year — not shared league-wide and not tied to a voting round. - NewSettings page: /all-state/stat-weights — tabs for Attack, Midfield, Defense, Goalie; sliders (0–100) for games played, goals, assists, points, shots, draw controls, ground balls, caused turnovers, interceptions, saves, and goals allowed (lower is better). Presets: Equal (default) and Suggested emphasis. Coach help: /help/stat-weights.
- NewAPI:
GET/PUT /api/all-state/my-stat-weights?year=2026— coach auth required. Migration034_all_state_coach_stat_weights.sql(all_state_coach_stat_weightstable). - NoteDoes not affect ballots: Custom weights only change the private Stats Rank helper column. Submitted rank-choice votes, committee aggregates, and exports are unchanged.
- NewAdmin Recent updates page: Help menu → Recent updates (replaces “Recent changes”). Dashboard button Recent updates (May 17). Route alias:
/admin/recent-changesstill works. - NewPlayer detail by roster ID: Vote/stats modals can load full player detail via roster id where available.
Stat weights (coach) Help guide All State vote This changelog
USA Lacrosse awards (2026 season)
- NewPortal CSV import:
npm run import-usa-lacrosse-nominationsloads player nominations (All-American, All-Academic, Jackie Pitts) intocandidatesand Coach of the Year rows intocoach_of_year_nominees, with portal submission IDs and full payload JSON. Multiline quoted CSV fields are supported. - NewCoach reference page: /usa-lacrosse/nominees — browse nominees by ballot with portal detail (stats, essays, honors). COTY supporting PDFs served from
/nominee-docs/coty/. - NewUnified coach voting: /usa-lacrosse/vote — one ranking ballot per award with per-rank nominee dropdowns (same slot model as All State); ballot dropdown covers All American, All Academic, Jackie Pitts, and Coach of the Year. Legacy
/all-american/voteredirects here. - NewCOTY consolidation:
npm run consolidate-coty-nomineesmerges duplicate portal coaches, combines LOR PDFs (pdf-lib), storesmerged_submissions(migration035). Import script matches COTY PDFs by portal UUID and coach name. - NewAdmin views: Ranking Totals and View Each Coach's Vote include USA Lacrosse ballots. All American Approval page notes that 2026 player awards come from the portal import, not coach submissions.
- ChangeAdd All American (2026): Coach self-nomination form is closed for 2026; home and rules pages point coaches to USA Lacrosse voting and nominees instead.
All State — coach voting
- NewRounds 2 & 3 unified ranking: Coaches rank one combined pool (all positions together), same as Round 2 behavior extended to Round 3.
- NewTie Breaker round: Admin selects which players appear on the ballot via checkboxes on All State Control → Tie Breaker. Coaches see only the saved whitelist. Migration
033addsall_state_round_included_players. - NewAlphabetical rank dropdowns: Vote lists sort by player name so coaches can jump to a name with the keyboard.
- NewRules page — All State: /rules documents STL All State eligibility, 1st Team / HM composition, voting rounds, and coach page links.
- NewStat ranking weights: Link on vote page toolbar; Stats Rank in All Player Stats uses each coach’s saved weights (see Latest).
All State — admin control
- NewEdit nomination properties: On All State Candidates, each row has Edit — update position, secondary position, name, school, grade, jersey, cards, stats, and coach comments without re-importing CSV.
- NewOutlier detection: Flags votes outside expected rank range (sigma-based). Filter by round or all rounds; sortable table; message shows player, rank given, team, and expected range.
- NewSelective vote removal: Check individual outlier rows, then throw out only those votes (not all flagged at once).
- NewDrop threshold direction: Auto-drop rule can remove players ranked below or above a points threshold (radio on All State Control).
- NewPer-round dropped players: Dropping applies to the selected round only; players stay in the overall pool for other rounds.
- NewCoach vote position summary: On View Each Coach's Vote, each ballot shows A/D/G counts as #Attack/#Total, #Defense/#Total, #Goalie/#Total.
Fixes
- FixLogin rate limiting: Coach and admin login limits count failed attempts only, so successful logins no longer trigger “too many attempts.”
- FixAccess code verification: All State meeting access codes validate correctly (normalization / hash compare).
- FixDropped players in ballots: Players dropped for a round no longer appear in that round’s rank dropdowns (e.g. Round 2).
- FixOutliers by round: Outlier list respects the selected round scope instead of mixing all rounds by default.
- FixExpected range display: Outlier “expected range” no longer shows invalid values (e.g. −1) when sample size is too small.
Testing checklist
Verify on staging/production after deploy. Remove or check off items as you go.
USA Lacrosse
- Run import against production DB; confirm counts (~20 All-American, ~12 All-Academic, ~5 Jackie Pitts, ~8 COTY) and nominee detail on nominees.
- Submit and reload each ballot on vote; confirm ranking validation and read-only after submit.
- Confirm
/all-american/voteredirects to USA Lacrosse vote.
Stat ranking weights
- Apply migration
034_all_state_coach_stat_weights.sqlon production if not already applied. - As Coach A: set Attack weights heavy on goals → save → open View All Player Stats → Stats Rank order reflects goals emphasis.
- As Coach B (different login): confirm default/equal weights unless they save their own profile.
- Reload vote page after saving weights; confirm Stats Rank updates without affecting saved ballot.
- Try Suggested emphasis preset for goalie (saves / goals allowed) and verify rank shifts for goalies only.
All State voting
- Round 1: position pools and slot count match nominee count per position.
- Rounds 2 & 3: single combined ranking UI; submit and reload ballot.
- Tie Breaker: save a subset on admin → coaches see only those names.
- Drop a player for Round 2 only → absent from R2 dropdowns, still visible in R1/R3 if applicable.
- Drop rule: test both “below” and “above” threshold directions.
- Rank dropdown order is alphabetical; keyboard navigation finds names quickly.
All State admin
- Edit a candidate’s position on candidates; confirm vote page and exports reflect the change.
- Outliers: filter by round, sort columns, select subset, throw out — tally updates.
- Coach votes page shows A/D/G summary per coach for each round.
- Login: several failed attempts then success — no false lockout.
- Access code: set code on active session, verify at vote meeting flow.
Recent commits: 3fa462a (COTY merge + pdf-lib),
95087a6 (USA Lacrosse dropdown voting),
a9e87a8 (coach stat weights),
df37327 (recent updates page, player detail),
3f011ac (USA Lacrosse + tie breaker + rules),
9a4cb5d (edit nominations),
eda330e (outliers),
0b97236 (unified R2/R3, rate limit).