14 KiB
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
gcloudogdockerer. - 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:
# 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:
- Sjekk om den allerede eksisterer:
ls -la <fil> - Vis diff av hva som vil endres
- Vent på Chris sin GO
- 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:
- Les faktiske logger (build, runtime, HTTP)
- Parse error-meldingen fra loggene
- Finn rot-årsaken i koden eller config
- Presenter en konkret fix med diff
NÅR du er usikker på state:
# 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:
# 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, anddocs/OSVAUCO_OPAX_SESSION_LOG.md. - Print LOCKED DEFINITIONS (
MCP_NAME,MCP_PROTOCOL,HUB_URL,ROOT_DOMAIN,GCP_PROJECT,OPERATOR). - Print the last
## NESTE OPPGAVEblock found in the session log. - If no NESTE OPPGAVE found → warn and read ROADMAP NOW section instead.
- Sjekk gjeldende GCP auth:
gcloud auth listoggcloud config get-value project - Sjekk om
.enveksisterer: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
PASSorFAIL. - 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 OPPGAVEbefore doing anything else. - The boot script reads the last NESTE OPPGAVE automatically — keep it updated.
Hard Rules
- Never change LOCK LIST values without explicit human instruction.
- Always show diff before writing any file.
- Never batch unrelated edits in a single EXECUTE step.
- OPAX (
opax.vauco.no) is management plane only — it never receives raw patient data. - Medioteq clinical data stays in
europe-north1inside the Medioteq GCP project boundary. - Deploy
clinical-mcpandclinical-orchestratorto the Medioteq project (--project=<MEDIOTEQ_PROJECT_ID>), never the Vauco project. - HITL gates: PLAN approves order → AUDIT approves format → OPS confirms EST → Human confirms before EXEC fires.
- Aldri søk på nett for å diagnostisere feil du kan lese i loggene.
- Aldri anta at noe virker — verifiser alltid med en faktisk kommando.
- Aldri gjett på koden — les den. Du er i repoet. Bruk
cat,grep,git diff. - Aldri skriv .env fra .env.example — se Kritiske fil-sikkerhetsregler.
- Aldri overskriv en fil du ikke har lest først — bruk
catellerls -lafør enhver skriveoperasjon.
Diagnostics Playbook (KRITISK)
Grunnregel: Aldri gjett. Alltid hent faktisk data før du konkluderer.
🔴 Cloud Build feiler
# 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/Ysom 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 feiletexit 1på apt-get → dependency ikke funnet → sjekk pakkenavnexit 1på COPY → fil eksisterer ikke i build-kontekst → sjekk .dockerignoreexit 1på pip install → requirements-konflikt → les pip-output i loggen
🔴 Cloud Run svarer ikke / returnerer feil
# 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
# 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
# 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
# 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
# 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
# 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
# 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.