Repository navigation
Conversation
- Withdrawing a project drops its unscored queue slots, and the judge page moves on to the next table when the slot on screen is gone. - assignToHackathon no longer queues a project twice; isJudge rejects a malformed id as 400 instead of a Postgres 500; judge min/max per judge must be whole numbers with max >= min. - The last-super-admin guard also covers deactivation and ending the term, and no longer counts expired super admins. - Terms and semester ends are computed in Eastern time. The last six hours of a semester count as the next one, so renewing a membership stored on the old UTC boundary still buys a full semester. - leaveTeam and disbandTeam lock the team row, serialising with joins. - Chunk-error recovery reloads again after a later deploy; ModalWrapper no longer steals focus when its onClose changes; Hacklytics anchors drop content-visibility so nav taps land on the section.
Navigation - The MLH badge sat on the phone menu toggle and on the tablet "Notify me". The header's badge clearance was on section-wrap, whose unlayered padding beat the Tailwind utilities; it is now reserved at every width. - The full nav only appears from 1024px. At tablet width six links, the logo and the button overlapped. - A page opened at /#section jumps there instead of smooth-scrolling from the top, and the header is solid from the first frame. Sections - Even vertical rhythm: neighbouring sections stacked 256px of padding. - Track sprites sit in a fixed cell, so numbers and titles line up. - Schedule times read "Fri 5:00 PM" rather than "FRI 5:00P". - Sponsors show who hosts and how to sponsor, not a "your logo" slot. - Anchors drop content-visibility, so jumps land on the section. Copy and footer - "Notify me opens the DS@GT portal. This site has no form." appeared four times; the hero caption keeps it, the rest read as prose. - The footer fades in from the sections' translucent background instead of starting on a hard edge, stacks below 1024px, and uses one link style.
Every Notify me button, the FAQ link and the JSON-LD offer read INTEREST_URL, which now points at the Typeform. The portal flow is kept as PORTAL_INTEREST_URL to switch back to once registration opens there. The hint and FAQ no longer mention the portal.
The garden and its soil are 136px tall (168px from md) and the hero's bottom padding was 80px (128px), so on short screens the countdown labels ran under the flowers.
- hackathon_projects gets withdrawn_by_admin_at (additive). An organiser pulling a project before judging left no judging row, so the team could resubmit it straight back into the gallery; submitProject now refuses on the column too. - submitProject bounds name, description and list sizes, and keeps only tracks and challenges the hackathon offers. Unknown values are dropped rather than refused: the form cannot untick a track removed since. - acceptWave locks the hackathon row, so two concurrent waves get different numbers instead of both claiming max + 1. - The metrics term label reads Eastern time, matching currentTerm.
The caption was stacked under Notify me alone, so that column was taller than Explore and centring the row pushed Explore halfway down. Both buttons now share a row at the same height, with the caption below the pair.
The initial sync called onScroll, which read landing on the section as a scroll down from 0 and hid the header; touch users had no way to bring it back short of scrolling up. It now records the starting position and sets only the background.
Feature: fix/hacklytics-formatting to dev
A failed getNextTable refetch still resolves with the cached answer, which is the withdrawn table itself, so a network blip put the judge back on the dead card under a message saying they had a new one. An error result, or one naming the same slot, now reports the failure; pressing any card action again retries.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 101920c. Configure here.
| // background depends on it. | ||
| lastY.current = window.scrollY; | ||
| setScrolled(window.scrollY > 20); | ||
| }); |
There was a problem hiding this comment.
Deep-link scroll hides navbar
Medium Severity
Opening a section hash still hides the header. The new rAF jump updates lastY and scrolled but never sets visible, and the scroll listener is already attached. Native smooth hash scrolling (and scrollIntoView itself) fire scroll events that onScroll treats as a downward move from lastY 0, so setVisible(false) wins. Touch visitors who land on /#faqs or similar get a missing header with no hover affordance to bring it back.
Reviewed by Cursor Bugbot for commit 101920c. Configure here.
Feature: fix/audit-hardening to dev
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
|
Visit the preview URL for this PR (updated for commit 5bfe9b3): https://hacklytics2027--pr-449-o8h88hjb.web.app (expires Thu, 08 Oct 2026 15:47:21 GMT) 🔥 via Firebase Hosting GitHub Action 🌎 Sign: c48ba34db61581e25fe2978355160b5eefe0e83f |


Automated PR tracking changes from
devintomain.Note
Medium Risk
Changes affect super-admin invariants, semester billing boundaries, judging queue deletes, and transactional team locks—high-impact areas, but mostly guarded by expanded tests.
Overview
This sync bundles hackathon operations fixes with membership term logic, marketing-site UX, and small portal hardening.
Judging & organiser withdrawal: Organiser pulls now set
withdrawnByAdminAt, mark judging rows withdrawn, and delete unscoredjudgeQueueslots so judges are not routed to dead tables. Teams cannot resubmit after an organiser pull. The judge portal auto-advances when a slot disappears (NOT_FOUND/ queue errors). Judge assignment skips already-queued projects and appends with correctorder; bulk assign validatesmaxProjects >= minProjects.isJudgerejects malformed UUIDs withBAD_REQUESTbefore Postgres.Admin & concurrency: “Last super admin” protection now covers deactivation and term expiry, counting only non-expired peers. Acceptance wave numbering locks the hackathon row (
FOR UPDATE). Team leave/disband lock team rows to avoid races with joins.Submissions:
submitProjectadds length/trim limits, silently filters tracks/challenges to what the hackathon offers, and blocks admin-withdrawn projects.Membership & metrics:
currentTerm,semesterEndDate, and metrics term labels use America/New_York boundaries; semester end uses Atlanta midnight plus a 6-hour renewal margin for legacy UTC end dates. Tests updated accordingly.Hacklytics 2027 site: Interest CTAs point at a Typeform; copy/layout/nav fixes (hash scroll, navbar breakpoint, hero padding, anchor scroll without
content-visibility, footer gradient).Portal misc: Modal focus no longer re-runs on unstable
onClose; chunk reload uses a 30s window instead of a one-shot flag.Reviewed by Cursor Bugbot for commit 5bfe9b3. Bugbot is set up for automated code reviews on this repo. Configure here.