diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md index 629e7aa..dd215bb 100644 --- a/.gemini/GEMINI.md +++ b/.gemini/GEMINI.md @@ -1,6 +1,6 @@ # GEMINI.md — OSVauco / OPAX -> Claude Opus 4.6 · Vertex AI EU endpoint · Nemotron session protocol · HITL-safe +> Gemini 2.5 Pro · Vertex AI EU endpoint · Nemotron session protocol · HITL-safe --- @@ -29,31 +29,14 @@ OPERATOR_ROLE: Eier, arkitekt og primær operatør av OSVauco / OS-Vauco --- -## Modell: Claude Opus 4.6 via Vertex AI +## Modell: Gemini 2.5 Pro via Vertex AI -Denne agenten kjøres med **Claude Opus 4.6** tilgjengelig via Vertex AI EU multi-region endpoint. +Denne agenten kjøres med **Gemini 2.5 Pro** tilgjengelig via Vertex AI EU endpoint. - Data forblir innenfor EU-grensen (GDPR-compliant) -- Ingen separat Anthropic API-nøkkel — billing via eksisterende GCP-konto -- EU endpoint auto-routes internt mellom europeiske regioner for kapasitet +- Billing via eksisterende GCP-konto - Intern budsjett-cap: **2 500 NOK** — ved behov for mer, spør Chris eksplisitt om +1 000 NOK -```python -# Korrekt initialisering -import anthropic - -client = anthropic.AnthropicVertex( - region="eu", - project_id="propane-will-491900-m5" -) - -response = client.messages.create( - model="claude-opus-4-6@20260801", - max_tokens=8192, - messages=[{"role": "user", "content": "..."}] -) -``` - ```bash # Auth gcloud auth application-default login --project=propane-will-491900-m5 @@ -71,7 +54,7 @@ Chris er en erfaren DevOps/Cloud-utvikler. Han er teknisk, presis og forventer d - **Ikke vær lat.** Internett-søk er siste utvei — ikke første instinkt. - **Vær direkte.** Presenter funn, rot-årsak og fix — ikke lange forklaringer. -**Denne agenten kjøres utelukkende i Gemini TUI** (terminal, interaktiv CLI). +**Denne agenten kjøres utelukkende i Gemini CLI TUI** (terminal, interaktiv CLI). Det er ingen nettleser, ingen GUI, ingen web-editor. Alt skjer i terminalen. ### Hva dette betyr for oppførsel: @@ -107,8 +90,8 @@ Den er **aldri** i git og eksisterer kun på disk eller i Secret Manager. ```bash # Alternativ 1: Sjekk Secret Manager gcloud secrets list --project=propane-will-491900-m5 | grep -i env -gcloud secrets versions access latest - --secret= +gcloud secrets versions access latest \ + --secret= \ --project=propane-will-491900-m5 > .env # Alternativ 2: Sjekk GCS backup @@ -152,14 +135,14 @@ NÅR noe feiler: NÅR du er usikker på state: ```bash -gcloud run services describe $CLOUD_RUN_SVC - --project=$GCP_PROJECT --region=$GCP_REGION +gcloud run services describe $CLOUD_RUN_SVC \ + --project=$GCP_PROJECT --region=$GCP_REGION \ --format="yaml(status,spec.template.spec.containers)" -gcloud artifacts docker images list - gcr.io/$GCP_PROJECT/osvauco-agent - --project=$GCP_PROJECT - --sort-by=~CREATE_TIME +gcloud artifacts docker images list \ + gcr.io/$GCP_PROJECT/osvauco-agent \ + --project=$GCP_PROJECT \ + --sort-by=~CREATE_TIME \ --limit=3 ``` @@ -182,14 +165,14 @@ gcloud artifacts docker images list Etter enhver endring: ```bash -gcloud run revisions list - --service=$CLOUD_RUN_SVC - --project=$GCP_PROJECT - --region=$GCP_REGION +gcloud run revisions list \ + --service=$CLOUD_RUN_SVC \ + --project=$GCP_PROJECT \ + --region=$GCP_REGION \ --limit=3 -curl -s -o /dev/null -w "%{http_code}" - -H "Authorization: Bearer $(gcloud auth print-identity-token)" +curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://opax.vauco.no/health ``` @@ -208,57 +191,57 @@ VERIFY: [kommando for å bekrefte fix] ## Session Protocol (Nemotron Loop) ### BOOT -- Read `docs/AGENT_RULEBOOK.md`, `docs/VAUCO_OS_ROADMAP.md`, and `docs/OSVAUCO_OPAX_SESSION_LOG.md`. -- Print LOCKED DEFINITIONS (`MCP_NAME`, `MCP_PROTOCOL`, `HUB_URL`, `ROOT_DOMAIN`, `GCP_PROJECT`, `MODEL`, `BUDGET_CAP`, `OPERATOR`). -- Print the last `## NESTE OPPGAVE` block found in the session log. -- If no NESTE OPPGAVE found → warn and read ROADMAP NOW section instead. +- Les og print innhold fra: `docs/AGENT_RULEBOOK.md`, `docs/MASTERPLAN.md`, `docs/ROADMAP.md`, `docs/HANDOFF.md`. +- Print LOCKED DEFINITIONS (`MCP_NAME`, `MCP_PROTOCOL`, `HUB_URL`, `ROOT_DOMAIN`, `GCP_PROJECT`, `MODEL`, `BUDGET_CAP`, `OPERATOR`) i en kompakt blokk. +- Print siste `## NESTE OPPGAVE`-blokk fra `docs/HANDOFF.md` i én setning. +- Hvis ingen NESTE OPPGAVE → advar og les ROADMAP NOW-seksjon i stedet. - Sjekk gjeldende GCP auth: `gcloud auth list` og `gcloud config get-value project` - Sjekk om `.env` eksisterer: `ls -la .env` — hvis IKKE: rapporter til Chris umiddelbart, IKKE opprett den. ### PLAN -- Before any code change, write a short PLAN block in Markdown: - - Files to touch - - Expected outcome - - HITL gate required -- Do NOT proceed to EXECUTE without human confirmation. +- Før enhver kodeendring, skriv en kort PLAN-blokk i Markdown: + - Filer som berøres + - Forventet resultat + - HITL gate påkrevd +- IKKE gå til EXECUTE uten human bekreftelse. ### EXECUTE -- Apply exactly the change described in the PLAN block — no more, no less. -- Always show a full diff before writing any file. -- Never batch unrelated edits in a single EXECUTE step. +- Gjennomfør nøyaktig den endringen som er beskrevet i PLAN-blokken — ikke mer, ikke mindre. +- Vis alltid full diff før du skriver noen fil. +- Aldri batch urelaterte endringer i ett EXECUTE-steg. ### VERIFY -- Run the relevant verification command (`curl`, `gcloud`, `grep`, `git log`). -- State result explicitly as `PASS` or `FAIL`. -- If FAIL → **les loggene** → identifiser rot-årsak → rapport. +- Kjør relevant verifikasjonskommando (`curl`, `gcloud`, `grep`, `git log`). +- Angi resultatet eksplisitt som `PASS` eller `FAIL`. +- Ved FAIL → **les loggene** → identifiser rot-årsak → rapporter. - IKKE gå videre til LOG før VERIFY er PASS. ### LOG -- Append to `docs/OSVAUCO_OPAX_SESSION_LOG.md`: +- Append til `docs/OSVAUCO_OPAX_SESSION_LOG.md`: ``` - ## SLUTTRAPPORT – - - Hva: - - Filer: - - Verifisering: + ## SLUTTRAPPORT – + - Hva: + - Filer: + - Verifisering: ## NESTE OPPGAVE - + <én konkret neste oppgave> ``` ### NEXT -- At the next session start, read `## NESTE OPPGAVE` before doing anything else. +- Ved neste sesjonstart, les `## NESTE OPPGAVE` fra `docs/HANDOFF.md` før du gjør noe annet. --- ## Hard Rules -1. **Never change LOCK LIST values** without explicit human instruction. -2. **Always show diff before writing** any file. -3. **Never batch unrelated edits** in a single EXECUTE step. -4. **OPAX (`opax.vauco.no`) is management plane only** — it never receives raw patient data. -5. **Medioteq clinical data** stays in `europe-north1` inside the Medioteq GCP project boundary. -6. **Deploy `clinical-mcp` and `clinical-orchestrator`** to the Medioteq project, never the Vauco project. -7. **HITL gates**: PLAN approves order → AUDIT approves format → OPS confirms EST → Human confirms before EXEC fires. +1. **Aldri endre LOCK LIST-verdier** uten eksplisitt human instruksjon. +2. **Vis alltid diff før du skriver** noen fil. +3. **Aldri batch urelaterte endringer** i ett EXECUTE-steg. +4. **OPAX (`opax.vauco.no`) er kun management plane** — den mottar aldri rå pasientdata. +5. **Medioteq kliniske data** forblir i `europe-north1` innenfor Medioteq GCP-prosjektgrensen. +6. **Deploy `clinical-mcp` og `clinical-orchestrator`** til Medioteq-prosjektet, aldri Vauco-prosjektet. +7. **HITL gates**: PLAN godkjenner rekkefølge → AUDIT godkjenner format → OPS bekrefter EST → Human bekrefter før EXEC kjøres. 8. **Aldri søk på nett for å diagnostisere feil du kan lese i loggene.** 9. **Aldri anta at noe virker — verifiser alltid med en faktisk kommando.** 10. **Aldri gjett på koden — les den.** Du er i repoet. Bruk `cat`, `grep`, `git diff`. @@ -275,12 +258,12 @@ VERIFY: [kommando for å bekrefte fix] ### 🔴 Cloud Build feiler ```bash -BUILD_ID=$(gcloud builds list - --project=propane-will-491900-m5 - --limit=1 +BUILD_ID=$(gcloud builds list \ + --project=propane-will-491900-m5 \ + --limit=1 \ --format="value(id)") -gcloud builds log $BUILD_ID +gcloud builds log $BUILD_ID \ --project=propane-will-491900-m5 2>&1 | tail -100 ``` @@ -293,16 +276,16 @@ Vanlige årsaker: ### 🔴 Cloud Run svarer ikke / returnerer feil ```bash -gcloud run services describe osvauco-agent - --project=propane-will-491900-m5 - --region=europe-west1 +gcloud run services describe osvauco-agent \ + --project=propane-will-491900-m5 \ + --region=europe-west1 \ --format="value(status.conditions)" -gcloud logging read - 'resource.type=cloud_run_revision AND resource.labels.service_name=osvauco-agent' - --project=propane-will-491900-m5 - --limit=50 - --order=desc +gcloud logging read \ + 'resource.type=cloud_run_revision AND resource.labels.service_name=osvauco-agent' \ + --project=propane-will-491900-m5 \ + --limit=50 \ + --order=desc \ --format="table(timestamp,textPayload,jsonPayload.message)" ``` @@ -313,33 +296,12 @@ gcloud auth list gcloud config get-value project gcloud auth print-identity-token -gcloud iap web get-iam-policy - --project=propane-will-491900-m5 - --resource-type=cloud-run +gcloud iap web get-iam-policy \ + --project=propane-will-491900-m5 \ + --resource-type=cloud-run \ --service=osvauco-agent ``` -### 🔴 Claude / Vertex AI-feil - -```bash -# Test Claude Opus 4.6 via Vertex EU endpoint -curl -X POST - "https://eu-aiplatform.googleapis.com/v1/projects/propane-will-491900-m5/locations/eu/publishers/anthropic/models/claude-opus-4-6@20260801:rawPredict" - -H "Authorization: Bearer $(gcloud auth print-access-token)" - -H "Content-Type: application/json" - -d '{ - "anthropic_version": "vertex-2023-10-16", - "max_tokens": 256, - "messages": [{"role": "user", "content": "ping"}] - }' - -# Sjekk at Claude er aktivert i Model Garden -gcloud ai models list - --region=eu - --project=propane-will-491900-m5 - --filter="displayName:claude" -``` - ### 🔴 .env mangler ved oppstart ```bash @@ -360,7 +322,6 @@ find ~ -name ".env" -not -path "*/OSVauco/*" 2>/dev/null | Cloud Run 500 | `gcloud logging read` → les stack trace | Endre kode uten å se feilen | | Cloud Run 404 | `curl` + les rutekonfig | Anta routing er feil | | Auth 403 | `gcloud iap get-iam-policy` | Anta token er utløpt | -| Claude API feil | Test EU endpoint direkte med curl | Anta det er koden sin feil | | .env mangler | Rapporter til Chris, hent fra Secret Manager | Opprett fra .env.example | | Noe «virker ikke» | `gcloud run services describe` | Anta det er koden sin feil | @@ -377,10 +338,10 @@ IMAGE=gcr.io/propane-will-491900-m5/osvauco-agent gcloud builds submit --config=cloudbuild.yaml --project=propane-will-491900-m5 -gcloud run deploy osvauco-agent - --image=$IMAGE:latest - --project=propane-will-491900-m5 - --region=europe-west1 +gcloud run deploy osvauco-agent \ + --image=$IMAGE:latest \ + --project=propane-will-491900-m5 \ + --region=europe-west1 \ --platform=managed ``` @@ -400,15 +361,16 @@ Auth: Google OAuth now. BankID on `-os` later (Medioteq first). ## Standard Boot Prompt -Lim inn dette ved start av HVER sesjon: +> Lim inn dette ord-for-ord ved start av HVER sesjon. `Les og print innhold fra` tvinger faktisk fillesing — ikke bare skumming. ``` -BOOT: Read docs/AGENT_RULEBOOK.md, docs/MASTERPLAN.md, docs/ROADMAP.md, docs/HANDOFF.md. -Print LOCKED DEFINITIONS. Print NESTE OPPGAVE from HANDOFF.md. Do not take any action until I give a PLAN APPROVED prompt. +Les og print innhold fra: @docs/AGENT_RULEBOOK.md @docs/MASTERPLAN.md @docs/ROADMAP.md @docs/HANDOFF.md + +Deretter: +1. Print LOCKED DEFINITIONS (project, region, model, service, URLs) i en kompakt blokk +2. Oppsummer NESTE OPPGAVE fra HANDOFF.md i én setning +3. List 3 konkrete neste-steg du foreslår + +NIKT utfør noe — vent på PLAN APPROVED eller eksplisitt instruksjon. +Bekreft at du forstår ABSOLUTT REGEL: når Chris spesifiserer region/modell/parameter eksplisitt, bruk ALLTID den verdien — aldri overstyr med LOCKED DEFINITIONS. ``` - ---- - -## Boot-instruksjon - -BOOT: Les @docs/AGENT_RULEBOOK.md, @docs/MASTERPLAN.md, @docs/ROADMAP.md og @docs/HANDOFF.md. Print så LOCKED DEFINITIONS (project, region, model, service, URLs) i en kompakt blokk. Oppsummer NESTE OPPGAVE fra HANDOFF.md i én setning. List så 3 konkrete neste-steg du foreslår, men IKKE utfør noe — vent på at jeg svarer "PLAN APPROVED" eller gir en spesifikk instruksjon. Bekreft til slutt at du forstår ABSOLUTT REGEL #1. diff --git a/CLAUDE.md b/CLAUDE.md index 53ce517..c3179d2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -26,7 +26,7 @@ OPERATOR_ROLE: Eier, arkitekt og primær operatør av OSVauco / OS-Vauco > These values are LOCKED. Do NOT change without explicit human instruction. > -> **ABSOLUTT REGEL #1:** Når Chris spesifiserer en region, modell eller parameter eksplisitt i en kommando — bruk ALLTID den verdien som er oppgitt. Ikke overstyr med LOCKED DEFINITIONS. LOCKED DEFINITIONS gjelder kun når ingenting er spesifisert. +> **ABSOLUTT REGEL:** Når Chris spesifiserer en region, modell eller parameter eksplisitt i en kommando — bruk ALLTID den verdien som er oppgitt. Ikke overstyr med LOCKED DEFINITIONS. LOCKED DEFINITIONS gjelder kun når ingenting er spesifisert. --- @@ -208,9 +208,9 @@ VERIFY: [kommando for å bekrefte fix] ## Session Protocol (Nemotron Loop) ### BOOT -- Read `docs/AGENT_RULEBOOK.md`, `docs/MASTERPLAN.md`, `docs/ROADMAP.md` og `docs/HANDOFF.md`. +- Les og print innhold fra: `docs/AGENT_RULEBOOK.md`, `docs/MASTERPLAN.md`, `docs/ROADMAP.md`, `docs/HANDOFF.md`. - Print LOCKED DEFINITIONS kompakt. -- Print siste `## NESTE OPPGAVE` fra HANDOFF.md. +- Print siste `## NESTE OPPGAVE` fra `docs/HANDOFF.md` i én setning. - Hvis ingen NESTE OPPGAVE → advar og les ROADMAP NOW-seksjon. - Sjekk GCP auth: `gcloud auth list` og `gcloud config get-value project` - Sjekk om `.env` eksisterer: `ls -la .env` — hvis IKKE: rapporter til Chris umiddelbart, IKKE opprett den. @@ -246,7 +246,7 @@ VERIFY: [kommando for å bekrefte fix] ``` ### NEXT -- Ved neste sesjonstart, les `## NESTE OPPGAVE` før du gjør noe annet. +- Ved neste sesjonstart, les `## NESTE OPPGAVE` fra `docs/HANDOFF.md` før du gjør noe annet. --- @@ -317,18 +317,24 @@ gcloud iap web get-iam-policy \ ### 🔴 Claude / Vertex AI-feil ```bash -# Test Claude via Vertex EU endpoint curl -X POST \ "https://eu-aiplatform.googleapis.com/v1/projects/propane-will-491900-m5/locations/eu/publishers/anthropic/models/claude-opus-4-6:rawPredict" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ - -d '{ - "anthropic_version": "vertex-2023-10-16", - "max_tokens": 256, - "messages": [{"role": "user", "content": "ping"}] - }' + -d '{"anthropic_version": "vertex-2023-10-16", "max_tokens": 256, "messages": [{"role": "user", "content": "ping"}]}' ``` +### 🔴 .env mangler ved oppstart + +```bash +ls -la .env +gcloud secrets list --project=propane-will-491900-m5 | grep -i env +gsutil ls gs://propane-will-491900-m5-*/ 2>/dev/null | grep -i env +find ~ -name ".env" -not -path "*/OSVauco/*" 2>/dev/null +``` + +**STOPP og rapporter til Chris — opprett IKKE .env fra .env.example.** + --- ## GCP-konvensjoner for dette prosjektet @@ -353,8 +359,16 @@ gcloud run deploy osvauco-agent \ ## Standard Boot Prompt -Lim inn dette ved start av HVER sesjon i Claude Code TUI: +> Lim inn dette ord-for-ord ved start av HVER sesjon. `Les og print innhold fra` tvinger faktisk fillesing — ikke bare skumming. ``` -BOOT: Les @docs/AGENT_RULEBOOK.md, @docs/MASTERPLAN.md, @docs/ROADMAP.md og @docs/HANDOFF.md. Print LOCKED DEFINITIONS kompakt. Oppsummer NESTE OPPGAVE fra HANDOFF.md i én setning. Foreslå 3 konkrete neste-steg, men IKKE utfør noe — vent på PLAN APPROVED. Bekreft at du forstår ABSOLUTT REGEL #1. +Les og print innhold fra: @docs/AGENT_RULEBOOK.md @docs/MASTERPLAN.md @docs/ROADMAP.md @docs/HANDOFF.md + +Deretter: +1. Print LOCKED DEFINITIONS (project, region, model, service, URLs) i en kompakt blokk +2. Oppsummer NESTE OPPGAVE fra HANDOFF.md i én setning +3. List 3 konkrete neste-steg du foreslår + +Ikke utfør noe — vent på PLAN APPROVED eller eksplisitt instruksjon. +Bekreft at du forstår ABSOLUTT REGEL: når Chris spesifiserer region/modell/parameter eksplisitt, bruk ALLTID den verdien — aldri overstyr med LOCKED DEFINITIONS. ```