diff --git a/.claude/settings.json b/.claude/settings.json
index 066c2c9..5192318 100644
--- a/.claude/settings.json
+++ b/.claude/settings.json
@@ -49,7 +49,39 @@
"Bash(grep -n \"participants/\\\\${\" /opt/teecup/frontend/components/round-detail.tsx)",
"Bash(python3 -)",
"Bash(curl -s -o /dev/null -w \"teeoff.no: %{http_code}\\\\n\" https://teeoff.no/)",
- "Bash(python3 -c \"import ast; ast.parse\\(open\\('app/routers/rounds.py'\\).read\\(\\)\\)\")"
+ "Bash(python3 -c \"import ast; ast.parse\\(open\\('app/routers/rounds.py'\\).read\\(\\)\\)\")",
+ "Bash(tee /tmp/ui_round_setup.json)",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/ui_round_setup.json'\\)\\)['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/ui_round_setup.json'\\)\\)['session_cookie']\\)\")",
+ "Bash(docker cp *)",
+ "Bash(mkdir -p /opt/teecup/frontend/app/my-rounds/\\\\[id\\\\]/leaderboard)",
+ "Bash(node /tmp/claude-1000/-opt-teecup/a8bd2fc3-4b9c-4682-a2be-cf36e143de78/scratchpad/test_leaderboard_rank_logic.mjs)",
+ "Bash(tee /tmp/lb_setup.json)",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup.json'\\)\\)['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup.json'\\)\\)['session_cookie']\\)\")",
+ "Bash(grep -n '^---$' /opt/teecup/FEATURE_BACKLOG.md)",
+ "Bash(awk -F: '$1 > 1225 && $1 < 1260')",
+ "Bash(tee /tmp/lb_setup2.json)",
+ "Bash(python3 -c ' *)",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup2.json'\\)\\)['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup2.json'\\)\\)['session_cookie']\\)\")",
+ "Bash(node /tmp/claude-1000/-opt-teecup/a8bd2fc3-4b9c-4682-a2be-cf36e143de78/scratchpad/test_leaderboard_points_mode.mjs)",
+ "Bash(tee /tmp/lb_setup3.json)",
+ "Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); print\\(d['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup3.json'\\)\\)['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup3.json'\\)\\)['session_cookie']\\)\")",
+ "Bash(node /tmp/claude-1000/-opt-teecup/a8bd2fc3-4b9c-4682-a2be-cf36e143de78/scratchpad/test_hole_secondary.mjs)",
+ "Bash(tee /tmp/lb_setup4.json)",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup4.json'\\)\\)['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/lb_setup4.json'\\)\\)['session_cookie']\\)\")",
+ "Bash(ffprobe -v error -show_entries format=duration,size -show_entries stream=width,height,codec_name -of default=noprint_wrappers=0 /opt/teecup/screen-20260726-152057-1785072037213.mp4)",
+ "Bash(node /tmp/claude-1000/-opt-teecup/a8bd2fc3-4b9c-4682-a2be-cf36e143de78/scratchpad/test_scoring_wizard_logic.mjs)",
+ "Bash(tee /tmp/wizard_setup.json)",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/wizard_setup.json'\\)\\)['round_id']\\)\")",
+ "Bash(python3 -c \"import json; print\\(json.load\\(open\\('/tmp/wizard_setup.json'\\)\\)['session_cookie']\\)\")"
+ ],
+ "additionalDirectories": [
+ "/opt/teecup/frontend/app/my-rounds/[id]"
]
}
}
diff --git a/CLAUDE.md b/CLAUDE.md
index 8079036..da6f866 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -3205,19 +3205,224 @@ Ferdig og verifisert:
`test_isolation.sql` fortsatt 12/12), deretter `docker compose up -d
--build teecup_api teecup_frontend`. Begge containere boot-et rent,
`/health`/`/dashboard` → 200, `teeoff.no` upåvirket.
+- **Spillerliste-redesign HÅNDKODET (2026-07-26), IKKE ENNÅ RULLET UT:**
+ brukeren gikk tom for V0-credits rett etter at prompten over ble sendt.
+ Spurt eksplisitt (AskUserQuestion): bygg direkte, eller vent på fornyede
+ credits — svar: bygg direkte. Bygget nøyaktig etter samme prompt/data-
+ kontrakt som allerede var skrevet (se FEATURE_BACKLOG.md for full
+ detalj), i samme Tailwind/shadcn-stil som resten av `round-detail.tsx`.
+ Ny `PlayerList` (erstatter `PlayerTabs`) — vertikal liste av spillerkort,
+ hvert kort en stor "velg som aktiv spiller"-knapp + separate Rediger-/
+ fjern-knapper (unngår nestede interaktive elementer), "Deg"/"Eier" som
+ `Badge`-komponenter. `EditParticipantPanel` utvidet med statistikknivå
+ (den frittstående `StatLevelPicker` er nå død kode, fjernet) og — kun
+ for gjester — Navn/Kjønn/E-post, med reaktivt utslagsfilter ved
+ kjønnsendring. "+ Medspiller"-flyten flyttet inn i selve `PlayerList`.
+ **Verifisert:** ekte typesjekket produksjonsbuild kompilerte rent, pluss
+ en engangs `next dev`-container mot scratch-backend (ekte runde med en
+ gjest med avvikende utslag/kjønn/e-post) — siden ga 200, ingen Next.js-
+ feilside. **Ærlig begrensning:** siden er en klient-komponent (data
+ hentes etter hydrering), så server-HTML-en viser kun last-skjelettet —
+ INGEN ekte nettleser-interaksjonstest utført (intet nettleserverktøy
+ tilgjengelig).
+ **Rullet ut mot ekte systemer 2026-07-26**, bruker bekreftet eksplisitt:
+ ingen ny migrasjon, `docker compose up -d --build teecup_api
+ teecup_frontend`. Begge containere boot-et rent, `/health`/`/dashboard`
+ → 200, `teeoff.no` upåvirket. **Bruker bør selv klikke gjennom flyten**
+ (spesielt gjeste-kjønnsendringens reaktive utslagsfilter og "velg vs.
+ rediger"-trykkflatene) før full tillit.
+- **Tildelte slag + jevn korthøyde + rundeleaderboard, HÅNDKODET, IKKE ENNÅ
+ RULLET UT (2026-07-26):** to oppfølgingspunkter samme dag, full detalj i
+ FEATURE_BACKLOG.md. (1) Spillerkortet manglet "tildelte slag" (course
+ handicap for runden) og hadde variabel høyde — rettet: `Player` fikk
+ `courseHandicap`, kortet fikk fast `min-h-[68px]` med begge tekstlinjer
+ trunkert til én linje (ikke wrap), alle kort like høye uansett innhold.
+ (2) Brukeren spurte om jeg "med designerbrillene på" trodde jeg kunne få
+ rundeleaderboardet til å se like profesjonelt ut som V0 — svarte ja
+ (gjenbruk av etablerte mønstre, ikke fri utforskning) og bygget det: ny
+ `components/round-leaderboard.tsx` + rute `/my-rounds/[id]/leaderboard`,
+ gjenbruker `ScoreMark`s "form + farge"-språk fra `round-scorecard.tsx`
+ (som `ToParMark`), samme WS-sanntid-mønster som `round-stats.tsx`, delt
+ plassering ("T-N"), brutto/netto-veksling, mini-variant på rundens egen
+ side. Rangeringslogikken VERIFISERT UAVHENGIG i et frittstående
+ Node-script (19/19, inkl. tie-håndtering og uspilte spillere), pluss en
+ fersk scratch-runde med ekte API-kall som bekreftet leaderboard-JSON-en
+ stemte. Ekte typesjekket produksjonsbuild kompilerte rent. Samme ærlige
+ begrensning som over: ingen ekte nettleser-interaksjonstest.
+ **Rullet ut mot ekte systemer 2026-07-26**, bruker bekreftet eksplisitt:
+ ingen migrasjon, `docker compose up -d --build teecup_api
+ teecup_frontend`. Begge containere boot-et rent, `/health`/`/dashboard`
+ → 200, `teeoff.no` upåvirket.
+- **Hullscorer i leaderboardet + lenke fra rundelisten, BYGGET, IKKE ENNÅ
+ RULLET UT (2026-07-26):** brukeren presiserte rett etter forrige rulling
+ tre krav: leaderboardet skal ha en egen visning (allerede tilfellet, se
+ over), med lenke fra scoreføringssiden (allerede der, `RoundLeaderboardMini`)
+ OG fra rundelisten (`/my-rounds`, manglet), og skal vise hullscorer
+ (manglet helt -- kun aggregerte tall fantes).
+ **Backend:** `LeaderboardEntryOut` (`GET /rounds/{id}/leaderboard`) fikk
+ et nytt `holes: list[LeaderboardHoleOut]`-felt (hole_number/par/
+ stroke_index/played/score) -- data var ALLEREDE hentet per deltaker for
+ å beregne total_score/net_score_to_par, bare aldri eksponert rått før nå.
+ Ren tilføyelse, ingen migrasjon.
+ **Frontend:** `round-leaderboard.tsx` sine rader er nå klikkbare
+ (utvider/kollapser, default kollapset -- samme "trekkspill starter
+ lukket"-konvensjon som `round-stats.tsx`) og viser en horisontal strip
+ med per-hull-merker (`HoleMark`/`HoleStrip`, egen lokal variant av
+ `ScoreMark`s "form + farge"-språk fra `round-scorecard.tsx`, tilpasset en
+ kompakt flerspiller-liste i stedet for én tabell). `round-card.tsx`
+ (brukt av BÅDE `/my-rounds`-listen og dashbordets "Kommende runder") fikk
+ en ny "Se leaderboard"-lenke for runder med mer enn én deltaker --
+ krevde å gjøre om kortets ytre element fra selve lenken til en `