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>
Fanget opp i FEATURE_BACKLOG.md (ikke designet/bygget ennå) + en
pekende note i scorekort-spec-dokumentet der id-en skal vises.
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>
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>