OSVauco/.gemini/GEMINI.md

294 lines
10 KiB
Markdown

# GEMINI.md — OSVauco / OPAX
> 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 <fil>
3. Grep koden → grep -r <nøkkelord> ~/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.
---
## 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: us-central1-docker.pkg.dev/propane-will-491900-m5/osvauco-repo
MODEL: gemini-2.5-pro
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)
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-kq8nt7ld38hfqlcfb3n52ef7tala4meo.apps.googleusercontent.com
```
> LOCKED. Ikke endre uten eksplisitt instruksjon fra Chris.
---
## Kontekst
Du kjøres som **Gemini CLI**`osvauco-dev-vm`, inne i `~/OSVauco`.
Operatør er **Chris Christiansen** — erfaren DevOps/Cloud-utvikler. Vær direkte og presis.
- 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
# 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)"
```
Rapporter alltid slik:
```
OBSERVASJON: [hva du leste i loggene]
ROT-ÅRSAK: [hva som faktisk feilet]
FIX: [konkret diff]
VERIFY: [kommando for å bekrefte]
```
| Exit code | Betyr | Handling |
|-----------|-------|----------|
| `125` | Docker daemon / ukjent flagg | Les build-logg |
| `1` | Generell appfeil | Les stderr |
| `137` | OOM / killed | Sjekk minnelimits |
| `2` | Shell misuse | Feil argument |
| 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 (kjør alltid ved sesjonstart)
```bash
# 1. Les kontekst
cat docs/HANDOFF.md | head -80
git log --oneline -5
# 2. GCP auth
gcloud auth list && gcloud config get-value project
# 3. Emma-status
ls -la ~/OSVauco/emma/data/morphic.db ~/OSVauco/emma/emma_flynn_log.jsonl 2>/dev/null || echo 'Emma ikke bootstrappt'
# 4. Gitea oppe?
curl -s http://34.59.131.162:3000/api/v1/version | python3 -m json.tool
```
Print deretter:
- LOCKED DEFINITIONS i kompakt blokk
- NESTE OPPGAVE fra `docs/HANDOFF.md` i én setning
### 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=<navn> --project=propane-will-491900-m5 > .env
# Alternativt: spør Chris
```
---
## Hard Rules
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 fra metadata server, ikke base URL
16. IAP_CLIENT_ID hentes alltid fra: `gcloud run services describe opax-mcp --format="value(spec.template.spec.containers[0].env)"`
---
## GCP-konvensjoner
```bash
--project=propane-will-491900-m5
--region=us-central1
CLOUD_RUN_SVC=osvauco-agent
SMOKE_URL=https://osvauco-agent-357036551735.us-central1.run.app
# Deploy
gcloud builds submit --config=cloudbuild.yaml --project=propane-will-491900-m5
# Auth — Cloud Run (user account OK)
TOKEN=$(gcloud auth print-identity-token)
curl -si $SMOKE_URL/health -H "Authorization: Bearer $TOKEN"
# Auth — IAP Load Balancer opax.vauco.no (MUST use metadata server + SA token)
TOKEN=$(curl -s -H "Metadata-Flavor: Google" \
"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=357036551735-kq8nt7ld38hfqlcfb3n52ef7tala4meo.apps.googleusercontent.com&format=full")
curl -si https://opax.vauco.no/health -H "Authorization: Bearer $TOKEN"
# Forventet: HTTP/2 200
# 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
```
---
## Domain Convention
| Subdomain | Type | Purpose |
|-----------|------|---------|
| `opax.vauco.no` | Hub/MCP | OPAX kommandosenter — Vauco internal only |
| `<prosjekt>.os.vauco.no` | Prod | Live produksjon for et prosjekt |
| `<prosjekt>.oss.vauco.no` | Stage | Staging / demo |
Medioteq er et **separat, fremtidig prosjekt** — ikke opprettet, påvirker ikke OPAX sin region.
---
## Standard Boot Prompt (lim inn ved sesjonstart)
```
Les og print innhold fra: @docs/HANDOFF.md @docs/AGENT_RULEBOOK.md
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
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.
```