Egen poi_type "creek" for bekk, skilt fra water (ADR-084 del 3)

Ny migrasjon 081 legger til creek i det delte course_poi_type-domenet.
Kobler inn brukerens nye bekk-ikon i diagrammet og reklassifiserer de
8 kjente Tjøme-bekk-punktene (hull 2/3/11/12) fra water til creek,
identifisert via samme koordinat-regneark som ga hazard_group-dataen
i forrige runde.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Erol Haagenrud 2026-08-18 06:53:35 +02:00
parent f3b3d30e4e
commit eba8616438
5 changed files with 120 additions and 4 deletions

View file

@ -0,0 +1,33 @@
-- =====================================================================
-- TeeCup — migrasjon 081
-- Ny POI-type "creek" (bekk) -- skilt fra "water" (dam/vannhinder)
-- =====================================================================
-- Konkret anledning (ADR-084 del 2): Tjøme Golfklubb sitt koordinat-
-- regneark skiller eksplisitt mellom "vann" (dam) og "fairway bekk"
-- (bekk/creek) som to ulike fysiske hindringstyper -- 8 punkter (4
-- forkant+bakkant-par, hull 2/3/11/12) er i dag lagret som poi_type
-- 'water' siden domenet (migrasjon 079) ikke hadde noen egen verdi for
-- bekk. Bruker har laget og lastet opp et eget bekk-ikon
-- (frontend/public/hole-diagram/hazard-creek.png) og ba eksplisitt om
-- at dette blir en visuelt distinkt hindringstype i hull-diagrammet,
-- ikke fortsatt vist som "Vannhinder".
--
-- `creek` legges til course_poi_type-domenet (migrasjon 079) -- gjelder
-- automatisk begge koordinattabellene (golfapi_course_coordinate og
-- teeoff_course_coordinate) siden begge bruker samme delte domene.
-- De 8 kjente eksisterende bekk-punktene REKLASSIFISERES i en egen,
-- ikke-migrasjonsbasert UPDATE (se CHANGELOG/ADR-084) -- identifisert
-- presist via samme koordinat-regneark som ga hazard_group-dataen i
-- del 2, ikke en heuristikk.
-- =====================================================================
\set ON_ERROR_STOP on
ALTER DOMAIN course_poi_type DROP CONSTRAINT course_poi_type_check;
ALTER DOMAIN course_poi_type ADD CONSTRAINT course_poi_type_check
CHECK (VALUE IN (
'green', 'green_bunker', 'fairway_bunker', 'water', 'creek',
'trees', 'marker_100', 'marker_150', 'marker_200',
'dogleg', 'road', 'tee_front', 'tee_back',
'rock', 'layup', 'landmark'
));

View file

@ -8546,6 +8546,54 @@ eget ikon oppdatert: nå KUN `road` (ingen ikon lastet opp for denne).
V0-prompt for polert visning fortsatt ikke skrevet -- venter på at V0-prompt for polert visning fortsatt ikke skrevet -- venter på at
bruker har sett/godkjent denne runden i produksjon også. bruker har sett/godkjent denne runden i produksjon også.
### ADR-084 del 3: egen poi_type "creek" for bekk (2026-08-18)
Del 2 sa bevisst nei til å blande bekk inn i `water` sitt ikon --
bruker ba om egen runde, som ble gjort samme dag. `course_poi_type`
(delt domene, migrasjon 079) hadde ingen verdi for bekk, kun `water`
som historisk har dekket både dam og bekk.
**Migrasjon 081** legger til `creek` i domenet (`ALTER DOMAIN
course_poi_type DROP/ADD CONSTRAINT`) -- gjelder automatisk begge
koordinattabellene siden de deler domenet. Additiv, ingen eksisterende
rader berøres av selve migrasjonen.
**Reklassifisering, egen UPDATE (ikke migrasjon):** 8 kjente Tjøme-
punkter (hull 2/3/11/12, "fairway bekk" i koordinat-regnearket fra del
2, gjenbruker samme fysiske bekk på to hull-par) hadde `poi_type =
'water'` siden det var eneste tilgjengelige verdi ved import.
Identifisert presist via samme regneark+lat/long-matching som ga
hazard_group-dataen i del 2 (ikke gjettet) -- alle 8 hadde allerede
`hazard_group` satt fra den runden, urørt av denne oppdateringen.
Frontend: nytt ikon (`hazard-creek.png`, 32×32, lastet opp av bruker)
koblet inn som egen `HazardKind` i `_HAZARD_KIND`/`_ICON_SRC`, label
"Bekk". Ingen backend-modellendring nødvendig -- `poi_type` er
allerede `str` (ikke et strengt enum) i både `TargetPoint`
(target_points.py) og `CoursePointIn/Out` (courses.py).
**Verifisert:** `tsc --noEmit` rent, `vitest run` 55/55, full
`./scripts/run_backend_tests.sh` 111/111 (migrasjon 081 kjørt
problemfritt i scratch-testsuiten sin egen database). Ny scratch-runde
med et konstruert bekk-forkant+bakkant-par -- bekreftet eget,
distinkt ikon (ikke forvekslet med vann-ikonet), riktig forkant/
bakkant-tekst, lys+mørk. Scratch-stacken revet ned.
Under samme opprydding oppdaget: flere gamle, TOMME MinIO scratch-
bøtter fra tidligere økter (`teecup-scratch-hh/hs/oom/players/roster/
wz`) som aldri ble ryddet bort ved forrige økters teardown. Bekreftet
adskilt fra ekte data (produksjon bruker `teecup-media`,
`TEECUP_MINIO_BUCKET` i `.env`) og tomme (0 objekter hver) før sletting
-- ingen tilsvarende glemte scratch-databaser/-roller/-containere
funnet.
**Rullet ut 2026-08-18** -- bruker bekreftet alle tre deler eksplisitt
(migrasjon, reklassifisering, kode). Migrasjon 081 og
reklassiferings-UPDATE kjørt mot ekte `teecup_db`, deretter `docker
compose build teecup_frontend && up -d`. Rene containerlogger,
`https://teecup.golf/logg-inn` 200 OK, 8/8 rader bekreftet
`poi_type = 'creek'`.
--- ---
## Utviklingsplan (rekkefølge) ## Utviklingsplan (rekkefølge)

View file

@ -12180,3 +12180,36 @@ Neste steg:
**Gjenstår:** bekk som egen `poi_type` (egen runde, bedt om **Gjenstår:** bekk som egen `poi_type` (egen runde, bedt om
eksplisitt av bruker). Ikon-mangel-lista er nå kun `road`. V0- eksplisitt av bruker). Ikon-mangel-lista er nå kun `road`. V0-
prompt for polert visning fortsatt ikke skrevet. prompt for polert visning fortsatt ikke skrevet.
103. **Egen poi_type "creek" for bekk (ADR-084 del 3) — 2026-08-18.**
Del 2 samme dag lot bekk-ikonet ligge ukoblet -- domenet
`course_poi_type` skilte ikke bekk fra dam (begge `water`), og
bruker ba om egen runde for det. Migrasjon 081 la til `creek` i
det delte domenet (`ALTER DOMAIN ... DROP/ADD CONSTRAINT`, gjelder
automatisk begge koordinattabellene). Egen `UPDATE` (ikke
migrasjon) reklassifiserte de 8 kjente Tjøme-bekk-punktene (hull
2/3/11/12) fra `water` til `creek` -- identifisert presist via
samme koordinat-regneark+lat/long-matching som ga hazard_group-
dataen i del 2, `hazard_group` urørt. Nytt ikon
(`hazard-creek.png`) koblet inn i `_HAZARD_KIND`/`_ICON_SRC` under
egen `HazardKind`, label "Bekk". Ingen backend-endring nødvendig
(`poi_type` er `str`, ikke et strengt enum, i både
`target_points.py` og `courses.py`).
**Verifisert:** `tsc --noEmit` rent, `vitest run` 55/55, full
`./scripts/run_backend_tests.sh` 111/111 (migrasjon 081 i scratch-
testsuitens egen database). Ny scratch-runde med konstruert bekk-
par -- bekreftet eget, distinkt ikon (ikke forvekslet med vann),
lys+mørk. Scratch-stacken revet ned.
Samtidig ryddet: flere gamle, TOMME MinIO scratch-bøtter fra
tidligere økter (`teecup-scratch-hh/hs/oom/players/roster/wz`) som
aldri ble fjernet ved forrige teardown -- bekreftet adskilt fra
ekte data (`teecup-media`) og tomme før sletting, ingen andre
glemte scratch-ressurser funnet.
**Rullet ut 2026-08-18** -- bruker bekreftet migrasjon,
reklassifisering og kode hver for seg. Kjørt mot ekte `teecup_db`,
deretter `docker compose build teecup_frontend && up -d`. Rene
containerlogger, `https://teecup.golf/logg-inn` 200 OK, 8/8 rader
bekreftet `poi_type = 'creek'`.

View file

@ -12,7 +12,7 @@
import { MapPin, TriangleAlert } from "lucide-react" import { MapPin, TriangleAlert } from "lucide-react"
import { cn } from "@/lib/utils" import { cn } from "@/lib/utils"
export type HazardKind = "sand" | "water" | "rock" | "tree" | "dogleg" | "layup" | "landmark" | "generic" export type HazardKind = "sand" | "water" | "creek" | "rock" | "tree" | "dogleg" | "layup" | "landmark" | "generic"
export type DiagramHazard = { export type DiagramHazard = {
key: string key: string
@ -99,6 +99,7 @@ function formatMeters(m: number) {
const _ICON_SRC: Partial<Record<HazardKind, string>> = { const _ICON_SRC: Partial<Record<HazardKind, string>> = {
sand: "/hole-diagram/hazard-sand.png", sand: "/hole-diagram/hazard-sand.png",
water: "/hole-diagram/hazard-water.png", water: "/hole-diagram/hazard-water.png",
creek: "/hole-diagram/hazard-creek.png",
rock: "/hole-diagram/hazard-rock.png", rock: "/hole-diagram/hazard-rock.png",
tree: "/hole-diagram/hazard-tree.png", tree: "/hole-diagram/hazard-tree.png",
dogleg: "/hole-diagram/hazard-dogleg.png", dogleg: "/hole-diagram/hazard-dogleg.png",

View file

@ -53,6 +53,7 @@ const _HAZARD_LABELS: Record<string, string> = {
green_bunker: "Bunker (green)", green_bunker: "Bunker (green)",
fairway_bunker: "Bunker (fairway)", fairway_bunker: "Bunker (fairway)",
water: "Vannhinder", water: "Vannhinder",
creek: "Bekk",
rock: "Fjellknaus", rock: "Fjellknaus",
trees: "Trær", trees: "Trær",
dogleg: "Dogleg", dogleg: "Dogleg",
@ -61,14 +62,14 @@ const _HAZARD_LABELS: Record<string, string> = {
} }
// ADR-084: hvilket ikon en hindringstype får i diagrammet. "generic" // ADR-084: hvilket ikon en hindringstype får i diagrammet. "generic"
// (typer uten dedikert ikon -- i dag ingen, `road` ville falt hit hvis // (typer uten dedikert ikon -- i dag `road`) faller tilbake til lucide
// den noen gang klassifiseres som hindring) faller tilbake til lucide
// sin TriangleAlert -- se hole-diagram-view.tsx. // sin TriangleAlert -- se hole-diagram-view.tsx.
type HazardKind = "sand" | "water" | "rock" | "tree" | "dogleg" | "layup" | "landmark" | "generic" type HazardKind = "sand" | "water" | "creek" | "rock" | "tree" | "dogleg" | "layup" | "landmark" | "generic"
const _HAZARD_KIND: Record<string, HazardKind> = { const _HAZARD_KIND: Record<string, HazardKind> = {
green_bunker: "sand", green_bunker: "sand",
fairway_bunker: "sand", fairway_bunker: "sand",
water: "water", water: "water",
creek: "creek",
rock: "rock", rock: "rock",
trees: "tree", trees: "tree",
dogleg: "dogleg", dogleg: "dogleg",