brackt/app/routes
Claude 569081fe29
All checks were successful
🚀 Deploy / 🧪 Test (pull_request) Successful in 2m55s
🚀 Deploy / ʦ🔍 Typecheck & Lint (pull_request) Successful in 1m25s
🚀 Deploy / 🐳 Build (pull_request) Has been skipped
🚀 Deploy / 🚀 Deploy (pull_request) Has been skipped
Only derive feeders where the halving rule actually holds
Review caught that the generic feeder rule was being applied to templates
that route by their own logic. It was harmless as dead code; driving the
renderer with it made several brackets worse than before.

The rule pairs rounds by array order and assumes match n is fed by 2n-1
and 2n. That describes advanceWinnerTemplate, not every bracket:

- afl_10's Wildcard Round feeds the Elimination Finals, skipping the round
  listed next to it, so array order fabricated the entire chain and drew
  ten wrong connectors contradicting advanceAFLWinner.
- fifa_48's Third Place Game sits between the Semifinals and the Finals,
  so the Finals came out fed by the third place game. Once BracketTreeView
  filtered the consolation round out, the group had three roots and the
  whole World Cup bracket rendered with no connectors at all.
- ncaa_68 labelled Round of 64 #1/#2 with First Four feeds that
  advanceFirstFourWinner doesn't use.
- nba_20's play-in halves in size but pairs the 7v8 loser with the 9v10
  winner.

Follow each round's declared feedsInto, and derive edges only where the
round halves exactly — the condition under which the generic ceil(n/2)
mapping is true. Bespoke transitions that happen to halve are named
explicitly. Slots left without a feeder read TBD, which is honest.

Dropping those edges sends the group to the fallback, so the fallback now
has to keep drawing what those brackets already drew: halving U-shapes by
round size, and winner tracing through irregular shapes. Previously it
drew nothing, which also silently removed every connector from brackets
with no bracketTemplateId.

Also from review:
- clear-bracket deleted seasonParticipantResults for the entire sports
  season with no rebuild. That table is keyed by season, not event, so it
  wiped placements for every other event in the season — permanently
  zeroing standings on a finalized qualifying season. Delete only the
  matches and point the admin at Reprocess Bracket, which rebuilds
  placements correctly.
- The clear-bracket form sent confirm=true from a hidden field, making the
  server's completed-match guard unreachable. It's a checkbox now, so the
  guard is real, including without JS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnzbrCHoM8ESbtbDamaqFb
2026-08-21 18:18:05 +00:00
..
__tests__ Only derive feeders where the halving rule actually holds 2026-08-21 18:18:05 +00:00
admin Auto-populate & auto-score tennis Grand Slam brackets from Wikipedia 2026-06-26 21:48:00 -07:00
api Fix three timer-pause gaps found in code review 2026-06-06 08:52:04 -07:00
leagues claude/wimbledon-qp-scoring-bug-xevhlf (#127) 2026-07-03 21:40:11 +00:00
teams Enforce unique team names within a season 2026-05-23 16:55:08 -07:00
admin._index.tsx admin fixes (#85) 2026-06-11 00:32:22 +00:00
admin.data-sync.tsx Canonical tournament layer: schema + backfill (1/2) (#365) 2026-05-01 20:13:18 -07:00
admin.draft-schedule.tsx Address code-review findings on draft schedule Gantt 2026-07-02 02:33:15 +00:00
admin.leagues.tsx admin fixes (#85) 2026-06-11 00:32:22 +00:00
admin.participants.tsx feat: add meta title to all route pages (#109) 2026-03-10 12:10:52 -07:00
admin.simulators.tsx Centralize futures odds onto the simulator page and fix bulk import (#117) 2026-06-30 17:05:52 +00:00
admin.sports-seasons.$id.clone.tsx Formalize simulator system with manifest, input-policy, runner, and admin UI (#409) 2026-05-11 21:09:53 -07:00
admin.sports-seasons.$id.elo-ratings.tsx Fix EPL simulator parity config (#421) 2026-05-13 15:02:23 -07:00
admin.sports-seasons.$id.events.$eventId.bracket.helpers.ts Announce mirror knockouts from the admin bracket-scoring path too 2026-07-04 18:19:52 +00:00
admin.sports-seasons.$id.events.$eventId.bracket.server.ts Only derive feeders where the halving rule actually holds 2026-08-21 18:18:05 +00:00
admin.sports-seasons.$id.events.$eventId.bracket.tsx Only derive feeders where the halving rule actually holds 2026-08-21 18:18:05 +00:00
admin.sports-seasons.$id.events.$eventId.cs2-setup.tsx Unify majors: score once, fan out across windows + tennis bracket EV 2026-06-22 20:32:22 -07:00
admin.sports-seasons.$id.events.$eventId.helpers.ts feat: batch qualifying results entry (#290) 2026-04-12 14:52:22 -07:00
admin.sports-seasons.$id.events.$eventId.server.ts Unify majors: score once, fan out across windows + tennis bracket EV 2026-06-22 20:32:22 -07:00
admin.sports-seasons.$id.events.$eventId.swiss-matches.tsx claude/great-lovelace-r3bznh (#88) 2026-06-12 22:35:35 +00:00
admin.sports-seasons.$id.events.$eventId.tsx Fix Docker build failure caused by server-only import reaching client bundle 2026-07-01 22:36:25 +00:00
admin.sports-seasons.$id.events.server.ts claude/wimbledon-qp-scoring-bug-xevhlf (#127) 2026-07-03 21:40:11 +00:00
admin.sports-seasons.$id.events.tsx Improve shared-tournament/event management UX 2026-07-02 05:17:37 +00:00
admin.sports-seasons.$id.expected-values.server.ts Canonical tournament layer: schema + backfill (1/2) (#365) 2026-05-01 20:13:18 -07:00
admin.sports-seasons.$id.expected-values.tsx Fix oxlint warnings: no-shadow, consistent-function-scoping, no-non-null-assertion, and others (#196) 2026-03-21 10:59:51 -07:00
admin.sports-seasons.$id.futures-odds.tsx Centralize futures odds onto the simulator page and fix bulk import (#117) 2026-06-30 17:05:52 +00:00
admin.sports-seasons.$id.golf-skills.tsx Canonical golf skills migration + copy participants feature (#369) 2026-05-02 10:29:28 -07:00
admin.sports-seasons.$id.participants.tsx Canonical golf skills migration + copy participants feature (#369) 2026-05-02 10:29:28 -07:00
admin.sports-seasons.$id.regular-standings.tsx Deduplicate soccer simulator helpers (#391) 2026-05-07 11:48:57 -07:00
admin.sports-seasons.$id.simulate.tsx Fix simulate route crash and surface actual simulation errors (#64) 2026-06-01 06:47:30 +00:00
admin.sports-seasons.$id.simulator.tsx Paginate and sport-tailor the simulator setup participant table (#132) 2026-07-07 06:00:15 +00:00
admin.sports-seasons.$id.standings.tsx Canonical tournament layer: schema + backfill (1/2) (#365) 2026-05-01 20:13:18 -07:00
admin.sports-seasons.$id.surface-elo.tsx Canonical tournament layer: schema + backfill (1/2) (#365) 2026-05-01 20:13:18 -07:00
admin.sports-seasons.$id.tsx Centralize futures odds onto the simulator page and fix bulk import (#117) 2026-06-30 17:05:52 +00:00
admin.sports-seasons.helpers.ts Hide completed seasons in admin tools (#418) 2026-05-12 16:52:26 -07:00
admin.sports-seasons.new.tsx claude/great-lovelace-r3bznh (#88) 2026-06-12 22:35:35 +00:00
admin.sports-seasons.tsx Hide completed seasons in admin tools (#418) 2026-05-12 16:52:26 -07:00
admin.sports.$id.tsx Add public sports overview page (#451) 2026-05-19 23:02:58 -07:00
admin.sports.new.tsx Add public sports overview page (#451) 2026-05-19 23:02:58 -07:00
admin.sports.tsx Add public sports overview page (#451) 2026-05-19 23:02:58 -07:00
admin.standings-snapshots.tsx Replace console.* with structured logger, fix no-inferrable-types (closes #98) (#199) 2026-03-21 13:41:39 -07:00
admin.templates.$id.tsx claude/sports-templates-conversion-ILWAM (#71) 2026-06-04 21:31:49 +00:00
admin.templates.new.tsx claude/sports-templates-conversion-ILWAM (#71) 2026-06-04 21:31:49 +00:00
admin.templates.tsx claude/sports-templates-conversion-ILWAM (#71) 2026-06-04 21:31:49 +00:00
admin.tournaments.$id.tsx Improve shared-tournament/event management UX 2026-07-02 05:17:37 +00:00
admin.tournaments._index.tsx Canonical tournament layer: 2026-05-01 21:04:48 -07:00
admin.tsx Add admin draft schedule Gantt chart 2026-07-02 00:44:23 +00:00
admin.users.tsx Add admin user management interface with search and username editing (#431) 2026-05-15 12:07:51 -07:00
api.admin.export-sports-data.ts Migrate authentication from Clerk to BetterAuth (#324) 2026-04-24 22:00:49 -07:00
api.auth.$.ts Migrate authentication from Clerk to BetterAuth (#324) 2026-04-24 22:00:49 -07:00
api.upload-avatar.ts Add Cloudinary-backed avatar system (#385) 2026-05-06 14:47:37 -07:00
api.upload-sport-icon.ts Add Cloudinary sports icon uploads (#393) 2026-05-07 16:07:34 -07:00
api.upload-team-logo.ts Add Cloudinary-backed avatar system (#385) 2026-05-06 14:47:37 -07:00
api.webhooks.cloudinary.ts Add Cloudinary-backed avatar system (#385) 2026-05-06 14:47:37 -07:00
check-email.tsx Add email verification for email/password signups (#400) 2026-05-09 23:58:45 -07:00
forgot-password.tsx fix: resolve all 48 WCAG 2.2 AA accessibility issues (#439) 2026-05-17 20:11:38 -07:00
healthz.ts Phase A: external HTTP cron jobs for snapshots, standings sync, and simulation (#79) 2026-06-08 07:42:14 +00:00
home.tsx claude/funny-maxwell-vcyb19 (#91) 2026-06-15 22:05:25 +00:00
how-to-play.tsx Add Brackt as a league-private meta-sport (#200) (#377) 2026-05-04 20:31:44 -07:00
i.$inviteCode.tsx Migrate auth from Clerk to BetterAuth (#354) 2026-04-29 10:03:50 -07:00
login.tsx fix: resolve all 48 WCAG 2.2 AA accessibility issues (#439) 2026-05-17 20:11:38 -07:00
onboarding.tsx fix: resolve all 48 WCAG 2.2 AA accessibility issues (#439) 2026-05-17 20:11:38 -07:00
privacy-policy.tsx New design (#309) 2026-04-23 13:14:55 -07:00
register.tsx fix: resolve all 48 WCAG 2.2 AA accessibility issues (#439) 2026-05-17 20:11:38 -07:00
reset-password.tsx fix: resolve all 48 WCAG 2.2 AA accessibility issues (#439) 2026-05-17 20:11:38 -07:00
rules.tsx Add Brackt as a league-private meta-sport (#200) (#377) 2026-05-04 20:31:44 -07:00
settings.tsx claude/settings-menu-urls-kbp6x8 (#116) 2026-06-30 16:01:36 +00:00
sports-seasons.$sportsSeasonId.tournament.tsx claude/great-lovelace-r3bznh (#88) 2026-06-12 22:35:35 +00:00
sports.tsx Add public sports overview page (#451) 2026-05-19 23:02:58 -07:00
support.tsx Add branded dark-themed HTML email template (#402) 2026-05-10 11:18:57 -07:00
test-socket.tsx Replace console.* with structured logger, fix no-inferrable-types (closes #98) (#199) 2026-03-21 13:41:39 -07:00
upcoming-events.tsx claude/beautiful-hawking-a72ilq (#92) 2026-06-16 14:11:51 +00:00
user-profile-redirect.tsx Refactor user profile to comprehensive settings page (#403) 2026-05-10 17:26:14 -07:00