From dd54a78ce37e61efdc1a1a2f42eba5a3dd5f2ca3 Mon Sep 17 00:00:00 2001 From: Erol Haagenrud Date: Sun, 19 Jul 2026 21:36:33 +0200 Subject: [PATCH] Update Todos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Designe walkover/konsesjon-API (match- og turnering-nivå) Implementere apply_concession + POST .../matches/{id}/concede i scoring.py Implementere POST .../tournaments/{id}/concede i tournaments.py Skrive ADR-024 for walkover/konsesjon Scratch-verifisere backend grundig Bygge frontend-UI for walkover/konsesjon Ekte typesjekket frontend-build Deploy etter eksplisitt bekreftelse + oppdatere .md-filer Walkover/konsesjon er live (ADR-024): Kun den tapende siden (kaptein, eller org-admin) kan erklære — speiler ekte golf-etikette, ingen kan kreve seier på motstanderens vegne. Ensidig, ingen bekreftelse fra motparten kreves. Både match-nivå (session-scorecard.tsx, kollapsbar "Gi opp matchen"-seksjon) og turnering-nivå (tournament-detail.tsx, "Gi opp resten av turneringen"-knapp per lag) — sistnevnte gir opp alle ikke-avgjorte matcher laget har, i én operasjon. Kan erklæres uansett hvor mange hull som allerede er registrert — allerede registrerte resultater blir stående urørt i scorekortet. 30 automatiserte scratch-sjekker (15 match-nivå + 15 turnering-nivå), typesjekket produksjonsbuild, deployet uten migrasjon, teeoff.no upåvirket. Alle tre .md-filene er oppdatert. --- ARCHITECTURE_DECISIONS.md | 5 ++-- CLAUDE.md | 61 ++++++++++++++++++++++++++++++++++++--- FEATURE_BACKLOG.md | 2 +- 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/ARCHITECTURE_DECISIONS.md b/ARCHITECTURE_DECISIONS.md index c06c0c2..305db3f 100644 --- a/ARCHITECTURE_DECISIONS.md +++ b/ARCHITECTURE_DECISIONS.md @@ -1018,8 +1018,9 @@ nødvendig. Status-teksten "Walkover (A)"/"Walkover (B)" følger samme "(bokstav)"-visningskonvensjon som `compute_match_state.describe()` sine egne strenger (f.eks. "9&7 (A)"). -**Status: ✅ BYGGET 2026-07-19.** Ingen migrasjon (ren applogikk, ingen -skjemaendring). Se CLAUDE.md-status for scratch-verifisering og utrulling. +**Status: ✅ BYGGET OG LIVE 2026-07-19.** Ingen migrasjon (ren applogikk, +ingen skjemaendring). Se CLAUDE.md-status for scratch-verifisering og +utrulling. --- diff --git a/CLAUDE.md b/CLAUDE.md index ae1a78f..70bc20f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1390,13 +1390,66 @@ Ferdig og verifisert: begge containere boot-et rent (`Application startup complete`, Next.js `Ready`), `/health` og `/dashboard` → 200, `teeoff.no` upåvirket. +- **Walkover/konsesjon LIVE (2026-07-19, ADR-024):** direkte oppfølging av + Brukerroller-runden samme dag — brukeren ba eksplisitt om å ta fatt på + dette som naturlig neste steg. Løser det lenge kjente hullet: en side som + aldri stiller nok spillere fikk aldri beregnet handicap og matchen kunne + derfor aldri avgjøres — hang uendelig. + Fire beslutninger avklart eksplisitt med bruker (AskUserQuestion) før + bygging — tre anbefalte valg, ett (omfang: match+turnering-nivå samtidig, + ikke bare match) valgt utover anbefalingen. + **Bygget:** ny `apply_concession`-hjelpefunksjon i `app/routers/ + scoring.py` (skriver til de samme fire kolonnene som + `recompute_and_cache_match_state` -- `status_text`/`points_side_a/b`/ + `leading_side` -- men direkte, ikke utledet fra hull). Ny + `POST /orgs/{id}/matches/{id}/concede` (kun kaptein for det TAPENDE laget, + speiler ekte golf-etikette -- du gir bort DITT tap, krever ikke seier på + motstanderens vegne -- eller org-admin, gjenbruker `user_is_team_captain` + fra ADR-023 uendret). Ny `POST /orgs/{id}/tournaments/{id}/concede` + (`app/routers/tournaments.py`) som gir opp ALLE ikke-avgjorte matcher + laget har i turneringen i én operasjon -- v1s to-lags-grense (ADR-011) + gjør dette trivielt (bare én motstander uansett), `FOR UPDATE`-låser alle + berørte match-rader (samme race-vern som ellers). Kan erklæres uansett + hvor mange hull som allerede er registrert (match-play teller kun + seier/tap/delt for poeng, ikke marginen) -- allerede registrerte hull i + `hole_score`/`match_hole_result` forblir urørt, kun matchens + avgjørelses-felt endres. + **Frontend:** `session-scorecard.tsx` fikk en kollapsbar + "Gi opp matchen (walkover)"-seksjon (to knapper, én per lag, med + bekreftelsessteg) synlig når matchen ikke er avgjort. + `tournament-detail.tsx` sin `TeamPanel` fikk en tilsvarende "Gi opp resten + av turneringen for laget"-knapp nederst i hvert lagkort. Ingen + klientside-forhåndsfiltrering på kapteinstatus noe sted -- begge knappene + vises alltid, en 403 fra backend vises bare som vanlig feiltekst (samme + mønster som resten av appen). + **Verifisert grundig mot fersk `teecup_scratch`** (isolert + `teecup_app_scratch`-rolle, isolert scratch-MinIO, engangs + API-container): to separate 15-punkts Python/httpx-testløp. Match-nivå: + vinnende lags kaptein NEKTES å konsedere på vegne av det tapende laget + (kan ikke kreve seier på andres vegne), tapende lags kaptein FÅR, allerede + avgjort match avvist 409, fremmed team_id avvist 400, konsesjon ETTER at + ett hull allerede er registrert bekreftet å fungere OG bekreftet at det + registrerte hull-resultatet forblir synlig i scorekortet etterpå (ikke + overskrevet), org-admin FÅR konsedere direkte uavhengig av kapteinmerke. + Turnering-nivå: feil lags kaptein nektes, riktig kaptein FÅR gi opp + resten (kun de faktisk ikke-avgjorte matchene telles -- allerede avgjorte + matcher fra match-nivå-testene i samme løp ble korrekt hoppet over), + gjentatt kall er trygt (0 nye, idempotent i praksis), ukjent team_id gir + 404. `test_isolation.sql` 12/12 uendret (ingen skjemaendring). Ekte + typesjekket produksjonsbuild av frontend kjørt og bekreftet, alle 11 + ruter listet. + **Rullet ut live 2026-07-19**, bruker bekreftet eksplisitt: ingen + migrasjon, `docker compose up -d --build teecup_api teecup_frontend`, + begge containere boot-et rent, `/health` og `/dashboard` → 200, + `teeoff.no` upåvirket. + Neste steg: 1. PWA-egenskaper (manifest, service worker, offline-cache) — ikke startet. 2. Kommunikasjon (chat/feed) — ikke startet. -3. Fortsatt åpne beslutninger fra FEATURE_BACKLOG.md: walkover/konsesjon - (kan nå tas fatt på — ventet tidligere på brukerroller/ADR-023, som nå er - avgjort og bygget), sanntid/WebSockets vs. polling, tilskuer-rolle - (bevisst utsatt til Kommunikasjon-runden), kode-regenerering for ADR-020. +3. Fortsatt åpne beslutninger fra FEATURE_BACKLOG.md: sanntid/WebSockets vs. + polling, tilskuer-rolle (bevisst utsatt til Kommunikasjon-runden), + kode-regenerering for ADR-020, turnering-status (draft/active/completed/ + archived) via API, korrigering-godkjenning fra motpart. 4. Ved fremtidige nye V0-skjermer/-design i V0 (fortsett i samme prosjekt), FORVENT en full re-eksport hver gang — diff mot live-treet i et scratch-område før noe pakkes ut over eksisterende filer, og sjekk om diff --git a/FEATURE_BACKLOG.md b/FEATURE_BACKLOG.md index f33748e..0b2a882 100644 --- a/FEATURE_BACKLOG.md +++ b/FEATURE_BACKLOG.md @@ -352,7 +352,7 @@ Turnering har et `status`-felt (draft/active/completed/archived) men INGEN endepunkt endrer det ennå — organisator kan ikke markere en turnering ferdig via API-et i dag (eget, senere punkt). -- **Walkover/konsesjon — ✅ BYGGET 2026-07-19 (ADR-024).** Løste det +- **Walkover/konsesjon — ✅ BYGGET OG LIVE 2026-07-19 (ADR-024).** Løste det opprinnelige hullet: en side som aldri stiller nok spillere kan nå avsluttes ved at den TAPENDE siden (kaptein, eller org-admin) erklærer walkover — ensidig, ingen bekreftelse fra motparten. `POST /orgs/{id}/