diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 42ecc22..be82464 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -367,7 +367,10 @@ "Bash(curl -s -D - https://teecup.teeoff.no/rounds -o /tmp/rounds_get.out)", "Bash(curl -s -D - https://teecup.teeoff.no/rounds/00000000-0000-0000-0000-000000000000 -o /tmp/rounds_id_get.out)", "Bash(grep -n '\"/rounds\\\\|`/rounds\\\\|href=\"/rounds\\\\|href={`/rounds' components/own-rounds.tsx components/new-round.tsx components/round-detail.tsx components/round-card.tsx components/dashboard.tsx app/page.tsx)", - "Bash(grep -n '\"/rounds\\\\|`/rounds\\\\|href=\"/rounds\\\\|href={`/rounds\\\\|router\\\\.\\\\\\(push\\\\|replace\\\\\\)\\(.*rounds' components/own-rounds.tsx components/new-round.tsx components/round-detail.tsx components/round-card.tsx components/dashboard.tsx)" + "Bash(grep -n '\"/rounds\\\\|`/rounds\\\\|href=\"/rounds\\\\|href={`/rounds\\\\|router\\\\.\\\\\\(push\\\\|replace\\\\\\)\\(.*rounds' components/own-rounds.tsx components/new-round.tsx components/round-detail.tsx components/round-card.tsx components/dashboard.tsx)", + "Bash(curl -s -o /dev/null -w \"my-rounds: %{http_code}\\\\n\" https://teecup.teeoff.no/my-rounds)", + "Bash(curl -s -o /dev/null -w \"my-rounds/new: %{http_code}\\\\n\" https://teecup.teeoff.no/my-rounds/new)", + "Bash(curl -s https://teecup.teeoff.no/rounds)" ], "additionalDirectories": [ "/opt/teeoff/deploy", diff --git a/ARCHITECTURE_DECISIONS.md b/ARCHITECTURE_DECISIONS.md index ff5c25c..4e60d95 100644 --- a/ARCHITECTURE_DECISIONS.md +++ b/ARCHITECTURE_DECISIONS.md @@ -2015,6 +2015,57 @@ boot-et rent, `/health`/`/dashboard`/`/rounds`/`/rounds/new` → 200 over ekte https, `teeoff.no` upåvirket. De tre V0-zip-ene slettet fra prosjektroten etter fullført integrering. +**Reell produksjonsbug funnet OG FIKSET 2026-07-23, rapportert av bruker +med to skjermbilder (`/rounds` ga "Klarte ikke å hente rundene dine", +`/rounds/new` sitt siste steg ga "Klarte ikke å opprette runden"):** +rot-årsak var en EKSAKT navnekollisjon mellom frontend-sidens toppnivå- +prefiks (`/rounds`) og backend-APIets ressursprefiks (samme `/rounds`, +`app/routers/rounds.py`) -- en verre variant av den allerede dokumenterte +"afterFiles"-fellen fra ADR-016s medlemsside-hendelse, denne gangen +rammende BEGGE retninger samtidig: +- `/rounds` (eksakt sti): en STATISK frontend-side. Statiske sider + sjekkes FØR rewrites, så siden vant presedens -- klientens + `fetch("/rounds")`/`POST /rounds` traff ALDRI backend, fikk Next sin + egen HTML tilbake i stedet for JSON (stille `res.json()`-parsefeil, + fanget av try/catch, viste den generiske feilteksten). +- `/rounds/[id]` (DYNAMISK side): her sjekkes rewrites FØR dynamiske + sider, så rewrite-regelen vant presedens i stedet -- selve + rundedetalj-SIDEN var dermed fullstendig UOPPNÅELIG (ville vist rå + backend-JSON i stedet for UI-et), bekreftet direkte med `curl` FØR + fiksen (anonymt `GET /rounds/00000000-...` ga ekte backend-JSON i + stedet for Next sin HTML). +Det andre skjermbildets utslagsnavn "55/50/44/32" ble UNDERSØKT OG +BEKREFTET Å IKKE VÆRE EN BUG -- lest direkte fra ekte `teeoff_api` (`GET +tjome-golfklubb`): Tjøme Golfklubb sine faktiske utslagsnavn i teeoff ER +bokstavelig talt disse tallene (lengde i hundremeter, ikke fargenavn) -- +data gjengitt korrekt, ingen kode-endring nødvendig for dette punktet. +**Fikset ved samme prinsipp som medlemsside-hendelsen: flytt siden, ikke +APIet.** Alle tre frontend-rutene flyttet til et helt nytt, ikke- +overlappende toppnivå-prefiks `/my-rounds/*` (`app/rounds/` → +`app/my-rounds/`), API-et (`/rounds/*`) uendret. Åtte interne +navigasjonsreferanser oppdatert på tvers av `round-card.tsx`/ +`own-rounds.tsx`/`new-round.tsx`/`round-detail.tsx`/`dashboard.tsx` -- +ekte `fetch()`-kall til API-et (samme filer) bevisst latt urørt, kun +``/`router.push`/`router.replace` endret. Utvidet +`next.config.mjs` sin allerede eksisterende advarselskommentar med denne +nye, verre varianten av samme fellesklasse, som en fremtidig påminnelse: +et rewrite-prefiks og en frontend-sides toppnivå-segment må ALDRI være +identisk streng. +**Verifisert presist FØR og ETTER utrulling** (ikke bare "bygget uten +feil"): et `curl` mot ekte produksjon FØR fiksen bekreftet nøyaktig +mekanismen i begge retninger (se over). Ekte typesjekket +produksjonsbuild etterpå viste selv at rutetreet nå lister `/my-rounds`, +`/my-rounds/[id]`, `/my-rounds/new` i stedet for de gamle `/rounds`- +rutene. **Rullet ut live 2026-07-23**, bruker bekreftet eksplisitt: kun +`teecup_frontend` (gjenskapte `teecup_api` som vanlig bivirkning, ingen +backend-kode rørt). Verifisert ETTERPÅ med et nytt sett `curl`-kall mot +ekte https: anonymt `GET /rounds` ga nå korrekt backend-JSON +(`NOT_AUTHENTICATED`, IKKE Next sin HTML som før), anonymt `GET +/rounds/` fortsatt korrekt backend-JSON (uendret, som forventet), +og -- den avgjørende nye sjekken -- anonymt `GET /my-rounds/` ga nå +faktisk `text/html` (selve React-siden, ikke lenger uoppnåelig). +`/dashboard`/`/my-rounds`/`/my-rounds/new` → 200, `teeoff.no` upåvirket. + **Motor-komponenten (punkt 1-11) er ✅ BYGGET OG TESTET 2026-07-22,** som første, isolerte byggesteg (ren Python, ingen DB/API/frontend ennå — matcher ADR-005s "test i isolasjon FØR resten"). Nye funksjoner i diff --git a/CLAUDE.md b/CLAUDE.md index 6d9727d..7fc9f9e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2421,6 +2421,27 @@ Neste steg: også `teecup_api` som vanlig bivirkning), begge containere boot-et rent, `/health`/`/dashboard`/`/rounds`/`/rounds/new` → 200, `teeoff.no` upåvirket. V0-zip-ene slettet fra prosjektroten. + **Reell produksjonsbug rapportert av bruker (2 skjermbilder) og + FIKSET samme dag:** `/rounds` var samtidig frontend-listesidens sti OG + backend-APIets ressursprefiks — en verre, begge-veier-variant av + ADR-016s medlemsside-felle. Statisk side vant over rewrite for det + eksakte `/rounds`-treffet (klientens `fetch("/rounds")`/`POST /rounds` + traff aldri backend, fikk Next sin egen HTML tilbake — derav "Klarte + ikke å hente rundene dine"/"Klarte ikke å opprette runden"), mens + rewriten vant over den DYNAMISKE `/rounds/[id]`-siden i motsatt + retning (selve rundedetalj-siden var dermed fullstendig uoppnåelig, + bekreftet direkte med `curl` før fiksen). Skjermbildets andre detalj — + utslagsnavn "55/50/44/32" — ble sjekket direkte mot ekte `teeoff_api` + og bekreftet Å IKKE VÆRE EN BUG (Tjøme Golfklubb sine faktiske + utslagsnavn, lengde i hundremeter). Fikset ved å flytte alle tre + frontend-rutene til et nytt, ikke-overlappende prefiks `/my-rounds/*` + — API-et uendret på `/rounds`. `next.config.mjs` sin advarsel utvidet + med denne nye varianten. Verifisert med `curl` mot ekte produksjon + BÅDE før og etter (anonymt `GET /rounds` → nå korrekt backend-JSON, + anonymt `GET /my-rounds/` → nå korrekt `text/html`, altså + endelig oppnåelig). Rullet ut live 2026-07-23, bruker bekreftet + eksplisitt, kun `teecup_frontend` (+ vanlig `teecup_api`-bivirkning), + `teeoff.no` upåvirket. Full detalj i ADR-033. 4. **Del 1 (fri, ukrevd sekundær-e-post) er nå BYGGET OG LIVE** (2026-07-21, se status over). **Del 2 (ekte konto-sammenslåing) fortsatt IKKE designet:** hva skjer hvis den ønskede adressen ALLEREDE tilhører en diff --git a/FEATURE_BACKLOG.md b/FEATURE_BACKLOG.md index 3d4ab34..5393ba6 100644 --- a/FEATURE_BACKLOG.md +++ b/FEATURE_BACKLOG.md @@ -1397,6 +1397,14 @@ merge-før-PATCH beholdt, dev-forhåndsvisningskontroller fjernet). Ingen backend-endring i denne del-runden. Rullet ut live, `teeoff.no` upåvirket. +**Reell produksjonsbug funnet og fikset 2026-07-23, samme dag, rapportert +av bruker med skjermbilder:** `/rounds` var samtidig frontend-side og +API-prefiks — samme fellesklasse som ADR-016s medlemsside-hendelse, men +rammet begge presedens-retninger samtidig (listesiden nådde aldri +backend, og rundedetalj-siden var helt uoppnåelig). Fikset ved å flytte +frontend til `/my-rounds/*`, API uendret. Se ADR-033 for full detalj, +inkl. `curl`-bevis før/etter. + **Notat fra bruker, IKKE designet/bygget ennå (fanget 2026-07-22):** brukeren har tenkt å ha med (a) måling av lengde på slag, og (b) å kunne få opplyst avstand til forskjellige steder på banen (typisk pin/hazard/