diff --git a/CHANGELOG.md b/CHANGELOG.md index a7d3602..11c8045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14381,3 +14381,25 @@ Neste steg: `docker compose build teecup_api teecup_frontend && up -d`, begge containere friske, rene logger. `https://teecup.golf/health` 200 etter utrulling. + +159. **Gap-analyse skrevet ned: scoring-paritet frittstående runde vs. + org-turnering, 2026-08-22 -- ren dokumentasjon, ingen kode.** Bruker + ba om at den tidligere "avtalte 8-punkts parity-rekkefølgen" (nevnt + kun muntlig, referert i ADR-099/100) ble gjort grundig på nytt og + denne gangen faktisk skrevet ned, siden listen aldri ble committet + til noen fil -- et hull i egen dokumentasjonsdisiplin (CLAUDE.md- + regelen om å holde disse filene oppdatert er noe JEG må huske å + gjøre når arbeid fullføres, ikke en automatisk mekanisme). Grundig + kodesøk (Explore-agent) sammenlignet `round-detail.tsx`/`rounds.py` + mot `individual-tournament-detail.tsx`/`individual_tournaments.py` + på tvers av åtte konkrete kandidat-funksjoner (offline-kø, live + push, stats-dashboard, full flerspiller-scorekort-grid, "plukket + opp"-knapp, GPS-skuddmåling, kommentartråd, tilskuer-metrikkveksling) + pluss én i motsatt retning (print/eksport). Bekreftet at ADR-099/ + 100/101 samt rangefinder (ADR-064), Flagg-GPS (ADR-066) og kombinert + hull-historikk (ADR-071) allerede er reell paritet og ikke skal + fanges opp på nytt. Full liste, med filnavn/antatt størrelse per + punkt, skrevet inn i FEATURE_BACKLOG.md ("Scoring-paritet: + frittstående runde vs. org-turnering") -- erstatter den tidligere + muntlige listen. Ingen prioritering/bygging startet -- venter på at + bruker velger rekkefølge blant punktene. diff --git a/FEATURE_BACKLOG.md b/FEATURE_BACKLOG.md index 4b22186..1912b5e 100644 --- a/FEATURE_BACKLOG.md +++ b/FEATURE_BACKLOG.md @@ -7,8 +7,9 @@ > Status-koder: ✅ ferdig · 🔨 pågår · 📋 planlagt/fanget · ❓ trenger beslutning > · 🔀 endret fra opprinnelig råd · 💤 utsatt (bevisst) > -> Sist oppdatert: 2026-08-22 (inkrementell deltaker-id/startnummer for -> turneringer fanget opp, ikke designet -- se nederste seksjon) +> Sist oppdatert: 2026-08-22 (full gap-analyse: scoring-paritet +> frittstående runde vs. org-turnering, erstatter den tidligere kun- +> muntlige "8-punktslisten" -- se nederste seksjon) --- @@ -4923,3 +4924,98 @@ Uavklart, trenger en egen designrunde FØR bygging: regler, HCP-bryterens eksakte oppførsel, hvor id-en skal vises) FØR datamodell/migrasjon designes -- ingen beslutninger tatt ennå, kun fanget opp her for å ikke gå tapt. + +## Scoring-paritet: frittstående runde vs. org-turnering (2026-08-22) — 📋 fanget, delvis planlagt + +Bruker: "Jeg ønsker at opplevelsen skal være tilnærmet identisk, enten +du fører score i en individuell runde, eller om du fører for deg eller +flighten din i en org-turnering." Dette punktet ble opprinnelig avtalt +muntlig som en "8-punkts parity-rekkefølge" (referert i ADR-099/ADR-100) +uten at listen selv noensinne ble skrevet ned ordrett i noen fil -- et +hull i egen dokumentasjonsdisiplin. Denne seksjonen ERSTATTER den +muntlige listen med en fullstendig, gjenfunnet og verifisert +gap-analyse (grundig kodesøk 2026-08-22, ikke bare hukommelse). + +**Allerede bygget (ikke fang opp på nytt):** flight/gruppe-scoping i +ScoreTab (ADR-099), kjedet flerspiller hull-for-hull-scoring (ADR-100), +hull-for-hull-utvidelse i den autentiserte leaderboarden for slagspill/ +netto/Stableford (ADR-101), rangefinder/avstand-til-flagg (ADR-064, +begge flyter), GPS-"plant flagg" for Flagg-formatet (ADR-066, begge +flyter), kombinert frittstående+turnering hull-historikk (ADR-071). + +**Gjenstående gap, rangert etter antatt størrelse/verdi (frittstående +runde HAR, org-turnering MANGLER, om ikke annet er sagt):** + +1. **Offline-kø for score-føring.** `round-detail.tsx` (og + `session-scorecard.tsx` for lag-kamper) bruker `frontend/lib/ + offline-queue.ts` (IndexedDB, ADR-028) ved tapt nett. `ScoreTab`/ + `individual-tournament-detail.tsx` har INGEN referanse til denne + koen i det hele tatt -- mister score ved dårlig dekning på banen. + Antatt **liten** jobb: biblioteket er allerede generisk (bevist ved + at lag-kamper bruker det), ingen backend-endring, kun kabling rundt + PATCH-kallet i ScoreTab. +2. **Sanntidsoppdatering (live push) i den autentiserte scorings-/ + leaderboard-visningen.** `round-detail.tsx` åpner en websocket + (`/ws/rounds/{roundId}/live`) og oppdaterer automatisk når andre i + flighten fører score. `individual-tournament-detail.tsx` har ingen + websocket-abonnement -- kun egen-utløst refresh. Backenden + kringkaster allerede (`broadcast_live_update` i + `individual_tournaments.py`), men kun til den OFFENTLIGE + tilskuersiden, ikke den autentiserte. Antatt **liten/middels**. +3. **Personlig stats-dashboard ekskluderer turneringsrunder helt.** + `/rounds/stats/summary`-spørringen (`rounds.py`) leser KUN + `round_participant`/`round_hole` -- `tournament_round_participant`/ + `tournament_round_hole` er aldri med. En spillers GIR%/putting/ + fairway-trender fra org-turneringer vises aldri i eget stats-bilde, + og org-turneringer har ingen egen tilsvarende endepunkt/side i det + hele tatt. Antatt **middels/stor** -- ekte datamodell-brobygging + (avstemme `stat_level`-forskjeller), ikke bare gjenbruk av UI. +4. **"Vis hele scorekortet" i ScoreTab viser IKKE alle spillere + samtidig.** Frittstående runde sin `ScorecardGrid` er en ekte + alle-spillere×alle-hull-matrise. Org-turneringens likt navngitte + toggle gjenbruker bevisst kun det eksisterende ett-spiller-`HoleGrid` + (kommentar i koden bekrefter dette var en villet avgrensning den + gang, ikke en forglemmelse) -- bytter kun HVEM som vises, viser aldri + alle på én gang. Antatt **middels** -- kjedet scoring (ADR-100) henter + allerede alle flightmedlemmers hull parallelt, så data finnes. +5. **"Plukket opp"-hurtigknapp finnes ikke for turneringer, selv der + Stableford er scoringsmetoden.** `round_hole.picked_up` (migrasjon + 038) + knapp finnes i frittstående runder. `tournament_round_hole` + har ingen tilsvarende kolonne, `TournamentScoringWizard` ingen + tilsvarende knapp. Antatt **middels** -- ny migrasjon + backend-speil + av eksisterende capping-logikk (`max_hole_score_for_handicap`). +6. **Slag-for-slag GPS-avstandsmåling (skuddlengde + kølle) kun i + frittstående runder.** `round_shot`-tabellen/`ShotMeasurementEntry` + (ADR-048) har ingen tilsvarende i `individual_tournaments.py`/ + `individual-tournament-detail.tsx`. IKKE forveksle med rangefinder + eller Flagg-GPS (begge allerede bygget begge steder, se over). Antatt + **middels/stor** -- `round_shot`s eierskap er i dag kablet til + frittstående-runde-XOR-en (ADR-048 Beslutning C), ekte backend-arbeid. +7. **Kommentarfelt/tråd på runden finnes ikke for turneringsrunder.** + `` (ADR-044, med bilde-vedlegg + offline-kø + push) er + kun koblet til `round_id`. Ingen tilsvarende i den autentiserte + turneringsvisningen. Antatt **middels** -- UI-komponenten er stort + sett gjenbrukbar, men trenger enten en ny `tournament_round_message`- + tabell eller en generalisering av eierskapsmodellen. +8. **Tilskuer-metrikkveksling (brutto/netto/Stableford/poeng) finnes kun + for frittstående runder.** `round-leaderboard.tsx` sin `MetricToggle` + har ingen motpart i `stroke-play-leaderboard.tsx` (som eksplisitt har + en "eksakt kontrakt -- ikke endre" på `LeaderboardRow`, ADR-101). + Antatt **middels** -- må legges til additivt for å ikke bryte den + kontrakten. + +**Gap i motsatt retning (org-turnering HAR, frittstående MANGLER) -- +lavere prioritet per brukerens uttalte fokus, men notert for +fullstendighet:** + +9. **Print/eksport.** Org-turneringer har en full utskriftspakke + (kart-lapper/resultatliste/startliste/scorekort, ADR-097). + Frittstående runder har ingen print/eksport-affordance i det hele + tatt. Antatt **liten/middels** -- kan trolig gjenbruke + `print-scorecard.tsx`s tilnærming for én enkelt frittstående runde. + +**Neste steg:** bruker prioriterer rekkefølge blant punktene 1-8 (og +avgjør om punkt 9 skal tas med i samme runde eller utsettes). Ingen +bygging startet på noen av disse ennå -- denne seksjonen er kun +gap-fangst, ikke et design. Når et punkt velges, skriv en egen ADR før +bygging (samme mønster som ADR-099/100/101).