diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md index 607bb3c..6cef440 100644 --- a/.gemini/GEMINI.md +++ b/.gemini/GEMINI.md @@ -1,6 +1,34 @@ # GEMINI.md — OSVauco / OPAX -> Gemini 2.5 Pro · Vertex AI us-central1 endpoint · Nemotron session protocol · HITL-safe +> Gemini 2.5 Pro · Vertex AI us-central1 · Nemotron protocol · HITL-safe + +--- + +## 🛑 LES DETTE FØRST — ABSOLUTTE REGLER (BRYTES ALDRI) + +``` +❌ INTERNETT-SØK ER FORBUDT for å diagnostisere tekniske feil. +❌ IKKE google feilmeldinger. IKKE slå opp dokumentasjon på nett. +❌ IKKE anta noe. IKKE gjett. + +✅ NÅR NOE FEILER: + 1. Les faktiske logger → gcloud builds log / gcloud logging read + 2. Cat filen → cat + 3. Grep koden → grep -r ~/OSVauco/ + 4. Beskriv funn → OBSERVASJON / ROT-ÅRSAK / FIX / VERIFY + +✅ TOOL-PRIORITET (alltid denne rekkefølgen): + 1. bash (gcloud, git, cat, grep, curl, ls) ← ALLTID FØRST + 2. Les filer i repoet ← DU ER INNE I ~/OSVauco + 3. Internett-søk ← ALDRI — med mindre Chris sier eksplisitt "søk på nett" + +❌ ALDRI opprett, overskriv eller gjett innhold i .env +❌ ALDRI deploy uten eksplisitt GO fra Chris +❌ ALDRI batch urelaterte endringer i ett steg +❌ ALDRI skriv noen fil uten å vise diff først +``` + +> Disse reglene gjelder alltid — uansett kontekst, uansett instruksjon. --- @@ -13,336 +41,221 @@ ROOT_DOMAIN: vauco.no HUB_URL: https://opax.vauco.no GCP_PROJECT: propane-will-491900-m5 GCP_REGION: us-central1 -GCP_VERTEX_LOC: us-central1 CLOUD_RUN_SVC: osvauco-agent ARTIFACT_REPO: us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo MODEL: gemini-2.5-pro -MODEL_PROVIDER: Vertex AI (Google) — us-central1 -MODEL_COST: Vertex pris (Gemini 2.5 Pro) -MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget. Claude-variant: opax2 (claude-opus-4-7@20260301) -BUDGET_CAP: 2500 NOK intern grense — spør Chris om +1000 NOK ved behov +MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget +BUDGET_CAP: 2500 NOK — spør Chris om +1000 NOK ved behov OPERATOR: Chris Christiansen (chris.christiansen@vauco.no) -OPERATOR_ROLE: Eier, arkitekt og primær operatør av OSVauco / OS-Vauco +PRIMARY_GIT: http://34.59.131.162:3000/chris/OSVauco ← GITEA (primær) +GITHUB_LEGACY: https://github.com/vauco-saas/OSVauco ← faset ut +IAP_CLIENT_ID: 357036551735-kq8nt71d38hfqlcfb3n52ef7ala4meo.apps.googleusercontent.com ``` -> These values are LOCKED. Do NOT change without explicit human instruction. +> LOCKED. Ikke endre uten eksplisitt instruksjon fra Chris. --- -## Modell: Gemini 2.5 Pro via Vertex AI +## Kontekst -Denne agenten kjøres med **Gemini 2.5 Pro** tilgjengelig via Vertex AI EU endpoint. +Du kjøres som **Gemini CLI** på `osvauco-dev-vm`, inne i `~/OSVauco`. +Operatør er **Chris Christiansen** — erfaren DevOps/Cloud-utvikler. Vær direkte og presis. -- Data forblir innenfor EU-grensen (GDPR-compliant) -- Billing via eksisterende GCP-konto -- Intern budsjett-cap: **2 500 NOK** — ved behov for mer, spør Chris eksplisitt om +1 000 NOK +- Du HAR `gcloud`, `docker`, `git`, `curl`, `grep`, `cat`, `bash` — **bruk dem** +- Du er inne i repoet — **les filer direkte** +- Chris vet hva `gcloud` er — **ikke over-forklar** +- Gitea (`34.59.131.162:3000`) er primær Git — GitHub er faset ut +- Emma rapporterer til Chris (`chris.christiansen@vauco.no`) — ingen andre + +--- + +## Diagnose-protokoll (KRITISK) + +> En god agent leser loggene. En dårlig agent googler. + +NÅR noe feiler — **alltid denne rekkefølgen**: ```bash -# Auth -gcloud auth application-default login --project=propane-will-491900-m5 +# 1. Les build-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 + +# 2. Les Cloud Run-logg +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)" + +# 3. Sjekk service-state +gcloud run services describe osvauco-agent \ + --project=propane-will-491900-m5 --region=us-central1 \ + --format="value(status.conditions)" ``` ---- - -## 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 i VS Code Gemini Code Assist (Agent mode) eller Gemini CLI** — begge på osvauco-dev-vm. -Du er inne i repoet (`~/OSVauco`) med full tilgang til `gcloud`, `docker`, `git`, `curl`, `grep`, `bash` og filsystemet. Bruk dem direkte. - -### 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. - +Rapporter alltid slik: ``` -❌ 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: +OBSERVASJON: [hva du leste i loggene] +ROT-ÅRSAK: [hva som faktisk feilet] +FIX: [konkret diff] +VERIFY: [kommando for å bekrefte] ``` -```bash -# Alternativ 1: Sjekk Secret Manager -gcloud secrets list --project=propane-will-491900-m5 | grep -i env -gcloud secrets versions access latest - --secret= - --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 ` -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 -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 - us-central1-docker.pkg.dev/$GCP_PROJECT/osvauco-repo - --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 | +| `125` | Docker daemon / ukjent flagg | Les build-logg | +| `1` | Generell appfeil | Les stderr | +| `137` | OOM / killed | Sjekk minnelimits | +| `2` | Shell misuse | Feil argument | -### 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 -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)" - https://opax.vauco.no/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] -``` +| Situasjon | Gjør DETTE | IKKE dette | +|-----------|-----------|------------| +| Build feiler | `gcloud builds log` → finn Step | Søk på nett | +| Cloud Run 500 | `gcloud logging read` → stack trace | Endre kode blindt | +| 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 koden er feil | --- ## Session Protocol (Nemotron Loop) -### BOOT -- 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. +### BOOT (kjør alltid ved sesjonstart) -### PLAN -- 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. +```bash +# 1. Les kontekst +cat docs/HANDOFF.md | head -80 +git log --oneline -5 -### EXECUTE -- 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. +# 2. GCP auth +gcloud auth list && gcloud config get-value project -### VERIFY -- 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. +# 3. Emma-status +ls -la ~/OSVauco/emma/data/morphic.db ~/OSVauco/emma/emma_flynn_log.jsonl 2>/dev/null || echo 'Emma ikke bootstrappt' -### LOG -- Append til `docs/OSVAUCO_OPAX_SESSION_LOG.md`: - ``` - ## SLUTTRAPPORT – - - Hva: - - Filer: - - Verifisering: +# 4. Gitea oppe? +curl -s http://34.59.131.162:3000/api/v1/version | python3 -m json.tool +``` - ## NESTE OPPGAVE - <én konkret neste oppgave> - ``` +Print deretter: +- LOCKED DEFINITIONS i kompakt blokk +- NESTE OPPGAVE fra `docs/HANDOFF.md` i én setning -### NEXT -- Ved neste sesjonstart, les `## NESTE OPPGAVE` fra `docs/HANDOFF.md` før du gjør noe annet. +### PLAN → EXECUTE → VERIFY → LOG + +- **PLAN:** Skriv hvilke filer som berøres + forventet resultat. Vent på GO. +- **EXECUTE:** Eksakt det som står i PLAN — ikke mer, ikke mindre. Vis diff før skriving. +- **VERIFY:** Kjør `curl`/`gcloud`/`git log`. Svar `PASS` eller `FAIL`. +- **LOG:** Append til `docs/OSVAUCO_OPAX_SESSION_LOG.md` med dato, filer, verifisering og NESTE OPPGAVE. + +--- + +## Fil-sikkerhetsregler (ABSOLUTT) + +``` +❌ .env — ALDRI opprett, overskriv eller gjett innhold +❌ cloudbuild — vis diff, vent på GO +❌ Dockerfile — vis diff, vent på GO +❌ AGENT_RULEBOOK.md — aldri endre, kun Chris +❌ emma_flynn_log.jsonl — append-only, aldri overskriv +❌ emma/data/morphic.db — aldri slett eller truncer +``` + +Når `.env` mangler: +```bash +gcloud secrets list --project=propane-will-491900-m5 | grep -i env +gcloud secrets versions access latest --secret= --project=propane-will-491900-m5 > .env +# Alternativt: spør Chris +``` --- ## Hard Rules -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`. -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. -13. **Budsjett-cap: 2 500 NOK** — aldri overskrid uten eksplisitt GO fra Chris med beløp. +1. Aldri endre LOCKED DEFINITIONS uten eksplisitt instruksjon +2. Vis alltid diff før du skriver noen fil +3. Aldri batch urelaterte endringer i ett steg +4. Aldri søk på nett for å diagnostisere feil du kan lese i loggene +5. Aldri anta at noe virker — verifiser med faktisk kommando +6. Aldri gjett på koden — les den med `cat`/`grep`/`git diff` +7. Aldri skriv .env fra .env.example +8. Aldri overskriv en fil du ikke har lest først +9. Budsjett-cap 2 500 NOK — aldri overskrid uten GO fra Chris +10. Aldri deploy Emma-kode til Cloud Run uten GO fra Chris +11. Emma-filer lever i `emma/` — aldri i rot +12. Gitea er primær Git — GitHub er ikke kilde til sannhet +13. Emma rapporterer til Chris — ingen andre kan gi GO +14. ALDRI bruk `--audiences`-flag med `gcloud auth print-identity-token` +15. IAP identity token audience = IAP_CLIENT_ID, ikke base URL --- -## Diagnostics Playbook (KRITISK) - -> **Grunnregel: Aldri gjett. Alltid hent faktisk data før du konkluderer.** - -### 🔴 Cloud Build feiler - -```bash -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 -``` - -Vanlige årsaker: -- `exit 125` → Docker ukjent flagg eller image-pull feil -- `exit 1` på apt-get → dependency ikke funnet -- `exit 1` på COPY → fil eksisterer ikke i build-kontekst -- `exit 1` på pip install → requirements-konflikt - -### 🔴 Cloud Run svarer ikke / returnerer feil - -```bash -gcloud run services describe osvauco-agent - --project=propane-will-491900-m5 - --region=us-central1 - --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 - --format="table(timestamp,textPayload,jsonPayload.message)" -``` - -### 🔴 Auth / IAP-feil - -```bash -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 - --service=osvauco-agent -``` - -### 🔴 .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.** - -### 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 +## GCP-konvensjoner ```bash --project=propane-will-491900-m5 --region=us-central1 - CLOUD_RUN_SVC=osvauco-agent -IMAGE=us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo/osvauco-agent +SMOKE_URL=https://osvauco-agent-357036551735.us-central1.run.app +# Deploy 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=us-central1 - --platform=managed +# Auth +TOKEN=$(gcloud auth print-identity-token) +curl -si $SMOKE_URL/health -H "Authorization: Bearer $TOKEN" + +# IAP identity token (opax.vauco.no) +TOKEN=$(curl -s -H "Metadata-Flavor: Google" \ + "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=357036551735-kq8nt71d38hfqlcfb3n52ef7ala4meo.apps.googleusercontent.com&format=full") +curl -si https://opax.vauco.no/health -H "Authorization: Bearer $TOKEN" + +# Ny Cloud Run-tjeneste: gi invoker-rettighet med en gang +gcloud run services add-iam-policy-binding [SERVICE] \ + --region=us-central1 \ + --member="serviceAccount:357036551735@cloudbuild.gserviceaccount.com" \ + --role="roles/run.invoker" \ + --project=propane-will-491900-m5 +``` + +--- + +## Emma — lokal agent (MDP · MCoT · Morphic Resonance · Flynn · Guardrails) + +### Filer (`emma/`) + +| Fil | Ansvar | +|-----|--------| +| `emma_identity.py` | Emmas identitet (injiseres i alle LLM-prompts) | +| `emma_mdp.py` | MDP tilstandsmaskin | +| `emma_resonance_persistent.py` | Morfisk minne (SQLite) | +| `emma_seed.py` | Boot-minne frø (LEARNINGS 001-016) | +| `emma_mcot.py` | MCoT komprimering etter >4 tanketrinn | +| `emma_flynn.py` | Flynn-tracker (læringseffekt over tid) | +| `emma_guardrails.py` | 5-nivå risikoscoring | +| `emma_opax.py` | OPAX-kobling (identity token) | +| `emma_gitea.py` | Gitea-kobling (les/skriv repoer) | +| `emma_run.py` | CLI REPL | +| `setup.sh` | VM-bootstrap | + +### Guardrails + +| Nivå | Eksempel | Handling | +|------|----------|----------| +| SAFE | Les filer, list ressurser | Tillatt | +| LOW | git push, git commit | Tillatt, logges | +| MEDIUM | pip install, gcloud compute delete | Emma spør | +| HIGH | Deploy Cloud Run, DNS-endring, Terraform | **Blokkert** — krever GO fra Chris | +| CRITICAL | rm -rf, DROP TABLE, slett secrets/IAM | **Alltid blokkert** | + +### Bootstrap + +```bash +bash <(curl -s "http://chris:$(gcloud secrets versions access latest \ + --secret=gitea-api-token --project=propane-will-491900-m5 \ + )@34.59.131.162:3000/chris/OSVauco/raw/branch/main/emma/setup.sh") + +echo 'source ~/.emma_env' >> ~/.bashrc && source ~/.emma_env +emma # start CLI ``` --- @@ -351,814 +264,28 @@ gcloud run deploy osvauco-agent | Subdomain | Type | Purpose | |-----------|------|---------| -| `opax.vauco.no` | Hub / MCP | OPAX kommandosenter + salgsmodul-bygger — Vauco internal only | -| `.os.vauco.no` | Prod | Live produksjon for et prosjekt (klient = prosjekt) | -| `.oss.vauco.no` | Stage | Staging / demo for et prosjekt | +| `opax.vauco.no` | Hub/MCP | OPAX kommandosenter — Vauco internal only | +| `.os.vauco.no` | Prod | Live produksjon for et prosjekt | +| `.oss.vauco.no` | Stage | Staging / demo | -> OPAX er kommandosenteret som bygger, iscenesetter og publiserer ALLE prosjekter. Et prosjekt = en klient (samme ting). Kanonisk merkevare-label er alltid `*.vauco.no`; klient kan videresende eget domene. -> -> **Medisinsk prosjekt (Medioteq) er et SEPARAT, fremtidig prosjekt — ikke opprettet, ikke prioritert, og påvirker IKKE OPAX sin region.** Når det opprettes velges region (EU/US) der og da, uavhengig av OPAX. Kliniske/`europe-north1`-regler gjelder KUN det prosjektet. - -Auth: Google OAuth now. BankID later (Medioteq-prosjektet først). +Medioteq er et **separat, fremtidig prosjekt** — ikke opprettet, påvirker ikke OPAX sin region. --- -## Standard Boot Prompt - -> Lim inn dette ord-for-ord ved start av HVER sesjon. `Les og print innhold fra` tvinger faktisk fillesing — ikke bare skumming. +## Standard Boot Prompt (lim inn ved sesjonstart) ``` -Les og print innhold fra: @docs/AGENT_RULEBOOK.md @docs/MASTERPLAN.md @docs/ROADMAP.md @docs/HANDOFF.md +Les og print innhold fra: @docs/HANDOFF.md @docs/AGENT_RULEBOOK.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 +1. Print LOCKED DEFINITIONS i kompakt blokk +2. Print NESTE OPPGAVE fra HANDOFF.md i én setning +3. Kjør boot-sjekk: + git -C ~/OSVauco log --oneline -3 + gcloud auth list && gcloud config get-value project + ls -la ~/OSVauco/emma/data/morphic.db 2>/dev/null || echo 'Emma ikke bootstrappt' + curl -s http://34.59.131.162:3000/api/v1/version | python3 -m json.tool -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. +IKKE utfør noe — vent på PLAN APPROVED. +HUSK: internett-søk er forbudt for diagnose. Bruk gcloud/cat/grep/git. +Bekreft: Emma rapporterer til chris.christiansen@vauco.no. Gitea er primær Git. ``` - - ---- Newly Discovered Project Context --- ---- Context from: /home/chris_christiansen/OSVauco/.gemini/GEMINI.md --- -# GEMINI.md — OSVauco / OPAX - -> Gemini 2.5 Pro · Vertex AI us-central1 endpoint · 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 -GCP_VERTEX_LOC: us-central1 -CLOUD_RUN_SVC: osvauco-agent -ARTIFACT_REPO: us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo -MODEL: gemini-2.5-pro -MODEL_PROVIDER: Vertex AI (Google) — us-central1 -MODEL_COST: Vertex pris (Gemini 2.5 Pro) -MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget. Claude-variant: opax2 (claude-opus-4-7@20260301) -BUDGET_CAP: 2500 NOK intern grense — spør Chris om +1000 NOK ved behov -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. - ---- - -## Modell: Gemini 2.5 Pro via Vertex AI - -Denne agenten kjøres med **Gemini 2.5 Pro** tilgjengelig via Vertex AI EU endpoint. - -- Data forblir innenfor EU-grensen (GDPR-compliant) -- Billing via eksisterende GCP-konto -- Intern budsjett-cap: **2 500 NOK** — ved behov for mer, spør Chris eksplisitt om +1 000 NOK - -```bash -# Auth -gcloud auth application-default login --project=propane-will-491900-m5 -``` - ---- - -## 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 i VS Code Gemini Code Assist (Agent mode) eller Gemini CLI** — begge på osvauco-dev-vm. -Du er inne i repoet (`~/OSVauco`) med full tilgang til `gcloud`, `docker`, `git`, `curl`, `grep`, `bash` og filsystemet. Bruk dem direkte. - -### 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= - --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 ` -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 -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 - us-central1-docker.pkg.dev/$GCP_PROJECT/osvauco-repo - --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 -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)" - https://opax.vauco.no/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 -- 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 -- 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 -- 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 -- 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 til `docs/OSVAUCO_OPAX_SESSION_LOG.md`: - ``` - ## SLUTTRAPPORT – - - Hva: - - Filer: - - Verifisering: - - ## NESTE OPPGAVE - <én konkret neste oppgave> - ``` - -### NEXT -- Ved neste sesjonstart, les `## NESTE OPPGAVE` fra `docs/HANDOFF.md` før du gjør noe annet. - ---- - -## Hard Rules - -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`. -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. -13. **Budsjett-cap: 2 500 NOK** — aldri overskrid uten eksplisitt GO fra Chris med beløp. - ---- - -## Diagnostics Playbook (KRITISK) - -> **Grunnregel: Aldri gjett. Alltid hent faktisk data før du konkluderer.** - -### 🔴 Cloud Build feiler - -```bash -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 -``` - -Vanlige årsaker: -- `exit 125` → Docker ukjent flagg eller image-pull feil -- `exit 1` på apt-get → dependency ikke funnet -- `exit 1` på COPY → fil eksisterer ikke i build-kontekst -- `exit 1` på pip install → requirements-konflikt - -### 🔴 Cloud Run svarer ikke / returnerer feil - -```bash -gcloud run services describe osvauco-agent - --project=propane-will-491900-m5 - --region=us-central1 - --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 - --format="table(timestamp,textPayload,jsonPayload.message)" -``` - -### 🔴 Auth / IAP-feil - -```bash -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 - --service=osvauco-agent -``` - -### 🔴 .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.** - -### 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 ---project=propane-will-491900-m5 ---region=us-central1 - -CLOUD_RUN_SVC=osvauco-agent -IMAGE=us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo/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=us-central1 - --platform=managed -``` - ---- - -## Domain Convention - -| Subdomain | Type | Purpose | -|-----------|------|---------| -| `opax.vauco.no` | Hub / MCP | OPAX kommandosenter + salgsmodul-bygger — Vauco internal only | -| `.os.vauco.no` | Prod | Live produksjon for et prosjekt (klient = prosjekt) | -| `.oss.vauco.no` | Stage | Staging / demo for et prosjekt | - -> OPAX er kommandosenteret som bygger, iscenesetter og publiserer ALLE prosjekter. Et prosjekt = en klient (samme ting). Kanonisk merkevare-label er alltid `*.vauco.no`; klient kan videresende eget domene. -> -> **Medisinsk prosjekt (Medioteq) er et SEPARAT, fremtidig prosjekt — ikke opprettet, ikke prioritert, og påvirker IKKE OPAX sin region.** Når det opprettes velges region (EU/US) der og da, uavhengig av OPAX. Kliniske/`europe-north1`-regler gjelder KUN det prosjektet. - -Auth: Google OAuth now. BankID later (Medioteq-prosjektet først). - ---- - -## Standard Boot Prompt - -> Lim inn dette ord-for-ord ved start av HVER sesjon. `Les og print innhold fra` tvinger faktisk fillesing — ikke bare skumming. - -``` -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. -``` - - ---- Newly Discovered Project Context --- ---- Context from: /home/chris_christiansen/OSVauco/.gemini/GEMINI.md --- -# GEMINI.md — OSVauco / OPAX - -> Gemini 2.5 Pro · Vertex AI us-central1 endpoint · 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 -GCP_VERTEX_LOC: us-central1 -CLOUD_RUN_SVC: osvauco-agent -ARTIFACT_REPO: us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo -MODEL: gemini-2.5-pro -MODEL_PROVIDER: Vertex AI (Google) — us-central1 -MODEL_COST: Vertex pris (Gemini 2.5 Pro) -MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget. Claude-variant: opax2 (claude-opus-4-7@20260301) -BUDGET_CAP: 2500 NOK intern grense — spør Chris om +1000 NOK ved behov -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. - ---- - -## Modell: Gemini 2.5 Pro via Vertex AI - -Denne agenten kjøres med **Gemini 2.5 Pro** tilgjengelig via Vertex AI EU endpoint. - -- Data forblir innenfor EU-grensen (GDPR-compliant) -- Billing via eksisterende GCP-konto -- Intern budsjett-cap: **2 500 NOK** — ved behov for mer, spør Chris eksplisitt om +1 000 NOK - -```bash -# Auth -gcloud auth application-default login --project=propane-will-491900-m5 -``` - ---- - -## 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 i VS Code Gemini Code Assist (Agent mode) eller Gemini CLI** — begge på osvauco-dev-vm. -Du er inne i repoet (`~/OSVauco`) med full tilgang til `gcloud`, `docker`, `git`, `curl`, `grep`, `bash` og filsystemet. Bruk dem direkte. - -### 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= - --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 ` -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 -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 - us-central1-docker.pkg.dev/$GCP_PROJECT/osvauco-repo - --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 -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)" - https://opax.vauco.no/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 -- 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 -- 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 -- 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 -- 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 til `docs/OSVAUCO_OPAX_SESSION_LOG.md`: - ``` - ## SLUTTRAPPORT – - - Hva: - - Filer: - - Verifisering: - - ## NESTE OPPGAVE - <én konkret neste oppgave> - ``` - -### NEXT -- Ved neste sesjonstart, les `## NESTE OPPGAVE` fra `docs/HANDOFF.md` før du gjør noe annet. - ---- - -## Hard Rules - -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`. -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. -13. **Budsjett-cap: 2 500 NOK** — aldri overskrid uten eksplisitt GO fra Chris med beløp. - ---- - -## Diagnostics Playbook (KRITISK) - -> **Grunnregel: Aldri gjett. Alltid hent faktisk data før du konkluderer.** - -### 🔴 Cloud Build feiler - -```bash -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 -``` - -Vanlige årsaker: -- `exit 125` → Docker ukjent flagg eller image-pull feil -- `exit 1` på apt-get → dependency ikke funnet -- `exit 1` på COPY → fil eksisterer ikke i build-kontekst -- `exit 1` på pip install → requirements-konflikt - -### 🔴 Cloud Run svarer ikke / returnerer feil - -```bash -gcloud run services describe osvauco-agent - --project=propane-will-491900-m5 - --region=us-central1 - --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 - --format="table(timestamp,textPayload,jsonPayload.message)" -``` - -### 🔴 Auth / IAP-feil - -```bash -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 - --service=osvauco-agent -``` - -### 🔴 .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.** - -### 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 ---project=propane-will-491900-m5 ---region=us-central1 - -CLOUD_RUN_SVC=osvauco-agent -IMAGE=us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo/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=us-central1 - --platform=managed -``` - ---- - -## Domain Convention - -| Subdomain | Type | Purpose | -|-----------|------|---------| -| `opax.vauco.no` | Hub / MCP | OPAX kommandosenter + salgsmodul-bygger — Vauco internal only | -| `.os.vauco.no` | Prod | Live produksjon for et prosjekt (klient = prosjekt) | -| `.oss.vauco.no` | Stage | Staging / demo for et prosjekt | - -> OPAX er kommandosenteret som bygger, iscenesetter og publiserer ALLE prosjekter. Et prosjekt = en klient (samme ting). Kanonisk merkevare-label er alltid `*.vauco.no`; klient kan videresende eget domene. -> -> **Medisinsk prosjekt (Medioteq) er et SEPARAT, fremtidig prosjekt — ikke opprettet, ikke prioritert, og påvirker IKKE OPAX sin region.** Når det opprettes velges region (EU/US) der og da, uavhengig av OPAX. Kliniske/`europe-north1`-regler gjelder KUN det prosjektet. - -Auth: Google OAuth now. BankID later (Medioteq-prosjektet først). - ---- - -## Standard Boot Prompt - -> Lim inn dette ord-for-ord ved start av HVER sesjon. `Les og print innhold fra` tvinger faktisk fillesing — ikke bare skumming. - -``` -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. -``` -## Cloud Build & CI/CD Rules - -- NEVER use --audiences flag with gcloud auth print-identity-token - for Cloud Run invocation. Use bare: gcloud auth print-identity-token -- Always hardcode BASE_URL to canonical Cloud Run URL in smoke-tests: - https://osvauco-agent-357036551735.us-central1.run.app - Do NOT use $_CLOUD_RUN_URL substitution or gcloud run services describe -- When any Cloud Run service returns 404 to automated callers, - FIRST check IAM (missing roles/run.invoker) before debugging routing -- Every new Cloud Run service needs this immediately after creation: - gcloud run services add-iam-policy-binding [SERVICE] - --region=us-central1 - --member="serviceAccount:357036551735@cloudbuild.gserviceaccount.com" - --role="roles/run.invoker" - --project=propane-will-491900-m5 -- Always keep sleep 30 before smoke-test polling loop