Update Todos

Diagnostisere de to feilmeldingene fra skjermbildene

Flytte frontend-sidene fra /rounds/* til /my-rounds/* (kollisjon med API-proxyen)

Oppdatere alle interne lenker/router-kall til nye stier

Oppdatere next.config.mjs-kommentaren med denne lærdommen

Typesjekket produksjonsbuild

Rulle ut live etter bekreftelse

Oppdatere statusdokumentasjon
Ferdig og live. Oppsummert:

Begge feilmeldingene skyldtes samme rot-årsak: /rounds var både frontend-sidens sti og backend-APIets ressursprefiks. Next.js sin rewrite-presedens ga to motsatte feil samtidig — listesiden/opprett-runde-kallet nådde aldri backend (fikk Next sin egen HTML tilbake i stedet for JSON), mens selve rundedetalj-siden var fullstendig uoppnåelig i motsatt retning. Fikset ved å flytte alle tre frontend-rutene til /my-rounds/*, uendret API på /rounds. Bekreftet med curl mot ekte produksjon både før og etter — nå fungerer alt som det skal. Det andre skjermbildets «55/50/44/32» var forøvrig ikke en bug, bare Tjøme Golfklubb sine ekte utslagsnavn i teeoff.

Alt rullet ut, teeoff.no upåvirket, status dokumentert i CLAUDE.md/FEATURE_BACKLOG.md/ADR-033.
This commit is contained in:
Erol Haagenrud 2026-07-23 12:19:31 +02:00
parent 6e688c6440
commit 29a6b90127
4 changed files with 84 additions and 1 deletions

View file

@ -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 -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(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' 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": [ "additionalDirectories": [
"/opt/teeoff/deploy", "/opt/teeoff/deploy",

View file

@ -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 ekte https, `teeoff.no` upåvirket. De tre V0-zip-ene slettet fra
prosjektroten etter fullført integrering. 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
`<Link href>`/`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/<uuid>` fortsatt korrekt backend-JSON (uendret, som forventet),
og -- den avgjørende nye sjekken -- anonymt `GET /my-rounds/<uuid>` 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,** **Motor-komponenten (punkt 1-11) er ✅ BYGGET OG TESTET 2026-07-22,**
som første, isolerte byggesteg (ren Python, ingen DB/API/frontend ennå — som første, isolerte byggesteg (ren Python, ingen DB/API/frontend ennå —
matcher ADR-005s "test i isolasjon FØR resten"). Nye funksjoner i matcher ADR-005s "test i isolasjon FØR resten"). Nye funksjoner i

View file

@ -2421,6 +2421,27 @@ Neste steg:
også `teecup_api` som vanlig bivirkning), begge containere boot-et også `teecup_api` som vanlig bivirkning), begge containere boot-et
rent, `/health`/`/dashboard`/`/rounds`/`/rounds/new` → 200, `teeoff.no` rent, `/health`/`/dashboard`/`/rounds`/`/rounds/new` → 200, `teeoff.no`
upåvirket. V0-zip-ene slettet fra prosjektroten. 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/<uuid>` → 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, 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 se status over). **Del 2 (ekte konto-sammenslåing) fortsatt IKKE
designet:** hva skjer hvis den ønskede adressen ALLEREDE tilhører en designet:** hva skjer hvis den ønskede adressen ALLEREDE tilhører en

View file

@ -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` backend-endring i denne del-runden. Rullet ut live, `teeoff.no`
upåvirket. 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):** **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 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/ få opplyst avstand til forskjellige steder på banen (typisk pin/hazard/