# CLAUDE.md — arbeidsinstruks for TeeCup Les dette først i hver økt. Det koder hva vi har bestemt og hvordan vi jobber. ## Autoritative kilder (les før du gjør noe) - `ARCHITECTURE_DECISIONS.md` — hva som er bestemt og hvorfor (ADR-001…013). Fasit. - `FEATURE_BACKLOG.md` — hva som gjenstår, hva som er utsatt, hva som mangler. - Endres en beslutning: legg til en ny ADR, ikke slett historikk. Hold begge filene oppdatert når noe avgjøres. ## Sikkerhetsregler (ufravikelige) - Rør ALDRI `teeoff`-databasen eller den ekte `teecup_db` uten at brukeren eksplisitt har bekreftet det i samme økt. Test alltid migrasjoner mot en egen scratch-database først, og rydd opp etterpå. - Vis planen (hvilke kommandoer, mot hvilken database) FØR du kjører noe som skriver, migrerer eller sletter. Vent på bekreftelse. - Hemmeligheter (passord, secrets) bor i `.env` (filrettigheter 600), dekkes av `.gitignore`, committes aldri, og skrives aldri i klartekst i chatten eller i SQL-filer. Generer dem på serveren (`openssl rand -base64 32`). - Kjør appen som databaserollen `teecup_app` (NOSUPERUSER, NOBYPASSRLS) — aldri som `teeoff_admin`/superuser i runtime. ## Arkitektur-invarianter (ikke bryt uten en ny ADR) - Tenant = organisasjon. `organization_id` på alle domenetabeller, håndhevet av RLS. App-koden setter `app.current_org` med `SET LOCAL` per transaksjon. - Verifiser at brukeren er medlem av organisasjonen FØR org-konteksten settes. RLS stoler blindt på `app.current_org`. - Egen innlogging (uavhengig av teeoff). Banedata hentes fra teeoff via lesende API, ikke delt database. - v1 = nøyaktig to lag (Ryder Cup-format), håndhevet i app-laget. Match-modellen holdes generell (to sider) så knockout/flere lag kan komme senere. - Handicap-/matchlogikk skal ligge i `handicap_engine.py` (rent, testet, uten db/API-avhengigheter). Allowances er konfig, ikke hardkodet. - Media (bilder/video) skal i objektlagring (MinIO), ikke i Postgres. Postgres holder bare metadata + nøkkel. ## Arbeidsmåte - Inkrementelt. Ingenting tas for gitt før det er testet. Bekreft hvert steg før du går videre. - Bruk git (remote: brukerens Forgejo). Commit i logiske steg med tydelige meldinger. - Er du usikker på omfang eller en beslutning: spør heller enn å gjette. ## Status (oppdater denne når ting endres) Ferdig og verifisert: - Handicap-motor + tester (24/24, R&A-verifisert). - Skjema `001` + roller `002` + scoring/blind draw `003`. Isolasjon bevist med `test_isolation.sql` (RLS-oppførsel, ikke bare at skjemaet kjører). - API-skjelett i `app/` (org-kontekst via SET LOCAL, medlemskapssjekk). Kun syntaks-verifisert — ikke kjørt ennå (mangler container med avhengigheter). Neste steg: 1. Containerisere TeeCup-API-et (Dockerfile + compose-tjeneste), koble mot `teecup_db` med `teecup_app`, rute via eksisterende Caddy til `teecup.teeoff.no`. 2. API-endepunkter: oppsett (turnering/lag/økter/roster/blind draw) og scoring (slag eller hull-resultat → matchstatus fra motoren). 3. Deretter frontend (PWA, offline-first) og kommunikasjon (migrasjon 004).