294 lines
10 KiB
Markdown
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** på `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.
|
|
```
|