diff --git a/ARCHITECTURE_DECISIONS.md b/ARCHITECTURE_DECISIONS.md index 6e3b957..b366bc8 100644 --- a/ARCHITECTURE_DECISIONS.md +++ b/ARCHITECTURE_DECISIONS.md @@ -9725,6 +9725,89 @@ faktisk radrekkefølge og `aria-sort`-tilstand for alle tre sykluser. --- +## ADR-096: Shotgun-start bygget -- reverserer/utvider migrasjon 084s bevisste "IKKE shotgun" (2026-08-21) + +Migrasjon 084 (2026-08-18) valgte BEVISST bort shotgun-start for +utslagsgrupper, etter en tre-spørsmål-avklaring med bruker den gang: +"TRADISJONELT utslag (samme starthull for alle, allerede rundens eget +start_hole -- ingen endring der), staggerte klokkeslett PER GRUPPE med +fast intervall -- IKKE shotgun (ulike hull samtidig)." Samme +begrensning fantes uavhengig på Cup-/lagformatets side (`session`/ +`match`) fra migrasjon 006 av, aldri eksplisitt vurdert der. + +Bruker, i forbindelse med planlegging av utskriftsklare startlister: +"Det må komme frem om det er Shotgun eller løpende start, med hvilket +hull man starter på. Sorteringen av startlisten gjøres etter +utslagsform (løpende = tidspunkt, shotgun = starthull)." Presentert to +alternativer (ekte støtte vs. kun utskrift-deko) -- bruker valgte ekte +støtte: "Bygg ekte shotgun-støtte nå." + +**Endres eksplisitt her, ikke slettet fra historikken**: migrasjon 084 +sin begrunnelse for å utelate shotgun den gang (unødvendig kompleksitet +for et behov som ikke forelå ennå) er fortsatt gyldig SOM BESKRIVELSE AV +DA -- dette er en bevisst UTVIDELSE når et nytt, konkret behov (utskrift) +gjorde det nødvendig, ikke en korrigering av en feil beslutning. + +**Migrasjon 088** (samme text+CHECK-mønster som migrasjon 087, ikke en +ny `CREATE TYPE ... AS ENUM`): +- `tournament_round.start_mode` / `session.start_mode` -- 'consecutive' + (standard, UENDRET oppførsel) / 'shotgun'. +- `tournament_round_group.start_hole` / `match.start_hole` -- valgfritt, + KUN meningsfullt når forelderen er 'shotgun'. `NULL` for en + 'consecutive'-runde/økt, som fortsatt bruker den delte + `start_hole`/`tee_interval_minutes`-modellen (uendret siden migrasjon + 040/006). + +**Klokkeslett-beregning** (`_compute_group_tee_time` i +individual_tournaments.py, `_compute_tee_time` i matches.py -- begge +utvidet identisk): shotgun = ALLE grupper/matcher går ut på ETT felles +tidspunkt (`scheduled_at`, uansett `sequence`) -- intervallet er +meningsløst i denne modusen (ulikt HULL, ikke ulikt klokkeslett). En +eksplisitt per-gruppe/per-match `tee_time_override` vinner fortsatt over +begge modiene (uendret unntaksmekanisme). + +**Visningsrekkefølge**: løpende sorteres etter klokkeslett (allerede = +sequence-rekkefølgen for 'consecutive', ingen endring), shotgun sorteres +etter STARTHULL i stedet (ikke tildelt = sist, aldri først). Håndhevet +BÅDE i backend (`_fetch_round_groups`/`fetch_matches`) OG i frontend -- +fant og rettet en reell bug under scratch-verifisering: begge +frontend-skjermene (`round-groups-panel.tsx`, `session-blind-draw.tsx`) +hadde en HARDKODET `.sort((a, b) => a.sequence - b.sequence)` som +overstyrte backendens shotgun-sortering fullstendig, uansett hva +serveren faktisk sendte. Rettet til å sortere etter starthull når +shotgun, sequence ellers -- gjelder nå også LOKALE, ulagrede endringer +(et nettopp justert starthull flytter gruppen i visningen umiddelbart, +ikke først ved neste lagring/reload). + +**Frontend:** +- `round-groups-panel.tsx` (individuell, hånd-kodet fra før -- samme + mønster videreført, ikke sendt via V0): Løpende/Shotgun-veksler, + intervall-feltet skjules i shotgun, hver gruppe får et eget + starthull-tallfelt i stedet. +- `tournament-program.tsx` sin `EditSessionForm` (Cup, V0-bygget fra + før): samme veksler-mønster, øktens eget "Starthull"-felt skjules i + shotgun (blir per-match i stedet), sesjonslisten viser en tydelig + "Shotgun"/"Løpende start"-merkelapp. +- `session-blind-draw.tsx` (Cup, blind draw-trekningen): "Legg til + match" spør om starthull når økten er shotgun, vist på matchkortet + (før OG etter avsløring) i stedet for utslagstid. + +**Testet, ikke bare gjennomgått:** 5 nye backend-tester +(`test_round_groups.py` for individuell, `test_shotgun_start_cup.py` for +Cup) -- felles tidspunkt uansett sequence, riktig sortering etter +starthull, override vinner fortsatt, regresjonsvern for at +'consecutive' er helt uendret. Alle 163 backend-tester grønne mot +scratch-database. Frontend verifisert i egen `tmp-preview`-rute som +monterer den EKTE `RoundGroupsPanel` med en stateful `window.fetch`-mock +(speiler faktisk server-oppførsel, ikke bare statiske svar) -- bekreftet +at veksling til shotgun skjuler intervall-feltet og viser starthull-felt +per gruppe, at et lokalt satt starthull REORDNER visningen umiddelbart +(fanget nettopp sorterings-bug-en over), og at lagring+reload beholder +riktig rekkefølge. `tsc --noEmit` rent på hele frontend-prosjektet. +Scratch-ruten slettet etterpå, bekreftet med `git status --short`. + +--- + ## Utviklingsplan (rekkefølge) 1. ✅ Land tenant-modell → **Organisasjon** (ADR-001/002/003) diff --git a/CHANGELOG.md b/CHANGELOG.md index 625679e..9e700a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13924,3 +13924,50 @@ Neste steg: CHANGELOG), deretter `docker compose build teecup_api teecup_frontend && up -d`, begge containere friske, rene logger. Ingen migrasjon. + +149. **Shotgun-start bygget, 2026-08-21 (ADR-096, migrasjon 088).** + Reverserer/utvider migrasjon 084 sitt bevisste "IKKE shotgun"-valg + fra 2026-08-18 -- oppdaget som et behov mens utskriftsklare + startlister ble planlagt: "Det må komme frem om det er Shotgun + eller løpende start, med hvilket hull man starter på. Sorteringen + av startlisten gjøres etter utslagsform." Bruker valgte ekte + støtte fremfor kun utskrift-deko. + + Ny `start_mode` ('consecutive'/'shotgun') på BÅDE `tournament_round` + (individuell) og `session` (Cup) -- samme arkitektoniske hull fantes + uavhengig begge steder. Ny valgfri `start_hole` på + `tournament_round_group`/`match`, kun meningsfull i shotgun. + Shotgun: alle grupper/matcher går ut på ETT felles tidspunkt + (intervallet meningsløst i denne modusen), sortert etter STARTHULL i + stedet for klokkeslett. 'consecutive' er uendret oppførsel, ingen + regresjon. + + **Reell bug funnet OG rettet under scratch-verifisering:** begge + berørte frontend-skjermene (`round-groups-panel.tsx`, + `session-blind-draw.tsx`) hadde en hardkodet + `.sort((a,b) => a.sequence - b.sequence)` som stille overstyrte + backendens shotgun-sortering, uansett hva serveren faktisk sendte -- + ville vist grupper/matcher i FEIL rekkefølge for enhver shotgun-runde + hvis den ikke var fanget opp. Rettet til å sortere etter starthull + når shotgun (inkludert LOKALE, ulagrede endringer -- en nettopp + justert starthull flytter gruppen i visningen umiddelbart). + + Frontend: `round-groups-panel.tsx` (individuell, hånd-kodet fra + før) fikk en Løpende/Shotgun-veksler + per-gruppe starthull-felt. + `tournament-program.tsx` sin `EditSessionForm` (Cup) fikk samme + veksler + en tydelig modus-merkelapp i øktlisten. + `session-blind-draw.tsx` fikk et starthull-felt ved "Legg til + match" i shotgun-modus, vist på matchkortet både før og etter + avsløring. + + **Testet, ikke bare gjennomgått:** 5 nye backend-tester (felles + tidspunkt uansett sequence, riktig starthull-sortering, override + vinner fortsatt, regresjonsvern for uendret 'consecutive'- + oppførsel) -- alle 163 backend-tester grønne mot scratch-database. + Frontend verifisert i en `tmp-preview`-rute som monterer den EKTE + `RoundGroupsPanel` med en STATEFUL `window.fetch`-mock (speiler + faktisk server-oppførsel) -- nettopp DENNE testingen fanget opp + sorterings-bug-en over. `tsc --noEmit` rent. Scratch-ruten slettet + etterpå, bekreftet med `git status --short`. + + **Ikke rullet ut ennå.** diff --git a/FEATURE_BACKLOG.md b/FEATURE_BACKLOG.md index bc0c972..66bfc05 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-20 (funksjonelle hull funnet under design- -> dokumentasjon-runden notert, se seksjonen nederst) +> Sist oppdatert: 2026-08-21 (funksjonelle hull funnet under utskrift- +> planlegging notert -- hullengde, turneringslogo, bracket-format +> utsatt, shotgun-start under bygging -- se de to nederste seksjonene) --- @@ -4776,3 +4777,84 @@ runder (sannsynligvis flere -- de spenner fra rene UX-forbedringer til det som kan være en reell autorisasjons-/synlighets-beslutning verdt en ADR, se rolletilpasning-punktet) -- ikke noe som bør fikses alle på én gang. + +## Funksjonelle hull funnet under "utskrift av turneringsdokumenter"-planlegging (2026-08-21) — 📋 delvis notert, delvis under bygging + +**Kontekst:** bruker ba om V0-prompter for utskriftsklare startlister/ +resultatlister/cart-tags/scorekort (PDF, A4/Letter + A3/A2 for Cup- +startlister). Undersøkt FØR promptene ble skrevet, for å unngå å designe +utskrift for felt/formater som ikke faktisk finnes ennå. Tre reelle hull +funnet; bruker har eksplisitt tatt stilling til alle tre (se hver): + +- **Hullengde finnes ikke i datamodellen.** Verken `hole` (org-scopet, + brukt av turneringer), `personal_course_hole` eller + `golfapi_course_hole` har noen lengde-/avstandskolonne -- kun `par` + og `stroke_index`. Verken `golfapi_client.py` eller `teeoff_client.py` + henter/lagrer noe lengdefelt fra kildene i dag heller (uklart om + kildene faktisk TILBYR det uten videre, eller om det må legges inn + manuelt). Trengs for scorekort-utskrift (bruker: "Hullets lengde må + med"). **💤 Utsatt** -- mockes med plausible tall i selve V0- + utskriftsprompten (`v0-prompt-print-scorecard.md`), ekte + datamodell-utvidelse (ny kolonne + evt. import-kilde-sjekk) er en + egen, senere oppgave før feltet kan vise ekte tall. +- **Ingen dedikert turneringslogo finnes.** `tournament.hero_image_key` + (migrasjon 009) er et BREDT banner-bilde til presentasjonsfanen, ikke + egnet som en kompakt logo i en utskrift-topptekst. Sponsor-logoer + finnes (samme migrasjon) men er et annet konsept (sponsor, ikke + arrangør). Trengs på alle fire utskriftstyper (bruker: "Turneringslogo + (om den ikke eksisterer bruker vi TeeCup sin)"). **💤 Utsatt** -- + mockes i V0-promptene, ekte `tournament.logo_key`-felt (+ fallback til + TeeCups egen logo) er en egen, senere oppgave. +- **128-spiller individuell utslagsturnering ("Sommercup"-stil, + single-elimination bracket) finnes ikke som turneringsform i det hele + tatt.** Appen har i dag KUN to-lag Ryder Cup-formatet (arkitektur- + invariant, CLAUDE.md: "v1 = nøyaktig to lag ... Match-modellen holdes + generell (to sider) så knockout/flere lag kan komme senere" -- aldri + bygget, kun forberedt for). Ingen runde-for-runde-parring/ + vinner-videreføring-logikk finnes. **💤 Utsatt, bevisst.** Bruker + eksplisitt valgt: skip bracket-utskrift denne runden, kun de + formatene som faktisk finnes (individuell + to-lag Cup) dekkes av + utskriftsprompt-runden. Bracket-turneringsformen tas opp som egen, + betydelig oppgave (parring/videreføring/UI) FØR noen utskrift for + den designes. +- **Shotgun-start finnes ikke** (`tournament_round`/`tournament_round_ + group` for individuelle turneringer, `session`/`match` for Cup- + format -- SAMME arkitektoniske begrensning begge steder: ett delt + starthull for HELE runden/økten, kun staggerte klokkeslett PER + gruppe/match, ingen forskjellig starthull per gruppe/match). + Individuell-siden ble dette BEVISST valgt bort i migrasjon 084 + (2026-08-18, tre-spørsmål-avklaring med bruker den gang). Bruker denne + runden: "Det må komme frem om det er Shotgun eller løpende start... + Sorteringen av startlisten gjøres etter utslagsform." **✅ BYGGET + 2026-08-21** (migrasjon 088, ADR-096) -- se ARCHITECTURE_DECISIONS.md + for full detalj, ikke gjentatt her. + +## Idé, ikke spesifisert: påminnelser + tilbakemeldings-"kartotek" under en runde (2026-08-21) — 📋 fanget, ikke designet + +Bruker: "Jeg vil brukeren skal få spørsmål om han vil bli påminnet +nødvendige ting som å huske å drikke (og spise), huske rutinene sine og +andre gode poenger gjennom golfrunden. Kanskje vi også skulle +implementert et kartotek med tilbakemeldinger av ymse slag som popper +opp når spilleren registerer en score på et hull eller etter en +fullført runde eller etter en turnering?" To atskilte idéer, ingen av +dem designet i detalj ennå: + +1. **Under-runde-påminnelser** -- spørre brukeren (trolig ved + rundestart, eller i profil-/innstillinger) om de vil ha periodiske + varsler under en pågående runde for ting som lett glemmes: drikke + vann, spise, egne faste rutiner/sjekklister. Uavklart: varslings- + mekanisme (push-varsel? in-app-banner?), frekvens/trigger + (tidsintervall? etter hvert hull?), hvor dette konfigureres, om det + er en global brukerinnstilling eller per-runde-valg. +2. **Tilbakemeldings-"kartotek"** -- en samling ferdigskrevne + tips/tilbakemeldinger som kan poppe opp kontekstuelt: ved + score-registrering på et hull, etter fullført runde, eller etter + fullført turnering. Uavklart: hva slags innhold (motiverende? + teknisk/instruktivt? statistikk-baserte observasjoner om spillerens + eget spill?), triggerlogikk (tilfeldig? regelbasert ut fra + score/statistikk?), om det er redigerbart av organisator/klubb eller + fast levert av TeeCup. + +**Neste steg:** begge idéene trenger en egen avklaringsrunde med bruker +FØR design/bygging -- ingen beslutninger tatt ennå, kun fanget opp her +for å ikke gå tapt.