CLAUDE.md hadde ikke skriftlig instruks om norsk kommunikasjon fra før --
lagt til under Arbeidsmåte. CHANGELOG punkt 164 omskrevet til å
reflektere at punktfiksen for den flytende knappen ble reversert (bruker
ønsker en redesign via V0 i stedet, ikke bare enda en fiks i
skjul/vis-mekanismen som allerede har hatt tre runder med bugs).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
playerListReached-effekten i round-detail.tsx hadde en stale
"if (!mapExpanded) return"-vakt igjen fra før knappens synlighets-
trigger ble frikoblet fra mapExpanded (se CHANGELOG #146). Siden
banekartet er kollapset som standard, kjørte effekten aldri for de
fleste brukere -- playerListReached ble værende false for alltid, og
knappen sluttet aldri å vises igjen etter å ha dukket opp forbi
side-flyt-knappen, inkl. over Kommentarer-seksjonen lengre ned.
Fjernet vakten, effekten måler nå alltid. Verifisert i full-stack
scratch med samme scenario som brukerens skjermdump (3 spillere + 6
kommentarer), aria-hidden bekreftet korrekt gjennom hele scrollet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Punkt 3 i scoring-paritet-gap-listen: GET /rounds/stats/summary leste
tidligere kun frittstående runder. Ny _fetch_tournament_stats_rows()
speiler hole_history.py sin N+1-per-org-henting og blander resultatet
inn i samme by_round/stat_level_by_round/played_at_by_round-dict-er som
personlige rader -- ingen endring i selve aggregeringslogikken
(_resolve_stats_window/_build_round_series/_summarize_rounds er allerede
generiske). Kilde-antall vises separat i UI (samme presedens som
hole_history.py sin times_personal/times_tournament).
5 nye pytest-tester + full regresjon (193/193), tsc rent, full-stack
scratch-verifisert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Punkt 4 og 1 i scoring-paritet-gap-listen, bygget samtidig (samme fil,
begge små/uavhengige endringer). Ny TournamentScorecardGrid erstatter
pille-rad + enkelt-spiller-HoleGrid (nå slettet) med et ekte
alle-spillere×alle-hull-rutenett, samme struktur som round-detail.tsx
sin ScorecardGrid men denne filens egne classify/scoreMarkClasses.
updateHoleFull fikk samme offline-kø-/409-håndtering som round-detail.tsx
sitt etablerte mønster (ADR-028/057/060), samme delte offline-queue.ts
uendret. Ingen backend-endring.
Ikke rullet ut mot ekte containere ennå -- venter på brukerbekreftelse.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny tournament_round_shot-tabell (org-scopet RLS, FK-et til
tournament_round_participant + hole_number siden tournament_round_hole
kanskje ikke finnes ennå). ShotMeasurementSheet/MapPointPicker gjenbrukt
uendret; ShotMeasurementEntry generalisert fra en lokal round-detail.tsx-
funksjon til en delt, URL-parameterisert komponent. Deling går til den
rundespesifikke kommentartråden (ADR-102) i stedet for Banter Board.
Autorisasjon speiler update_hole (self/org-admin), strengere enn ADR-102s
kommentar-nivå.
Migrasjon 091 IKKE kjørt mot ekte teecup_db ennå -- venter på
brukerbekreftelse før utrulling.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ekte parallell til frittstående runders RoundMessages (ADR-044), ikke
en utvidelse av Banter Board (ADR-025) -- ny org-scopet (RLS)
tournament_round_message-tabell, én tråd per turneringsrunde. Reaksjoner
og trådede kommentarer med via eksisterende PostEngagement-komponent
uendret; @-tagging og sanntid bevisst utenfor v1 (se ADR-102).
Migrasjon 090 IKKE kjørt mot ekte teecup_db ennå -- venter på
brukerbekreftelse før utrulling.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Erstatter den tidligere kun-muntlige "8-punktslisten" (referert i
ADR-099/100 men aldri committet noe sted) med en grundig, kodeverifisert
liste over 8 gjenstående gap + 1 i motsatt retning, i FEATURE_BACKLOG.md.
Ren dokumentasjon -- ingen kode endret.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Klikk på en spiller i slagspill/netto/Stableford-leaderboardet
ekspanderer nå raden til Ut/Inn-tabeller med hull-for-hull-score, portert
fra det tilsvarende mønsteret på den offentlige "Følg live"-siden. Nytt
lite, isolert backend-endepunkt (tournament_participant_id-nøkkede
hull), ingen migrasjon. StrokePlayLeaderboard sin LeaderboardRow-type
er uendret -- nytt valgfritt prop-sett på komponenten selv.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ingen migrasjon (ingen backend-endring). teecup_api + teecup_frontend
bygget og restartet. Health-sjekk OK.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Hull-først kortliste + kjedet flerspiller-veiviser (V0-skall, ekte
skjemakomponenter fra HoleStatsSheet/TournamentScoringWizard). Ingen
backend-endring. Tre reelle bugs funnet og rettet i scratch: standardhull-
valg racet mot ufullstendig data, auto-hopp uteble for spiller 2+ pga.
stale state ved spillerbytte, DSQ'et spiller blokkerte "hull ferdig"
permanent.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>
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>
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>
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>
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.
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>
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>