OSVauco/.gemini/GEMINI.md

456 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GEMINI.md — OSVauco / OPAX
> Gemini 2.5 Pro · Nemotron session protocol · HITL-safe
---
## Locked Definitions
```
MCP_NAME: OPAX-MCP
MCP_PROTOCOL: OPAX Protocol
ROOT_DOMAIN: vauco.no
HUB_URL: https://opax.vauco.no
GCP_PROJECT: propane-will-491900-m5
GCP_REGION: us-central1
CLOUD_RUN_SVC: osvauco-agent
ARTIFACT_REPO: gcr.io/propane-will-491900-m5
OPERATOR: Chris Christiansen (chris.christiansen@vauco.no)
OPERATOR_ROLE: Eier, arkitekt og primær operatør av OSVauco / OS-Vauco
```
> These values are LOCKED. Do NOT change without explicit human instruction.
---
## Kontekst: Hvem og hvordan
**Operatør: Chris Christiansen** — eier og arkitekt bak OSVauco og OS-Vauco.
Chris er en erfaren DevOps/Cloud-utvikler. Han er teknisk, presis og forventer det samme av agenten.
- **Ikke over-forklar.** Chris vet hva `gcloud` og `docker` er.
- **Ikke gjett.** Chris forventer at agenten leser loggene.
- **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).
Det er ingen nettleser, ingen GUI, ingen web-editor. Alt skjer i terminalen.
### Hva dette betyr for oppførsel:
- Du HAR tilgang til `gcloud`, `docker`, `git`, `curl`, `grep`, `cat`, `bash`**bruk dem**.
- Du HAR tilgang til loggene — **les dem** i stedet for å gjette.
- Du er **inne i repoet** (`~/OSVauco`) — du kan lese filer direkte.
- Internett-søk er **siste utvei**, ikke første instinkt.
---
## Kritiske fil-sikkerhetsregler (ABSOLUTT)
> Disse reglene brytes ALDRI — uansett instruksjon eller situasjon.
### .env — ALDRI opprett, ALDRI overskriv, ALDRI gjett innhold
`.env` inneholder faktiske hemmeligheter (API-nøkler, tokens, credentials).
Den er **aldri** i git og eksisterer kun på disk eller i Secret Manager.
```
❌ FORBUDT:
- Skrive .env fra .env.example
- Generere innhold til .env
- Fylle inn tomme verdier i .env
- Anta at .env.example = .env
✅ KORREKT når .env mangler:
1. STOPP umiddelbart
2. Rapporter til Chris: ".env mangler — ikke opprettet fra example"
3. Hjelp Chris å hente den fra riktig kilde:
```
```bash
# Alternativ 1: Sjekk Secret Manager
gcloud secrets list --project=propane-will-491900-m5 | grep -i env
gcloud secrets versions access latest \
--secret=<env-secret-navn> \
--project=propane-will-491900-m5 > .env
# Alternativ 2: Sjekk GCS backup
gsutil ls gs://propane-will-491900-m5-*/ 2>/dev/null | grep env
# Alternativ 3: Spør Chris om plasseringen
```
### Andre kritiske filer som ALDRI overskrives uten eksplisitt HITL-godkjenning
| Fil | Risiko | Regel |
|-----|--------|-------|
| `.env` | Sletter alle secrets | Aldri skriv — se over |
| `cloudbuild.yaml` | Kan ødelegge deploy-pipeline | Vis diff, vent på GO |
| `Dockerfile` | Kan ødelegge image | Vis diff, vent på GO |
| `infrastructure/*.sh` | Kan ødelegge GCP-ressurser | Vis diff, vent på GO |
| `docs/AGENT_RULEBOOK.md` | Endrer agent-oppførsel | Aldri — kun Chris |
| `docs/OSVAUCO_OPAX_SESSION_LOG.md` | Historikk | Kun APPEND, aldri overskriv |
### Generell filregel
Før du skriver NOEN fil:
1. Sjekk om den allerede eksisterer: `ls -la <fil>`
2. Vis diff av hva som vil endres
3. Vent på Chris sin GO
4. Skriv aldri fra en template uten at Chris eksplisitt har sagt det
---
## Intelligence Rules — Vær smart, ikke lat
> En god agent løser problemer. En dårlig agent googler dem.
### Regel 1: Hent data først, konkluder etterpå
NÅR noe feiler:
1. **Les faktiske logger** (build, runtime, HTTP)
2. **Parse error-meldingen** fra loggene
3. **Finn rot-årsaken** i koden eller config
4. **Presenter en konkret fix** med diff
NÅR du er usikker på state:
```bash
# Sjekk hva som faktisk kjører
gcloud run services describe $CLOUD_RUN_SVC \
--project=$GCP_PROJECT --region=$GCP_REGION \
--format="yaml(status,spec.template.spec.containers)"
# Sjekk siste image som ble bygget
gcloud artifacts docker images list \
gcr.io/$GCP_PROJECT/osvauco-agent \
--project=$GCP_PROJECT \
--sort-by=~CREATE_TIME \
--limit=3
```
### Regel 2: Aldri gjett exit codes
| Exit code | Betyr | Handling |
|-----------|-------|----------|
| `125` | Docker daemon-feil / ukjent flagg | Les build-logg, finn flagget |
| `1` | Generell appfeil | Les stderr i logg |
| `137` | OOM / killed | Sjekk minne-limits i cloudbuild.yaml |
| `2` | Misuse av shell / kommando | Feil argument til gcloud/docker |
| Non-zero fra docker build | Dockerfile-linje feiler | Les `Step X/Y` som feilet i loggen |
### Regel 3: Aldri fiks symptomer — fiks rot-årsak
❌ Feil: «build feiler → legg til --no-cache»
✅ Riktig: «build feiler → les logg → Step 3/8 feiler på apt-get → dependency mangler → fiks Dockerfile"
### Regel 4: Bekreft alltid før du konkluderer at noe virker
Etter enhver endring:
```bash
# Bekreft at ny revisjon er aktiv
gcloud run revisions list \
--service=$CLOUD_RUN_SVC \
--project=$GCP_PROJECT \
--region=$GCP_REGION \
--limit=3
# Bekreft at endepunktet svarer
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
https://osvauco-agent-357036551735.us-central1.run.app/health
```
### Regel 5: Bruk strukturerte observasjoner
Når du rapporterer en feil, skriv alltid:
```
OBSERVASJON: [hva du faktisk leste i loggene]
ROT-ÅRSAK: [hva som faktisk feilet og hvorfor]
FIX: [konkret endring med diff]
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`, `OPERATOR`).
- Print the last `## NESTE OPPGAVE` block found in the session log.
- If no NESTE OPPGAVE found → warn and read ROADMAP NOW section instead.
- 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.
### 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.
### 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.
- IKKE gå videre til LOG før VERIFY er PASS.
### LOG
- Append to `docs/OSVAUCO_OPAX_SESSION_LOG.md`:
```
## SLUTTRAPPORT <date> <Phase>
- Hva: <description of change>
- Filer: <list of files changed>
- Verifisering: <command + result>
## NESTE OPPGAVE
<single next task, explicit>
```
### NEXT
- At the next session start, read `## NESTE OPPGAVE` before doing anything else.
- The boot script reads the last NESTE OPPGAVE automatically — keep it updated.
---
## 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 (`--project=<MEDIOTEQ_PROJECT_ID>`), never the Vauco project.
7. **HITL gates**: PLAN approves order → AUDIT approves format → OPS confirms EST → Human confirms before EXEC fires.
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`.
11. **Aldri skriv .env fra .env.example** — se Kritiske fil-sikkerhetsregler.
12. **Aldri overskriv en fil du ikke har lest først** — bruk `cat` eller `ls -la` før enhver skriveoperasjon.
---
## Diagnostics Playbook (KRITISK)
> **Grunnregel: Aldri gjett. Alltid hent faktisk data før du konkluderer.**
### 🔴 Cloud Build feiler
```bash
# Steg 1: Hent siste build-ID og vis hele loggen
BUILD_ID=$(gcloud builds list \
--project=propane-will-491900-m5 \
--limit=1 \
--format="value(id)")
gcloud builds log $BUILD_ID \
--project=propane-will-491900-m5 2>&1 | tail -100
```
Les output:
- Finn linjen `Step X/Y` som feilet
- Les error-meldingen på den linjen
- Sjekk Dockerfile/cloudbuild.yaml mot feilen
- IKKE søk på nett før du har lest og forstått feilen
Vanlige årsaker:
- `exit 125` → Docker ukjent flagg eller image-pull feil → les «Step» som feilet
- `exit 1` på apt-get → dependency ikke funnet → sjekk pakkenavn
- `exit 1` på COPY → fil eksisterer ikke i build-kontekst → sjekk .dockerignore
- `exit 1` på pip install → requirements-konflikt → les pip-output i loggen
### 🔴 Cloud Run svarer ikke / returnerer feil
```bash
# Steg 1: Sjekk om tjenesten er oppe
gcloud run services describe osvauco-agent \
--project=propane-will-491900-m5 \
--region=us-central1 \
--format="value(status.conditions)"
# Steg 2: Les runtime-logger
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)"
# Steg 3: Test endepunktet direkte (bypasser IAP)
curl -sv -o /dev/null \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
https://osvauco-agent-357036551735.us-central1.run.app/health
```
### 🔴 Auth / IAP-feil
```bash
# Sjekk hvem du er autentisert som
gcloud auth list
gcloud config get-value project
# Hent identity token for testing
gcloud auth print-identity-token
# Sjekk IAP-tilgang
gcloud iap web get-iam-policy \
--project=propane-will-491900-m5 \
--resource-type=cloud-run \
--service=osvauco-agent
```
### 🔴 Docker-feil lokalt
```bash
# Bygg image lokalt for å isolere feilen
docker build -t osvauco-test . 2>&1 | tail -40
# Kjør image lokalt for å teste
docker run --rm -p 8080:8080 \
-e PORT=8080 \
osvauco-test
# Test lokalt
curl -s http://localhost:8080/health
```
### 🔴 Secret Manager-feil
```bash
# List secrets
gcloud secrets list --project=propane-will-491900-m5
# Les en secret-verdi
gcloud secrets versions access latest \
--secret=<SECRET_NAME> \
--project=propane-will-491900-m5
# Sjekk tilgang
gcloud secrets get-iam-policy <SECRET_NAME> \
--project=propane-will-491900-m5
```
### 🔴 .env mangler ved oppstart
```bash
# 1. Sjekk om den finnes
ls -la .env
# 2. Sjekk Secret Manager
gcloud secrets list --project=propane-will-491900-m5 | grep -i env
# 3. Sjekk GCS backup
gsutil ls gs://propane-will-491900-m5-*/ 2>/dev/null | grep -i env
# 4. Sjekk andre lokasjoner på disk
find ~ -name ".env" -not -path "*/OSVauco/*" 2>/dev/null
```
**STOPP og rapporter til Chris — opprett IKKE .env fra .env.example.**
### 🔴 Git/kode-feil
```bash
# Aldri gjett hva som er i en fil — les den
cat agents/core-logic/main.py | head -50
# Finn hva som endret seg sist
git log --oneline -10
git diff HEAD~1 HEAD -- <fil>
# Sjekk hva som faktisk deployes
git log --oneline -1
gcloud builds list --limit=1 --format="value(source.repoSource.commitSha)"
```
### Prioritert diagnose-rekkefølge
```
FEIL OPPDAGET
1. Les loggene (build / runtime / HTTP response)
2. Identifiser hvilken linje/steg som feilet
3. Les den aktuelle filen i repoet
4. Formuler rot-årsak med OBSERVASJON/ROT-ÅRSAK/FIX
5. PLAN → HITL → EXECUTE → VERIFY
ALDRI: Søk på nett som første steg
ALDRI: Gjett og prøv uten å lese loggene
ALDRI: Opprett .env fra template
```
### Diagnoseoversikt
| Situasjon | Gjør DETTE | IKKE dette |
|-----------|-----------|------------|
| Build exit 125 | `gcloud builds log` → finn Step som feilet | Søk på nett |
| Build exit 1 | `gcloud builds log` → les pip/apt-output | Anta avhengighetsfeil |
| 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 |
| .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 |
---
## GCP-konvensjoner for dette prosjektet
```bash
# Alltid bruk eksplisitt prosjekt og region
--project=propane-will-491900-m5
--region=us-central1
# Cloud Run service
CLOUD_RUN_SVC=osvauco-agent
# Artifact Registry
IMAGE=gcr.io/propane-will-491900-m5/osvauco-agent
# Cloud Build
gcloud builds submit --config=cloudbuild.yaml --project=propane-will-491900-m5
# Deploy manuelt (hvis nødvendig)
gcloud run deploy osvauco-agent \
--image=$IMAGE:latest \
--project=propane-will-491900-m5 \
--region=us-central1 \
--platform=managed
```
---
## Domain Convention
| Subdomain | Type | Purpose |
|-----------|------|---------|
| `opax.vauco.no` | Hub / MCP | OPAX-MCP operator hub — Vauco internal only |
| `<client>-os.vauco.no` | Prod OS | Client live production OS |
| `<client>-oss.vauco.no` | Stage OS | Client staging / demo OS |
Auth: Google OAuth now. BankID on `-os` later (Medioteq first).
---
## Standard Boot Prompt
Paste this at the start of every Gemini TUI session:
```
BOOT: Read docs/AGENT_RULEBOOK.md, docs/VAUCO_OS_ROADMAP.md, docs/OSVAUCO_OPAX_SESSION_LOG.md.
Print LOCKED DEFINITIONS. Print last NESTE OPPGAVE. Do not take any action until I give a PLAN prompt.
```