Navn/datoer/synlighet/beskrivelse/påmelding -- rent innbytte mot
props-kontrakten. Fant og fikset samme tidssone-bugklasse som ADR-088
proaktivt denne gangen (mønstergjenkjenning) før den nådde en nettleser.
name/start_date/end_date manglet helt fra TournamentUpdate. Påmeldings-/
synlighetsfeltene var allerede fullt fungerende på backend (ekte
selvregistrerings-logikk), men uten UI noe sted -- V0-prompt skrevet for
en ny TournamentSettingsCard, ikke bygget ennå.
Organisator velger metode fritt i Oppsett, uavhengig for vinner og
resten av feltet. Countback er kaskaderende siste 9->6->3->1 hull i
siste runde. Påvirker aldri Cut-grensen -- strukturelt håndhevet, ikke
bare avtalt ved konvensjon. Migrasjon 085 lagt til, men IKKE anvendt mot
ekte teecup_db ennå -- venter på bekreftelse.
Tradisjonelt utslag (samme starthull, staggerte klokkeslett med fast
intervall), manuell gruppesammensetning med et forslag å justere, fast
gruppestørrelse. Fire ekte bugs funnet og fikset før utrulling via egen
scratch-verifisering (FK-korrupsjon, str/datetime-mismatch, tidssone,
React state). Migrasjon 084 lagt til, men IKKE anvendt mot ekte
teecup_db ennå -- venter på bekreftelse.
Manuelt anvendt (organisator trykker "Anvend cut"), etter et valgt
rundenummer. Kuttede spillere blokkeres fra scoring i senere runder og
vises i egen seksjon på leaderboardet. Migrasjon 083 lagt til, men IKKE
anvendt mot ekte teecup_db ennå -- venter på bekreftelse.
create_players_bulk matchet kun på e-post -- rader uten e-post ble alltid
satt inn på nytt selv om en identisk spiller allerede fantes (ni ekte
dubletter funnet i produksjon). Bulk-endepunktet tar nå et eksplisitt
match_player_id/duplicate_action per rad; frontend oppdager mulige
duplikater (navnetreff, ingen e-post) og spør organisator eksplisitt før
lagring, i stedet for å gjette.
Deltakere som ikke har spilt noe ennå fikk feilaktig totalLabel "E"/"0 p"
(til forveksling likt en ekte, jevn score) og en tallfestet sisteplass.
Vises nå nøytralt: total/posisjon null/None, og runde-nivåets tee-tid/
starthull (hvis satt) i stedet for score-cellen.
Rent innbytte -- identisk props-kontrakt. Løser bredde/autoscroll-bugene
fra forrige runde mer robust (ekte ResizeObserver-måling i stedet for en
brytningspunkt-antakelse), autostarter rulling for ubetjent
kiosk-visning, og legger til dempet visning for WD/DQ/DNS/NR/CUT-rader.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
StrokePlayLeaderboard var bygget for å skalere opp på lg:-brytningspunkt,
men satt inni en delt max-w-4xl-wrapper som aldri lot den. Samme
brytningspunkt fjernet skrolle-taket helt, så autoscroll-tickeren fikk
aldri noe å bevege for et stort felt. Begge rettet -- ren visuell polish
kommer i en oppfølgende V0-redesign av samme komponent.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Nytt DELETE /orgs/{id}/tournaments/{id}, kun org-eier/admin. Eksplisitt
riktig-rekkefølge-sletting (ikke naiv kaskade) siden to RESTRICT-FK-er
sitter midt inni kaskade-grafen for begge turneringsformater -- verifisert
med fire nye backend-tester mot ekte populerte data. Søppelbøtte-ikon i
begge turnering-headerne med sterk confirm()-tekst.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny /organizations/[id]/players-rute gjenbruker spillerimport-tabellen
(ADR-082) uendret, men med ny orkestrering: laster eksisterende
spillere og lagrer med ekte PATCH per endret felt, ikke det
fyll-tomme-felt-eneste bulk-importendepunktet (som aldri overskriver
et allerede satt navn/HCP -- ubrukelig for reell redigering).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
currentHole levde kun i React-state, seedet fra round.start_hole ved
hver mount -- en refresh mistet valget og hoppet alltid tilbake til
starthullet. Fikset med samme URL-parameter-mønster tab-valget
allerede bruker: ny setHoleAndUrl() holder state og ?hole=N i sync
via router.replace (ikke push, for å unngå å fylle historikken med
ett tilbake-steg per hull).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fant en andre, atskilt kopi av Tjømes koordinatdata (den org-tilknyttede
"official" banen brukt av turneringer/lag-matchplay) som forrige rundes
reimport ikke traff. Samme datasett satt inn der også -- ren datafiks,
ingen kodeendring.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Hindringslisten manglet eksplisitt nærmest-spilleren-først-sortering --
fikset. Kryssjekk mot kildedata avdekket 12 kjente side_fairway-feil,
løst via full reimport av Tjømes 194 koordinatpunkter fra et nytt,
standardisert CSV-format (kjørt separat mot ekte teecup_db, ikke del
av denne commiten). To nye hindringstyper (fairway/stone_fence) med
egne ikoner.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Siste klassifiserte hindringstype uten eget ikon. Ren frontend-endring
-- road fantes allerede som domeneverdi og ekte data, bare usynlig i
diagrammet inntil nå.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny migrasjon 081 legger til creek i det delte course_poi_type-domenet.
Kobler inn brukerens nye bekk-ikon i diagrammet og reklassifiserer de
8 kjente Tjøme-bekk-punktene (hull 2/3/11/12) fra water til creek,
identifisert via samme koordinat-regneark som ga hazard_group-dataen
i forrige runde.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ett-ikon-overlapp-fiks i midtbanen (green-ikonet manglet reservert
plass), bak-green-rendering (hindringer bak selve greenen vises nå over
green-ikonet i stedet for klemt inn i vanlig-sonen), fem nye
hindringsikoner, og en omskrevet liste (én rad per hindring, med
bane/posisjon-info).
Setter i tillegg ekte hazard_group-verdier på Tjømes koordinatdata,
utledet fra klubbens eget koordinat-regneark (som viste seg å ha en
egen gruppenummer-kolonne) i stedet for en heuristikk -- løser
definitivt de flerbunker-hullene forrige runde bevisst lot stå
uklassifisert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Migrasjon 080 kjørt mot ekte teecup_db og teecup_api/teecup_frontend
redeployet, begge med brukerens eksplisitte bekreftelse i samme økt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Erstatter ADR-083 sin kontinuerlige crossMeters-forskyvning, som ga for
liten synlig venstre/høyre-forskjell på ekte banedata (Tjøme hull 18).
Baner velges nå kategorisk via side_fairway; green/tee/spiller alltid
på senterakse. Ny hazard_group-kolonne (migrasjon 080, ikke rullet ut
mot ekte DB ennå) lar to punkter eksplisitt pares til én carry-hindring
(forkant+bakkant) uten å risikere å slå sammen to atskilte hindringer
på samme side.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docker compose build/up teecup_frontend 2026-08-17 etter bekreftelse
fra bruker, ingen migrasjon.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Integrerer V0-eksporten for hole-diagram-view.tsx. Traff props-
kontrakten i prompten eksakt -- ingen integreringsjustering nødvendig,
tsc rent på første forsøk. Egne tillegg fra V0 utover prompten: full
aria-label-oppsummering av hele diagrammet for skjermlesere, lett
kollisjons-unngåelse for nære hindringsetiketter.
Re-verifisert i scratch mot samme kjente syntetiske geometri som den
midlertidige hånd-kodede versjonen -- identiske tall/posisjoner.
Lys+mørk bekreftet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fikser to ting rapportert fra ekte produksjonsskjermbilde: (1) kun
nærmeste hindring ble vist -- target-distance.tsx viser nå ALLE
hindringer, sortert nærmest først, uavhengig av om et diagram kan
tegnes. (2) Nytt hull-diagram (hole-diagram-view.tsx) plasserer
hindringer og spiller i 2D langs en fast tee->green-akse, tee nederst/
green øverst konsistent uansett gangretning.
Ny geometri-modul frontend/lib/hole-geometry.ts (projectOntoAxis,
bygget på eksisterende haversineMeters/bearingDegrees) med 10
enhetstester som beviser matematikken riktig før noe visuelt ble
bygget. Verifisert i scratch mot presist kjente syntetiske koordinater
-- alle tall og posisjoner stemte eksakt med håndregnede fasitverdier.
Midlertidig hånd-kodet visning, venter på V0-eksport for den polerte
versjonen (samme mønster som FlagPlantSheet/PlayerImportPanel). Ingen
migrasjon, ingen backend-endring.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docker compose build/up 2026-08-17 etter bekreftelse fra bruker, ingen
migrasjon. Oppdaterer "Rullet ut: ikke ennå"-placeholderne.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Integrerer V0-eksporten (tee-cup-login-screen.zip) for spillerimport-
panelet. Splittet i player-import-view.tsx (V0, ren kontrollert visning)
+ player-import-panel.tsx (orkestrering, uendret ekstern kontrakt) --
samme mønster som FlagPlantSheet.
Fant og fikset en reell integreringsfeil i scratch: V0s kjønn-nedtrekk
bruker female/male/other, rå CSV-tekst ("m"/"f") ble kopiert inn
uendret og ville stille mistet data ved lagring -- fikset med egen
verdinormalisering ved kolonnetilknytningen. æøå-kolonnegjetting-
begrensningen fra forrige commit fikset samtidig.
Ny STÅENDE regel lagt til CLAUDE.md underveis: turneringsoppsett
designes stor skjerm først (organisatoren sitter foran en PC), ikke
mobil-først -- V0-prompten oppdatert og kjørt på nytt med dette kravet
før eksporten som integreres her.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny POST /orgs/{id}/players/bulk (samme e-post-match-dedup-mønster som
selvregistreringens ADR-017 Beslutning B, utvidet til alle felt).
CSV parses klient-side (papaparse), enkel kolonnegjetting, redigerbar
forhåndsvisning før lagring. Dekker både lagturneringer (lagtildeling)
og individuelle turneringer (klassetilknytning) i samme flyt -- begge
steg samlet (org-pool + turneringspåmelding).
Midlertidig hånd-kodet UI (player-import-panel.tsx) bygget for å bevise
hele kjeden ende-til-ende -- venter på V0-eksport for den polerte
visningen før samlet utrulling, samme rekkefølge som FlagPlantSheet.
5 nye backend-tester (111/111 totalt), tsc rent, 45/45 vitest, full
scratch-verifisert i begge turneringsformater.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Migrasjon 079 kjørt og teecup_api/teecup_frontend rullet ut 2026-08-17
etter bekreftelse fra bruker. Tjømes offisielle bane fylt med de 180
feltbefarte koordinatene fra forrige runde.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bruker lastet opp mer presise, feltbefarte koordinater for Tjøme
Golfklubb (180 punkter) til erstatning for GolfAPI.io sin automatiske
cache (167 punkter). Ny poi_type "landmark" (samme mønster som
rock/layup i migrasjon 067) for en fysisk bjelle uten annen match.
Kun tredjeparts-cache i teecup_db berørt, ingen kodeendring.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Migrasjon 077 kjørt og teecup_api/teecup_frontend rullet ut 2026-08-17
etter bekreftelse fra bruker. Oppdaterer "Rullet ut: ikke ennå"-
placeholderne fra forrige commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Selvbetjent sammenslåing av to TeeCup-kontoer: keeper (initiativtaker)
ber om sammenslåing, bekreftelseslenke sendt til taperens e-post beviser
eierskap, taperens data (org-medlemskap/spillerkoblinger/runder/venner)
flyttes over og taperens konto slettes. Ny migrasjon 077 (account_merge_
token, ikke kjørt mot ekte teecup_db ennå), ny app/account_merge.py
(N+1-transaksjoner per RLS-grensen, fullt konfliktkart), nye endepunkter
i app/routers/account_merge.py, ny frontend-seksjon i kontoinnstillinger
+ egen bekreftelsesside.
Fant og fikset en reell RLS-relatert bug via testsuiten før produksjon:
seks RLS-beskyttede tabeller var feilaktig plassert i den globale
"trygt å re-peke"-løkken, forårsaket et krasj pga. en Postgres GUC-kvirk
på pooled forbindelser. Se ADR-080 for full begrunnelse.
12 nye tester (95/95 backend totalt), full scratch-verifisert
ende-til-ende inkl. lys/mørk, ekte teecup_db urørt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Historikk-panelet flyttet ut av selve slagvinduet/-arket i begge flyter:
inn i PlayerHoleCards-kortet (frittstående runder), som nytt "overview"-
steg med auto-hopp når tomt (org-turneringer). Klikk åpner nå en ny delt
full-historikk-skjerm (hole-history-detail.tsx) med aggregerte tall og en
score-fordeling som fargede stolper -- samme CategoryBar-mønster som
round-stats.tsx, ingen ny graf-avhengighet. Ingen backend-endring.
tsc + 45/45 vitest, scratch-verifisert i begge flyter inkl. kombinert
historikk på tvers av runde-/turneringstyper og auto-hopp for hull uten
historikk (lys+mørk). Rullet ut.
Med dette er alle tre forbedringene i score-registreringen (ADR-077/078/079)
fullført.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Splittet ScoringWizard sitt "details"-steg i "direction"/"holeDetails",
og bygget om HoleStatsSheet (org-turneringer) fra én lang skjerm til
tilsvarende steg-flyt -- samme opplevelse i begge scoringsflyter, uten å
røre HoleStatsSheet sin egen (bevisst annerledes) lagringsmodell.
Visuell polering via V0: de fire tellerne fikk et 2x2-rutenett av
flis-kort i stedet for en 1-kolonne-stabel. Stepper-komponenten er delt
mellom begge flyter, så endringen gjelder automatisk begge steder.
tsc + 45/45 vitest, scratch-verifisert i begge flyter (lys+mørk). Rullet ut.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Kontekst-raden i ScoringWizard (alle spillerne, aktiv fremhevet) var
bevisst ikke-interaktiv ved bygging. Trygt å gjøre interaktiv nå: hvert
felt lagres allerede for seg med en gang (PATCH per felt), så bytte
spiller midt i et steg gir ingen datatap. Løser at man måtte fullføre
hele samlebånd-flyten for å rette opp en tidligere spillers feil.
tsc + 45/45 vitest, scratch-verifisert i nettleser (lys+mørk). Rullet ut.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Siste av de tre gjenstående OOM-punktene fra ADR-043 (lag-OOM ADR-074,
eclectic på tvers av turneringer ADR-075, offentlig visning her).
Migrasjon 076: SECURITY DEFINER-bro public_order_of_merit_by_id, samme
anti-enumerering som public_org_by_slug/public_tournament_by_code. Ny
/public/order-of-merits/{id}-endepunkt (gjenbruker den eksisterende
leaderboard-beregningen direkte). Ny uautentisert frontend-side
modellert på public-club.tsx, "Del offentlig lenke" i innstillinger.
83/83 backend-tester, 45/45 vitest, scratch-verifisert i egen inkognito-
nettleserkontekst (ingen session-cookie). Migrasjon vist og bekreftet
før kjøring mot ekte teecup_db. Rullet ut.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sesong-"drømmerunde" -- beste resultat per hull på tvers av ALLE lenkede
turneringer (stableford/brutto/netto), med samme-bane-håndheving ved
lenking og modus-bytte. Gjenbruker eclectic_best_per_hole() uendret fra
handicap_engine.py. Frontend: "Eclectic" lagt til i både opprettelses-
skjema og innstillinger, gated til gyldige kind/resultattype-kombinasjoner.
80/80 backend-tester, 45/45 vitest, scratch-verifisert i nettleser
(lys+mørk). Rullet ut.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fikser først en reell bug: en lenket eclectic-scoret turnering bidro med
rå slagsum i stedet for eclectic_total (turneringens faktiske
"drømmerunde"-resultat) i stableford/brutto/netto-OOM-er -- bugen fantes
siden Eclectic-formatet ble bygget (ADR-068), OOM ble aldri revidert.
Bygger deretter lag-OOM sin leaderboard (ADR-043 Beslutning C, skjema
fantes fra migrasjon 055): ny CRUD for team/medlemmer, og leaderboard-
grenen for kind='team' som summerer/velger-beste-N-av medlemmenes
allerede beregnede individuelle OOM-resultater -- samme
order_of_merit_aggregate-kall gjenbrukt på lagnivå med OOM-ens allerede
lagrede aggregeringsvalg. Frontend: fjernet "ikke bygget ennå"-
plassholderen, den eksisterende leaderboard-tabellen var allerede
generisk nok. Ny lag-administrasjonsseksjon lagt til.
Ingen migrasjon. Se ADR-074/CHANGELOG for full detalj og verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Eierens spillerobjekt i ny-runde-veiviseren hadde egne teeId/statLevel-felt,
kun synkronisert fra state.teeId/state.statLevel ÉN gang da banen først ble
valgt. For utslag var dette kosmetisk (submit() leser state.teeId direkte
for eieren), men for statistikknivå en reell datafeil: "Statistikk for deg
selv"-valget i steg 2 hadde ingen effekt på eierens faktiske innsending,
som alltid endte på strokes_only uansett hva som ble valgt.
Erstatter den punktvise engangs-synken med én kontinuerlig useEffect i
wizard-context.tsx. Bruker-rapportert regresjon (video vedlagt) -- se
ADR-073/CHANGELOG for full detalj og verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny delt app/hole_history.py bygger broen mellom frittstående runders og
org-turneringers to ulike bane-identitetssystemer (teeoff facility+course-id
vs. org-scopet course.external_course_ref, og tilsvarende for GolfAPI) --
custom/håndlagde baner ekskluderes bevisst, ordinære baner telles med fra
begge kilder og slås sammen. Turneringssiden håndterer at spilleren kan ha
spilt i flere organisasjoner via samme N+1-per-org-mønster /auth/me
allerede bruker (player_organizations_for_user, migrasjon 015).
To nye GET .../history-endepunkt (rounds.py og individual_tournaments.py)
returnerer samme kombinerte historikk uansett hvilken side som spør. Nytt
HoleHistoryPanel i hole-stat-inputs.tsx viser et ekspanderbart sammendrag
(antall ganger, snitt slag, GIR%, putter) + enkeltinstanser, lagt til i
ScoringWizard og det nye HoleStatsSheet (ADR-071).
Ingen migrasjon -- ren lesefunksjon oppå migrasjon 075. Se ADR-072/
CHANGELOG for full detalj og verifisering (73 backend-tester, inkl.
integrasjonstest som beviser selve bane-broen på tvers av organisasjoner).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
tournament_round_hole hadde siden opprettelse (migrasjon 040) kun
gross_strokes -- ingen putts/utslag/innspill/bunker/straffeslag-detalj
slik frittstående runder (round_hole) allerede har. Migrasjon 075 gir
turneringssiden samme feltsett + en ny optimistisk-lås-kolonne (endepunktet
var til nå rent siste-skriver-vinner). tournament_participant.stat_level
styrer om HoleGrid åpner det uendrede inline-tallfeltet eller det nye
HoleStatsSheet. NumberPicker/ChoiceRow/DirectionCross/Stepper trukket ut
til en delt hole-stat-inputs.tsx for gjenbruk mellom begge scoringsflytene.
Dette er Steg 1 av to mot spillerens per-hull-historikk på tvers av alle
runder/turneringer -- se ADR-071/CHANGELOG for full detalj og verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
AddPlayerControl i tournament-detail.tsx hadde samme begrensning som
AddParticipantControl hadde før dagens fiks: matches var kun avledet
ved ikke-tomt søk. Samme "available"-fallback-mønster lagt til her --
spillere på det andre laget forblir synlige (nedgradert), kun de på
DETTE laget ekskluderes. Ren frontend-endring, ingen migrasjon.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Migrasjon 074 legger til first_name/last_name/paid/comment på player
(resten av de 11 ønskede feltene fantes allerede, bare ikke eksponert i
denne UI-flyten). AddParticipantControl fikk et "available"-fallback
slik at eksisterende org-spillere vises direkte ved tomt søk (tidligere
kun mulig å opprette ny), pluss et progressivt avslørt skjema for de nye
feltene. Se ADR-070 og CHANGELOG #86 for full detalj og verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Utvider den eksisterende offline-skrivekøen (ADR-028, hittil kun
hull-scoreføring) til også å dekke rundefeedens kommentarer/bilder.
offline-queue.ts fikk et isMultipart-flagg (Blob-verdier lagres nativt
i IndexedDB, flushQueue bygger FormData ved synk). round-messages.tsx
fikk sin egen isolerte kø (matchId scoped til "{roundId}:messages",
ikke bare roundId) og et optimistisk "Venter på synk"-kort.
Migrasjon 073: round_message.client_message_id (nullbar uuid) + delvis
unik indeks -- POST /messages er ulikt hull-score-PATCH IKKE naturlig
idempotent, så en avbrutt synk kunne duplisert en kommentar uten dette.
Klienten sender en selvgenerert id ved både første forsøk og et evt.
køet gjenforsøk; serveren deduplikerer på den.
Se ARCHITECTURE_DECISIONS.md (ADR-069) og CHANGELOG.md (punkt 85) for
full begrunnelse og verifiseringslogg (inkl. et reload-mens-offline-
scenario som beviser fravær av duplikater).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Del C (ADR-068, migrasjon 072, siste del av den tredelte utvidelsen som
startet med Flaggturnering GPS/kart, se ADR-066/067): nytt format
eclectic_gross/eclectic_net/eclectic_stableford -- beste resultat per
hull på tvers av en turnerings egne runder, krever samme bane (avvist
tydelig ved rundeopprettelse ellers). Regnes ut ved lesing, ingen nye
tabeller. Bevisst avvik fra opprinnelig plan: integrert som en ny gren
i eksisterende individual-leaderboard-endepunkt fremfor et nytt eget
endepunkt -- se ADR-068 for begrunnelsen.
Tre ikke-relaterte, brukerrapporterte UI-rettelser tatt med i samme
runde: avstandsindikatoren brukte "grønn"/"Midt" i stedet for riktige
golf-uttrykk "green"/"senter", og "Oppdateres live"-badgen fjernet.
"Antall hull"-bryteren i Ny runde-veiviseren fikk samme grønne
aksent-valgt-stil som resten av samme skjerm (delt Segmented-primitiv).
Se ARCHITECTURE_DECISIONS.md (ADR-068) og CHANGELOG.md (punkt 84) for
full begrunnelse og verifiseringslogg.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Del A (ADR-066, migrasjon 069/070, allerede rullet ut mot teecup_db):
"Plant flagget" via GPS, med en interaktiv "Hullet du ut?"-bekreftelse
før posisjonen registreres, pluss full runde 2+-scoreføring for
spillere som fullfører 18 hull med slag igjen. Ny, isolert overflow-
tabell (rører ikke delt round_hole/tournament_round_hole). Bygget for
både frittstående runder og org-individuelle turneringer. UI-sheeten
er en Claude-skrevet V0-eksport (zip 11).
Del B (ADR-067, migrasjon 071, klar for utrulling): av/på-bryter
(standard AV) for en satellittkartoversikt over ALLE deltakeres
plantede flagg, lap 1 skilt fra lap 2+ med farge+tekstbadge. Frittstående
runder får full tilskuerstøtte (/watch/[id]); org-individuelle
turneringer er bevisst avgrenset til medlemmer/deltakere, siden ingen
offentlig spectator-side finnes for det turneringsformatet ennå.
Se ARCHITECTURE_DECISIONS.md (ADR-066/067) og CHANGELOG.md (punkt 82/83)
for full begrunnelse og verifiseringslogg.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Full gjennomgang av hele filen (4457 linjer) etter brukerspørsmål om
alt arbeid faktisk var dokumentert. Internasjonale baner, individuelle
turneringer sin rulle-ut, PWA-ikon, push-varsler, dashboard-forslaget
og Flaggturnering sin GPS-kobling var alle markert "ikke bygget" selv
om de er levert og live — hver rettet med et eksplisitt
RETTELSE-avsnitt, historikken beholdt uendret under. Ren
dokumentasjonsendring, ingen kode rørt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bygget om fra en enkel slag/netto-liste til samme Ut/Inn-blokk-oppsett
med fargede score-merker, fairway/GIR/innspill-glyffer og total-tiles
som selve appens Scorekort-side, etter to runder brukerfeedback
(først "all statistikk", deretter et skjermbilde av ønsket visuell
match). Fant og fikset underveis at round.played_at kun er en dato
(ikke klokkeslett) og en relatert type-bug i spilletid-utregningen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Player.completed lagt til, delt ParticipantCompletionActions-komponent
i både Score-fanens PlayerHoleCards og "Spillere og runde"-fanens
PlayerList. allHolesEnteredForEveryone og ScoringWizard-samlebåndet
tar nå hensyn til individuelt fullførte spillere.
Nettleserverifisert lys+mørk mot ekte teecup.golf (test-runde slettet
etterpå). tsc/vitest rent.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Backend (ADR-065): round_participant.completed_at (migrasjon 066),
flight-styrt PATCH-tilgang, scorekort-e-post til gjest/lenket bruker
ved individuell fullføring og ved rundefullføring, samt et nytt
on-demand send-scorecard-endepunkt som virker uansett fullføringsstatus.
Frontend-UI kommer i egen runde.
Nye baner Larvik (Seasidebanen) og Nesbyen (manuelt GPS-registrert,
124 punkter) importert til produksjon. Fant og fikset en reell
GolfAPI-datakvalitetsbug underveis: tomme strenger i stedet for
null/fraværende på course rating/slope for begge kjønn (migrasjon
067/068, defensiv parsing + import-endepunkter).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Brukerrapport om høyt batteriforbruk. To justeringer i
hole-target-distance.tsx: maximumAge 1000ms -> 4000ms (umerkelig ved
gangfart, sjeldnere GPS-fix), og watchPosition pauses helt når
fanen/appen ikke er synlig (document.visibilitychange), gjenopptas
automatisk. enableHighAccuracy uendret -- lav nøyaktighet ville gjort
front/midt/bak-tallene meningsløse.
Verifisert i nettleser: clearWatch bekreftet kalt ved backgrounding,
watchPosition bekreftet kalt på nytt ved retur, ingen konsollfeil.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Brukeren viste et skjermbilde fra ekte produksjon: indikatoren satt i
scoreførings-veiviseren (feil øyeblikk -- åpnes ETTER hullet er
spilt), skulle vært i hoved-hull-visningen (PlayerHoleCards, rett
under hull-navigatoren) med mer bredde enn kompaktvarianten.
HoleTargetDistance sin egen rad-wrapper fjernet -- kalleren styrer nå
plassering/bredde. Verifisert på nytt i scratch (lys+mørk, ingen
konsollfeil) og rullet ut.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Søk-og-koble-UI-en for GolfAPI (ADR-064) var kun koblet inn i "endre
bane"-skjemaet, ikke i /my-rounds/new (components/ny-runde/) -- den
faktiske primære inngangen. Lagt til der (international-search-
delstilstand + InternationalSearch-komponent).
Fant og fikset en reell 500-feil under verifisering: GET
/personal-courses/{personal_course_id} var registrert før den nye,
mer spesifikke GET /personal-courses/international-search -- FastAPI
matcher ruter i registreringsrekkefølge, så den generiske ruten fanget
"international-search" som en ugyldig UUID. Flyttet de nye
endepunktene foran.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny tredje banekilde (ADR-064) for baner utenfor TeeOffs dekning: delt
GolfAPI-cache (migrasjon 065), import til både org-turneringer og
frittstående runder, target-points-endepunkt, og en rangefinder-
visning i scorekortet (V0-generert target-distance.tsx + hånd-koblet
GPS/Haversine-wrapper). Fant og fikset at TEECUP_GOLFAPI_TOKEN aldri
ble videreført til teecup_api-containeren i docker-compose.yml.
I samme runde: y-akse-benevnelser og verdi i begge ender på
statistikk-trendgrafene (rounds-stats-summary.tsx).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Oppdaterer status fra "sendt som V0-prompt, ikke bygget" til
selv-implementert (bruker gikk tom for V0-credits) og
scratch-verifisert i nettleser.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Migrasjon 064 (round_message_tag/round_message_comment_tag), nytt
GET /rounds/{id}/taggable-people-endepunkt, validering (kun faktiske
relasjoner er taggbare, ugyldige tags forkastes stille), varsling ved
gyldig tag. Se ADR-063/CHANGELOG punkt 72. 8 nye pytest-tester, 31/31
grønt. Frontend (autocomplete + rendering) sendes som eget V0-prompt --
ikke deployet ennå, migrasjon venter til frontend-delen er klar.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fire rettet direkte (reelle logikkfeil/tekstvalg): round-card.tsx sin
"Hull"-celle viste alltid planlagt antall, aldri faktisk spilt for
tidlig avsluttede runder; putt-avstand-etiketter gjort konsekvente
("X-Ym" i stedet for blandet "<Xm ... 8m+"); "Se feed" presisert til
"Se venneaktivitet"; @-tagging av medspillere vurdert og bevisst utsatt.
Fire sendt via V0 (reelt interaksjonsdesign), diffet mot live-treet før
integrering: ny-runde steg 2 sin rekkefølge (Antall hull/Avanserte HCP
flyttet før formatrutenettet), "detaljer"-steget delt i seksjoner med
et nytt scroll-hint, Anywayslag unifisert til samme +/--mønster som
Chip/Bunker/Straffeslag, netto par-markør + egen Putter-aksent.
Se ADR-062/CHANGELOG punkt 71 for full detalj. tsc rent, full
scratch-stack browserverifisert (lys+mørk, mobil viewport) før
utrulling.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fortsetter robusthetslinjen: frontend-tester var eksplisitt utenfor
omfang i ADR-058/060. 30 nye tester: lib/geo.ts (GPS-avstand/retning,
fasit-forankret), lib/offline-queue.ts (regresjonsvern for
resourceKey-fiksen fra forrige runde), lib/ny-runde/formats.ts
(fullstendighetssjekk på tvers av format-listene). Egen, lettvekts
Forgejo Actions-workflow (ingen Docker-utenfor-Docker nødvendig).
To reelle funn underveis: prosjektet bruker pnpm ikke npm (et første
forsøk med npm feilet, ingen skade); pnpm-workspace.yaml var arvet-
ignorert fra V0-malen men har nå reelt CI-relevant innhold
(allowBuilds: sharp), rettet før det kunne feile CI stille. Se
ADR-061/CHANGELOG punkt 70.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fortsetter robusthetslinjen fra ADR-057: hole_score/match_hole_result
(scoring.py) hadde ingen samtidighetsvern, ren siste-skriving-vinner --
den siste dokumenterte, kjente svakheten fra den opprinnelige
"harde kjerner"-vurderingen. Samme version-kolonne-mønster, tilpasset
UPSERT (INSERT ... ON CONFLICT DO UPDATE ... WHERE) i stedet for ren
UPDATE. Offline-kø-kjedingen generalisert til å nøkle på ressurs
(resourceKey), ikke bare URL -- nødvendig siden disse to endepunktene
deler samme URL for alle hull i en match. Se ADR-060/CHANGELOG punkt 69.
23/23 backend-tester grønne, tsc rent. Migrasjon 063 kjørt mot ekte
teecup_db, teecup_api/teecup_frontend rebygget, ingen konsollfeil.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Empirisk push viste at repoet ikke hadde noen aktiv runner (jobb ble
stående som "Waiting"). Satt opp act_runner lokalt på serveren
(Docker-utenfor-Docker, docker.sock automount) siden
run_backend_tests.sh er avhengig av teeoff_db/teeoff_default som kun
finnes her. Kjører nå som egen tjeneste i docker-compose.yml. Se
ADR-059 og CHANGELOG punkt 68.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Svarer på det største enkeltfunnet i investor-statusrapporten (nesten
ingen automatisert testdekning utenfor HCP-motoren). 17 nye
integrasjonstester mot en automatisk opprettet/migrert/nedrevet
scratch-database (scripts/run_backend_tests.sh), som kaller de faktiske
router-/auth-funksjonene direkte -- ikke en SQL-gjenimplementering. Se
ADR-058 og CHANGELOG punkt 67 for full detalj.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1. WHS Rule 3.1b — ferdig, testet (117/117), rullet ut... nei, venter fortsatt (se under).
2. round.tee_name_snapshot-synk — ferdig, scratch-verifisert.
3. Optimistisk versjonssjekk for samtidig hull-redigering — ferdig bygget, og jeg fant og rettet en reell UX-bug underveis (en fullskjerm-feilvisning i stedet for en liten banner) som ellers ville gjort funksjonen verre enn ingenting.
Alt er dokumentert i ADR-056/057 og CHANGELOG punkt 65–66.
Deploy — rekkefølgen har betydning (migrasjonen må kjøre først, siden ny kode leser version-kolonnen):
# 1. Migrasjon mot ekte teecup_db
docker exec teeoff_db psql -U teeoff_admin -d teecup_db -f /opt/teecup/062_round_hole_version.sql
# 2. Backend
docker compose build teecup_api
docker compose up -d teecup_api
# 3. Frontend
docker compose build teecup_frontend
docker compose up -d teecup_frontend
Og fortsatt uavklart fra tidligere: datakorreksjonen for din spesifikke runde
UPDATE round SET tee_name_snapshot = '55'
WHERE id = '520f9681-6e7f-49bf-8504-9ab223874285';
Kontoen til Fredrik Mathisen (fødselsdato under 13 år, ingen tilknyttet aktivitet) er slettet fra ekte teecup_db, og e-posten med forklaring ble sendt til fredrik.f.mathisen@gmail.com før slettingen ble bekreftet fullført.
PWA-installasjonstekst — skiller nå Safari/Chrome på iOS, ikke lenger feilaktig Safari-only.
Beskrivelsestekst — "golfklubber" fjernet, nytt punkt om at turneringsadmin/-presentasjon fungerer godt på PC.
Dette krever både teecup_api og teecup_frontend (ingen migrasjon).
Velger du kart, vises utslagspunktet som en fast oransje referansemarkør, og kartet zoomer/panorerer automatisk slik at både din posisjon og utslagspunktet er synlige med det samme. Du trykker der ballen ligger — markøren blir grønn for å skille den fra referansen.
Punkt 39-45: dashbord+BottomNav-reskin, ny-runde-veiviser + offisiell-
banesøk-produksjonsbug, /logg-inn som ekte innloggingsside, rundedeling-
kategoriregel-fiks (ADR-036 E), og slag-for-slag-avstandsmåling
inngangspunkt 1. Se de fem foregående commitene for koden.
Kommandoer jeg vil kjøre mot ekte teecup_db/teecup_api/teecup_frontend:
psql migrasjon 058_round_messages.sql mot ekte teecup_db (ny round_message-tabell, ingen endring i eksisterende tabeller).
docker compose up -d --build teecup_api teecup_frontend (begge containere, siden dette er backend+frontend sammen).
Etterpå: bekreft round_message-tabellen finnes, /health//my-rounds/new//my-feed → 200 over https, teeoff.no upåvirket.
Fullført:
TeeCup-beskrivelse for logo — levert tidligere.
Migrasjon 056 (scramble_solo) — kjørt og live.
Matchspill-varianten (scramble_solo_match, migrasjon 057) — bygget, verifisert, live.
Kritisk bug funnet og rettet: lagspillere kunne ikke registrere score i det hele tatt for scramble_solo-formatene (evig spinner, ingen feilmelding) — var allerede live og ødelagt for ekte lagspillere. Rettet for begge varianter, rullet ut.
"Bruk som mal for egen bane" — vises nå kun i "Opprett ny bane"-flyten (ny lenke "Basér på en eksisterende bane i stedet"), ikke i det vanlige søket.
Alt er rullet ut live på teecup.golf, verifisert i nettleser mot isolerte scratch-miljøer (ryddet opp etterpå), og dokumentert i CHANGELOG.md (punkt 22–24) og FEATURE_BACKLOG.md.
Modalen ("Administrer runde", tilgjengelig fra alle tre rundefanene) hadde en
egen, uavhengig "Fullfør runde"-vei som aldri sjekket setup_complete og
lukket dialogen umiddelbart uten å vente på fetch-svaret -- så en ufullstendig
formatoppsett (f.eks. Københavner med for få spillere) så ut til å fullføres,
men gjorde det aldri, uten noen feilmelding. Backend-valideringen var korrekt
fra før; kun frontend fulgte aldri opp svaret.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ny funksjon (ADR-043, migrasjon 055): organisatorer kan opprette en
Order of Merit, lenke individuelle turneringer til den, og få en
sesong-sammenlagt rangering regnet ut ved lesing -- fem resultattyper
(poeng etter plassering, Stableford-, brutto- og nettoscore-sum,
pengeliste), sum/snitt-aggregering, med valgfri behold-N-beste,
minimum antall resultater og aldersgrense. Motor i handicap_engine.py
(9 nye enhetstester), ny app/routers/order_of_merit.py, og to nye
håndkodede frontend-sider under /organizations/[id]/order-of-merit.
Eclectic-aggregering og lag-OOM sin faktiske resultatberegning er
bevisst ikke bygget denne runden (skjema/CRUD for lag finnes, men
leaderboardet avviser kind='team' med en tydelig feilmelding).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Klasser vises nå etter bane-/rundeoppsett (var meningsløst å velge
standardutslag før banen fantes). TeeOff-import koblet inn i
individuelle turneringer. Ny mal-basert baneoppretting i
turneringsmodulen (fra bunnen av / TeeOff / offentlig custom-bane),
med personal_course gjenbrukt som et delt, plattform-omfattende
bane-bibliotek på tvers av org- og single-runde-modulen (ADR-042,
migrasjon 054).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fullfører dokumentasjonen for den nye slagspill-resultattavlen (POS/
PLAYER/TODAY/THRU/TOTAL/R1-Rn), rullet ut 2026-08-04: V0-integrering
(zip 29), Golfscore-språk-fiksen for rundekolonnenes eksakt-par-tilfelle,
og den reelle til-par-rangeringsbugen funnet og rettet under
scratch-verifisering.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fullfører dokumentasjonen for klasse-funksjonen (migrasjon 053, rullet
ut 2026-08-04): ny ADR-041 med de fire load-bærende beslutningene
(fritt navngitte klasser, delt tabell mellom turneringstyper,
standardutslag som frontend-bekvemmelighet, egen resultatliste kun i
individuelle turneringer), pluss fulle bygge-/verifiseringsoppføringer
i CHANGELOG.md og FEATURE_BACKLOG.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Backend for dette (hero_image_key, sponsor-CRUD, visibility/description/
registrering) har vært klart og live siden ADR-018 (2026-07-18), men ingen
organisator-skjerm satte noensinne disse feltene - alt var 100% API-only.
Ny tournament-presentation.tsx dekker begge turneringstyper (delt
tournament-tabell, ikke format_type-spesifikt): full side for
lagturneringer (ny rute), embeddet som fjerde fane for individuelle
turneringer. Lagt til i alle fire eksisterende nav-rader.
To små backend-tillegg uten migrasjon: hero_image_url/logo_url som
beregnede felt (samme mønster som avatar_url), og en DELETE-endepunkt for
hero-bilde (fantes fra før kun opplasting).
Fant og rettet en ekte mobil-layoutbug under scratch-verifisering:
sponsor-raden klemte navnet til nesten ingenting på 390px viewport -
samme klasse trunkeringsdefekt som leaderboard-omskrivingen tidligere
denne uken, men på et annet sted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Begge filer påstod at frontend for de åtte nye turneringsformatene
(Chapman/Nassau/Kobenhavner/BBB/Flag/Shamble/Money Ball/High-low-high)
fortsatt manglet. Bekreftet direkte mot koden at dette er feil - frontend
for formatvalg og resultatvisninger finnes i alle tre hjem (frittstående
runder, org-lag, org-individuell), bygget i sesjonene mellom 2026-07-30
og 2026-08-02, bare aldri dokumentert som ferdig. Lagt til rettelser
(ikke slettet historikk) i begge filer, med konkrete filhenvisninger.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Brukeren testet en Slagspill-runde etter forrige leaderboard-utrulling og
så ingen visuell endring - forrige runde hadde gjenbrukt gamle håndkodede
komponenter for individuell/to-sidet visning i stedet for å implementere
V0s tegning fullt ut. Skrev om round-leaderboard.tsx fra bunnen mot V0s
faktiske komponenter, portet manuelt mot ekte API-data. Fant og rettet fem
reelle bugs underveis (courseHcp-matte, manglende hcpIndex, ødelagt
TeamFlightBoard-pille, CSS-trunkering i SideName, feil kildetekst for
matchoverskrift).
Fikset også: "Spillere og runde"-snarveien som ikke virket fra Score-fanen
(useEffect manglet på searchParams-endring), play-format-bryteren i
Rediger runde-panelet utvidet fra 3 til 16 formater, 8 nye statistikkrader
i scorekortet (Fairway/Putt/GIR/Innspill/Chip/Bunker/Straffeslag/Anyway).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>