Migrasjon 089 kjørt mot ekte teecup_db, teecup_api + teecup_frontend
bygget og restartet. Health-sjekk OK.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ScoreTab viste hele turneringsfeltet i stedet for brukerens egen
utslagsgruppe. Defaulter nå til egen flight med "vis hele feltet"-
veksling og fallback når gruppe mangler. is_self beregnes server-side
(aldri rå user_id). Lukker et reelt RLS-hull på tournament_round_group
funnet underveis (migrasjon 089).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker: "når det er brutto som er hovedkonkurransen trenger vi ikke se
hcp i leaderboarden" -- HCP er kun meningsfullt der den faktisk brukes
til slagfordeling (netto/stableford/Københavner/BBB), ikke ren brutto/
eclectic-gross. PublicTournamentInfo += scoring_method (manglet før),
leaderboard-raden skjuler nå HCP-teksten når turneringens scoring_method
er stroke_gross eller eclectic_gross. Verifisert mot ekte Klubbmesterskap
2026 (bekreftet stroke_gross) i scratch før utrulling.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker rapporterte fra ekte mobilbruk (teecup.golf, live): THRU-etiketten
sto lavere enn I DAG/TOTAL. Thru-verdien manglet samme min-h-10 som
ScoreShape (brukt av I dag/Total) gir de andre kolonnene -- hele
Thru-kolonnen ble dermed lavere og sentrerte etiketten ut av linje.
Verifisert rettet i scratch før utrulling.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Begge byggene (dagens tidligere print-feature/valideringsfiks-bygg, og
dagens siste bygg med offentlig individuell "Følg live") bekreftet friske
og verifisert mot ekte teecup.golf. Flagger én reell gjenstående sak:
selve PDF-nedlastingsknappene er ikke klikk-gjennom-testet ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Funnet under scratch-verifisering (360px viewport): spillernavn ble kuttet
med "..." ("Erol Haag..."), under lesbarhetsbarren (CLAUDE.md, ufravikelig
tilgjengelighetsregel). Navnet får nå bryte til ny linje i stedet for å
avkortes -- undertittelen (HCP/klasse) beholder truncate siden den er
mindre kritisk. Strammet også inn radens gap/padding på de minste
skjermene for å gi navnekolonnen mer plass. Verifisert på nytt mot 360px
med et bevisst langt testnavn, bekreftet OK.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fullfører ADR-098. Ny components/public-individual-live.tsx (V0-bygget,
presentasjonslaget uendret fra eksporten) koblet til de ekte endepunktene
fra forrige commit. Rettet en reell modellmismatch underveis: V0-mock-en
modellerte hver runde som sitt eget separate leaderboard, den ekte
backend-beregningen er ett samlet, kumulativt turnering-leaderboard --
rundevelgeren styrer nå kun hvilken rundes hull-for-hull som lastes.
Ny offentlig GET .../rounds/{round_id}/participants/{tournament_participant_id}
/holes for hull-for-hull-utvidelsen (egen rute, ikke gjenbruk av
frittstående-runders tilsvarende -- ulik datamodell).
app/t/[id]/live/page.tsx avgjør nå format SERVER-side før noe rendres,
unngår klient-side-feilklassen fra forrige commit helt for denne siden.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Org-individuelle turneringer manglet en fungerende offentlig tilskuerside
helt (bevisst utsatt i FEATURE_BACKLOG.md 2026-08-14, "hvis/når etterspurt"
-- nå etterspurt). Denne runden bygger backend-grunnmuren:
- PublicTournamentInfo += format_type (manglet, landingssiden kunne ikke
skille format offentlig).
- Ny GET /public/tournaments/{id}/rounds -- rundeliste med utledet status
(ikke startet/pågår/fullført).
- Ny GET /public/tournaments/{id}/individual-leaderboard -- gjenbruker
_compute_individual_standings uendret, fjerner kun player_id, inkluderer
HCP (bruker bekreftet eksplisitt).
- Sanntid: broadcast_live_update() koblet inn i _recompute_round_score,
gjenbruker samme WebSocket-kanal Cup-siden allerede bruker (ADR-027-
mønsteret), ingen ny WS-infrastruktur.
- public-tournament.tsx sin "Program"-seksjon viser nå rundeliste for
individuelle turneringer i stedet for en alltid-tom Cup-økt-liste.
Selve "Følg live"-sidens UI (V0) og /t/[id]/live sin format-forgrening
gjenstår -- egen commit når V0-eksporten er klar.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Organisator delte ved et uhell sin egen admin-URL (/tournaments/{id}?org=...)
i stedet for den ekte offentlige (/t/{id}) -- lenken fantes fra før, men var
kun ren, ikke-kopierbar tekst. tournament-presentation.tsx fikk en ekte
kopier-knapp.
Reell, uavhengig bug: tournament-router.tsx falt ubetinget tilbake til
Cup-format-adminskjermen ved ENHVER feil i formatoppslaget, inkl. 401 for en
ikke-innlogget besøkende -- viste et ødelagt lag-oppsett-skjermbilde for en
individuell turnering. Skiller nå 401 fra andre feil og sender videre til
den ekte offentlige siden i stedet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Alle 4 runder peker nå på riktig offisiell bane, 51 spilleres utslag
korrekt flyttet, tre duplikat-baner slettet, lekket bane-mal rettet.
Gitignorer backups/ (fulle databasedumper skal aldri committes).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rotårsak for "banen er allerede importert"-forvirringen rundt Tjøme-baner:
teeoffs egen hull-data hadde en duplisert hcp-indeks (13 to ganger, 14
manglet). Manglende validering lot dette komme gjennom og feile stille på
en UNIQUE-constraint, oversatt til den misvisende DUPLICATE-meldingen.
Legger til eksplisitt 1-18-validering før lagring, med en ærlig feilkode/
-melding, i både teeoff- og GolfAPI-import-stiene og alle fire frontend-
kallstedene.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Løpende/Shotgun-veksler i rundens gruppeoppsett og øktoppsett, per-
gruppe/per-match starthull-felt i shotgun-modus. Fant og rettet en
reell bug underveis: begge skjermene hadde en hardkodet sequence-sort
som stille overstyrte backendens starthull-sortering for shotgun.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny start_mode ('consecutive'/'shotgun') på tournament_round + session,
og valgfri start_hole på tournament_round_group + match. Shotgun: alle
grupper/matcher går ut samtidig, sortert etter starthull i stedet for
klokkeslett. Reverserer/utvider migrasjon 084s bevisste "ikke shotgun"
fra 2026-08-18 -- nytt behov oppdaget under utskrift-planlegging.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Flytende "Registrer score" trigges nå av faktisk synlighet til
side-flyt-knappen, ikke av om banekartet er utvidet -- en lang
hindringsliste alene (uten utvidet kart) kunne dytte knappen ut av
syne uten at den flytende versjonen noensinne dukket opp.
- Hindringslisten sortert fra fjernest (øverst) til nærmest (nederst),
matcher loddrett telefon-holdning med green øverst/utslag nederst.
Bakkant brukt som sorteringsnøkkel der en finnes.
- Kartretning ved slagmåling følger nå ekte utslag->green-geometri
(green opp/utslag ned) når begge er kjent, vinner over den eldre
forrige-slag-gjetningen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- "Administrer runde"-dialogen lukker seg nå automatisk ved navigasjon
til "Spillere og runde" (var stående åpen ved samme-rute-navigasjon).
- HCP kan nå overstyres for en kontokoblet medspiller fra første stund
i veiviseren, ikke bare senere via "Runde og runde". Backend sitt
add_participant æret aldri en eksplisitt overstyring for user_id,
ulikt PATCH-endepunktet (ADR-038-avvik, nå rettet).
- Standard statistikknivå for en NY medspiller er nå "Kun slag" i
stedet for å arve scoreførerens eget valg.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Overlevere auto-legges til runder etter cut (tee kopiert fra cut-runden),
kuttede spilleres rundedeltakelse fjernes -- med mindre de allerede har
scorer der, da beskyttes dataene av eksisterende cut-sperre i stedet.
Bruker bekreftet eksplisitt: kaskade til ALLE runder, ikke bare neste.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker aksepterte eksplisitt den svakere verifiseringen på denne, med
plan om å reversere/justere om nødvendig.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
scrollToHolePanel() brukte samme flawed scroll-mt-28-mønster som
scrollToPlayerList() hadde i #142 -- byttet til samme getHeaderHeight()-
baserte manuelle scroll. Denne kalles fra BÅDE manuell Forrige/Neste OG
automatisk hull-fremgang etter siste spillers siste steg. Kunne IKKE
klikkes gjennom og verifiseres presist denne runden -- scratch-
nettleserøkten hard-reloadet uforklarlig på ethvert router.replace-kall,
også mot den ekte /my-rounds/[id]-ruta. Notert ærlig som et
verifiseringsgap i CHANGELOG.md #143, ikke skjult. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Presis scratch-måling avdekket at den hardkodede 112px-antagelsen (arvet
fra scroll-mt-28) var feil -- ekte headerhøyde var 141.5px for en runde
med bane+utslag+dato+klokkeslett samtidig, siden headeren pakkes til
flere linjer avhengig av innhold. Ny getHeaderHeight() måler live i
stedet for å gjette. scrollToPlayerList() erstatter scrollIntoView med
manuell beregning; playerListReached bruker samme terskel (delt
SCROLL_GAP_PX-konstant) -- måtte rettes en gang til underveis da de to
brukte ulike terskler. Se CHANGELOG.md #142. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny playerListReached-tilstand skjuler den flytende knappen (og dens
spacer) fra #140 så snart spillerlisten når headerens høyde -- forblir
skjult resten av veien nedover, dukker opp igjen kun ved scroll tilbake
opp forbi listen. Første forsøk med IntersectionObserver+rootMargin var
feil (fyrer ikke på interne terskler mens allerede overlappende) -- byttet
til en scroll/resize-lytter med direkte getBoundingClientRect-sjekk. Se
CHANGELOG.md #141. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
V0-eksport integrert: RegisterScoreButton gjenbrukt i normal flyt
(kollapset) og som fixed bottom-pinnet knapp (utvidet), med gradient-
scrim, skygge, safe-area-inset-bottom, og aria-hidden/pointer-events-none
korrekt håndtert når skjult. Se CHANGELOG.md #140. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
playerListRef brukte scroll-mt-4, mens holePanelRef (samme sticky-header-
problem, hull-til-hull-navigasjon) allerede riktig bruker scroll-mt-28.
Samme verdi nå begge steder. Se CHANGELOG.md #139. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker viste et nytt skjermbilde fra live etter forrige fiks -- ingen
synlig forskjell. pt-3/pt-4 kuttet bare 12px av en 44-52px kombinert
avstand, for lite til å merkes på en full mobilskjerm. main sin
toppadding er nå pt-0 -- eneste luft mot headeren er nå seksjonenes egne
mt-5/mb-5, samme rytme som resten av siden. Se CHANGELOG.md #136.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
V0-eksport integrert: PlayerCardMore utvidet med scoreButton/measureShot-
props, navnereden er nå en ikke-knapp wrapper med score-knappen og en
kompakt "Mer"-pille som søsken (unngår button-i-button). "Mål et slag" er
ikke lenger en egen rad -- ligger nå i "Mer"-panelet, og er (som
historikk) begrenset til player.isSelf; var tidligere synlig for alle
spilleres kort. Se CHANGELOG.md #138. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
To brukerpåpekte funn: (1) unødvendig stort tomrom mellom RoundHeader og
hull-navigatoren når ingen varsel-banner vises -- main sin toppadding
stablet seg oppå seksjonens egen mt-5 i stedet for å erstatte den.
(2) hindringer skal kun vises når de fortsatt ligger mellom spiller og
green -- passerte hindringer var unødvendig støy. Se CHANGELOG.md
#136/#137 for detalj og verifisering. Punkt 2 ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
V0-eksport (etter Claude-skrevet prompt) integrert som ny PlayerCardMore-
wrapper -- eier kun vis/skjul, de ekte HoleHistoryPanel/
ParticipantCompletionActions sendes inn uendret. Kun PlayerHoleCards
(Score-fanen) berørt, ikke PlayerList (administrasjonsvisningen). Se
CHANGELOG.md #135 for full detalj og verifisering. Ikke rullet ut ennå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fire brukerpåpekte oppfølgingsfunn rett etter forrige runde (#133):
Deg-badgen på spillerkort er unødvendig, historikk-panelet viste seg
feilaktig på medspilleres kort, kompakt avstandsmåler falt tilbake til
en generisk varseltrekant i stedet for ekte hindrings-ikoner, og den
nye Spillere-og-runde-vekslen duplikerte RoundHeader sin Administrer-
knapp. Se CHANGELOG.md #134 for full detalj og verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Avstandsmåleren fylte hele mobilskjermen uten å antyde at score-
registrering fantes lenger ned (funnet via brukers skjermbilde). Viser nå
kompakt som standard med en "Vis banekart"-utvidelse og en alltid synlig
"Registrer score"-snarvei. Den separate, duplikate "Score"-pillefanen inni
round-detail.tsx (visuelt identisk med RoundHeader sin egen Score/
Scorekort/Leaderboard-rad) er erstattet med én tydelig annerledes
veksle-knapp -- fikser samtidig et reelt navigasjonshull der det ikke
fantes noen vei tilbake til Score fra en ekstern "?tab=manage"-lenke.
Full gjennomlesning av frontend (og enkelte steder backend-autorisasjon)
for å skrive funksjonsspesifikasjoner avdekket 16 reelle, eksisterende
hull -- usynlige rettighetsbegrensninger, stille lagringsfeil, ujevn
bekreftelse på slett/fjern-handlinger m.m. Ikke fikset, kun fanget opp
som egne, fremtidige runder.
Funnet via brukers skjermopptak av forsøk på å endre én spillers
utslag -- en ikke-tilordnet rad viste kun en død strek, ingen
interaktiv kontroll, og et feilklikk på den tette avkrysningsboksen
satt brukeren fast. Utslagsvelgeren vises nå alltid; å velge et
utslag tilordner raden automatisk. Boks og select har også fått
tydelig mer avstand for å redusere feilklikk.
To reelle bugs i rundedeltakelse: enkelt-rad utslagsendring sendte feil
ID-type til backend (traff alltid 404, stille), og "Velg alle" hoppet
over allerede-tilordnede deltakere slik at et valgt standardutslag
aldri slo inn for dem. Begge rettet. I tillegg: ny hjelpetekst i
Spillere-steget og et nytt FAQ-spørsmål forklarer at turnering-HCP er
en bevisst frosset kopi av spillerpoolen (ADR-090), ikke en bug.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bg-muted er grønntonet i denne paletten (klubbhus-fargene) -- brukeren
presiserte "Lyse GRÅ striper, ikke lyse grønne". Løst med translucent
svart/hvitt-overlegg (bærer ingen fargetone) i stedet for en fargtonet
token, fungerer automatisk riktig i begge temaer.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
HCP: type="number" blokkerte komma-tegnet i nettleseren før JS-parsingen
noensinne så det; byttet til text+inputMode=decimal og lagt til manglende
.replace(",",".") i tre lagre-stier. Deltakertabell: "Rediger i
spillerpoolen" er en full sidenavigasjon, bfcache kunne gjenopprette
turneringssiden i utdatert tilstand -- løst med stille bakgrunns-refresh
ved visibilitychange/pageshow. Spillerpool: zebra-striper lagt tilbake
oppå rutenett-stilen fra forrige runde.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
EditTable (player-import-view.tsx) får samme grid-stil som
spillertabellen, med individuell kolonnebredde per felt slik at alle
13 spillerpool-felt får plass uten sidescroll. mode.kind==="roster"-
grenen bevart ved manuell fletting siden V0-eksporten var en eldre
snapshot uten den varianten.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker sammenlignet med et regneark og påpekte unødvendig sidescroll
på bred skjerm -- tettet opp med rutenett-stil og en colgroup som lar
rundekolonnene fylle resten av bredden. Samme props-kontrakt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>