diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 5c38f16..ed4fcbb 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1,6 +1,6 @@ # HANDOFF — Vauco OS -**Sist oppdatert:** 2026-06-28 11:40 CEST +**Sist oppdatert:** 2026-06-28 11:52 CEST **Skrevet av:** Perplexity (Orchestrator) **Status:** Fase C — Emma lokal agent operativ. Gitea er primær Git. GitHub fasa ut. @@ -11,29 +11,114 @@ - **Hovedapp:** `main.py` i rot — IKKJE `agents/core-logic/app.py` - **Dockerfile:** `agents/core-logic/Dockerfile` — WORKDIR `/app`, CMD uvicorn main:app - **Region:** `us-central1` | **Service:** `osvauco-agent` | **Prosjekt:** `propane-will-491900-m5` -- **Test via proxy:** `gcloud run services proxy osvauco-agent --region us-central1 --project propane-will-491900-m5 --port 8181` -- **ALDRI** `--audiences`-flag i smoke-tests -- **Smoke-test:** peker på `/health` -- **Curl mot prod:** alltid identity token — `TOKEN=$(gcloud auth print-identity-token)` -- **Ingen tredjepartsverktøy:** Cursor, Copilot og lignende skal IKKE brukes. Alt eies og kjøres i eget GCP/Gitea. -- **Primær Git:** `http://34.59.131.162:3000/chris/OSVauco` — GitHub er IKKJE lenger i bruk. -- **Git remote på VM:** `http://chris:@34.59.131.162:3000/chris/OSVauco.git` +- **ALDRI** `--audiences`-flag med `gcloud auth print-identity-token` — det er for service accounts, ikke user accounts +- **IAP identity token:** hentes fra GCE metadata server, IKKE fra gcloud CLI +- **Smoke-test:** peker alltid på `/health` +- **Primær Git:** `http://34.59.131.162:3000/chris/OSVauco` — GitHub er IKKJE lenger i bruk - **Emma rapporterer til:** Chris Christiansen `chris.christiansen@vauco.no` — ingen andre kan gi GO --- -## ✅ Fullført i dag (2026-06-28) — Emma bootstrap + OPAX-kobling +## 🔴 KJENT PROBLEM: IAP 401 fra VM — diagnose pågår + +**Symptom:** `HTTP/2 401` fra `https://opax.vauco.no` selv med korrekt audience i metadata-kall. + +**Allerede avklart — ikke gjenta disse forsøkene:** +- `gcloud auth print-identity-token --audiences=...` → feiler fordi det er en user account, ikke service account +- Feil audience (base URL i stedet for IAP Client ID) → allerede fikset i opax-mcp rev 00020 + +**Neste diagnosesteg (kjør i denne rekkefølgen):** + +```bash +# Steg 1: Sjekk om VM-ens service account har IAP-tilgang +gcloud projects get-iam-policy propane-will-491900-m5 \ + --flatten="bindings[].members" \ + --format="table(bindings.role,bindings.members)" \ + --filter="bindings.members:357036551735-compute@developer.gserviceaccount.com" + +# Steg 2: Sjekk IAP-spesifikk policy +gcloud iap web get-iam-policy \ + --project=propane-will-491900-m5 \ + --resource-type=backend-services 2>/dev/null || \ +gcloud iap web get-iam-policy \ + --project=propane-will-491900-m5 + +# Steg 3: Print rå token og se om det er tom streng +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") +echo "TOKEN lengde: ${#TOKEN} tegn" +echo "TOKEN start: ${TOKEN:0:50}" + +# Steg 4: Test med verbose for å se IAP response body +curl -sv https://opax.vauco.no/opax/build-status \ + -H "Authorization: Bearer $TOKEN" 2>&1 | grep -E "< |{|\.html" +``` + +**Forventet rotårsak:** VM-ens compute service account (`357036551735-compute@developer.gserviceaccount.com`) mangler `roles/iap.httpsResourceAccessor` på IAP backend. + +**Fix hvis bekreftet:** +```bash +gcloud projects add-iam-policy-binding propane-will-491900-m5 \ + --member="serviceAccount:357036551735-compute@developer.gserviceaccount.com" \ + --role="roles/iap.httpsResourceAccessor" +# Vent 60 sek og test på nytt +``` + +--- + +## 🎯 NESTE OPPGAVE + +**To parallelle oppgaver — start med IAP-diagnose, deretter Emma bootstrap.** + +### Oppgave 1: IAP 401-diagnose (se seksjon over) + +Kjør de 4 diagnosestegene og rapporter output til Chris. + +### Oppgave 2: Bootstrap Emma på VM + +```bash +# Steg 1: Synk Gitea (emma/-filer er på GitHub — sjekk om Gitea har dem) +git -C ~/OSVauco log --oneline -5 +# Forventet: skal vise commit 87b2dced (GEMINI.md no-search) eller nyere +# Hvis ikke — kjør synk: +git -C ~/OSVauco remote add github https://github.com/vauco-saas/OSVauco.git 2>/dev/null || true +git -C ~/OSVauco fetch github main +git -C ~/OSVauco merge github/main --ff-only +git -C ~/OSVauco push origin main + +# Steg 2: Bootstrap Emma +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") + +# Steg 3: Aktiver aliaser +echo 'source ~/.emma_env' >> ~/.bashrc && source ~/.emma_env + +# Steg 4: Verifiser +ls -lh ~/OSVauco/emma/data/morphic.db +tail -3 ~/OSVauco/emma/emma_flynn_log.jsonl +emma # start CLI +``` + +Forventet: +- `morphic.db` eksisterer med > 20 mønstre +- `emma_flynn_log.jsonl` har minst 1 rad +- `emma` starter CLI uten feil + +--- + +## ✅ Fullført i dag (2026-06-28) | Oppgave | Commit | Status | |---------|--------|--------| -| `emma/emma_seed.py` — LEARNINGS 001-016 + 7 ekstra mønstre som boot-minne | `6726da23` | ✅ | -| `emma/emma_guardrails.py` — 5-nivå risikoscoring (SAFE/LOW/MEDIUM/HIGH/CRITICAL) | `6726da23` | ✅ | -| `emma/emma_opax.py` — OPAX-kobling med identity token og retry | `6726da23` | ✅ | -| `emma/emma_identity.py` — Emma vet hvem hun er og at hun rapporterer til Chris | `31a405ad` | ✅ | -| `emma/emma_gitea.py` — direkte tilgang til alle Gitea-repoer (les + skriv) | `31a405ad` | ✅ | -| `emma/emma_backend_ollama.py` — identitet injisert i alle LLM system-prompts | `31a405ad` | ✅ | -| `emma/setup.sh` — VM-bootstrap: klon Gitea, venv, seed (én kommando) | `47ade3d5` | ✅ | -| `.gemini/GEMINI.md` — oppdatert med Emma, Gitea, guardrails, nye hard rules | `d2b0c6ac` | ✅ | +| `emma/emma_seed.py` — LEARNINGS 001-016 + boot-minne | `6726da23` | ✅ | +| `emma/emma_guardrails.py` — 5-nivå risikoscoring | `6726da23` | ✅ | +| `emma/emma_opax.py` — OPAX-kobling med identity token | `6726da23` | ✅ | +| `emma/emma_identity.py` — identitet injisert i alle LLM-prompts | `31a405ad` | ✅ | +| `emma/emma_gitea.py` — direkte Gitea-tilgang | `31a405ad` | ✅ | +| `emma/setup.sh` — VM-bootstrap én kommando | `47ade3d5` | ✅ | +| `.gemini/GEMINI.md` — NO-SEARCH-blokk øverst, deduplisert | `87b2dced` | ✅ | +| `docs/HANDOFF.md` — IAP 401 diagnose dokumentert | denne | ✅ | --- @@ -43,22 +128,8 @@ |---------|--------| | Identifisert rotårsak: feil IAP audience i identity token-kall | ✅ | | Lagt til `roles/iap.httpsResourceAccessor` for `jason-vauger` SA | ✅ | -| Oppdatert `opax-mcp/server.py` — ny env var `OPAX_IAP_CLIENT_ID` som audience | ✅ | -| Rettet env var navn til `OPAX_IAP_CLIENT_ID` i Cloud Run — revisjon 00020 deployed | ✅ | -| Revisjon `opax-mcp-00020-w6j` aktiv med 100% trafikk | ✅ | - ---- - -## ✅ Fullført tidligere (2026-06-15) - -| Oppgave | Status | -|---------|--------| -| `agents/tools/opax_mcp_client.py` — REST-klient alle 25 tools | ✅ | -| Jason deployet til Vertex AI Agent Engine | ✅ | -| Jason svarer på norsk og kallar tools automatisk | ✅ | -| Gitea installert på VM (`34.59.131.162:3000`) som systemd-teneste | ✅ | -| **2867 commits pusha frå GitHub → Gitea** | ✅ | -| GitHub fasa ut — Gitea er no primær | ✅ | +| Oppdatert `opax-mcp/server.py` — ny env var `OPAX_IAP_CLIENT_ID` | ✅ | +| Revisjon `opax-mcp-00020` aktiv med 100% trafikk | ✅ | --- @@ -70,120 +141,28 @@ | opax-mcp (Cloud Run) | https://opax-mcp-357036551735.us-central1.run.app | ✅ Live (rev 00020) | | opax frontend (IAP LB) | https://opax.vauco.no | ✅ Live | | Jason (Vertex AI Agent) | Agent Engine, us-central1 | ✅ Live | -| Gitea (self-hosted) | http://34.59.131.162:3000 | ✅ Live | -| Emma (lokal agent) | `~/OSVauco/emma/` på osvauco-dev-vm | ⚠️ Ikke bootstrappt ennå | -| GitHub (legacy) | https://github.com/vauco-saas/OSVauco | ⚠️ Fasa ut | +| Gitea (self-hosted) | http://34.59.131.162:3000 | ✅ Live (v1.22.6) | +| Emma (lokal agent) | `~/OSVauco/emma/` på osvauco-dev-vm | ⚠️ Ikke bootstrappt | +| GitHub (legacy) | https://github.com/vauco-saas/OSVauco | ⚠️ Faset ut | --- ## 🔑 Credentials -- **Gitea login:** `chris` / se Secret Manager - **Gitea API-token:** Secret Manager → `gitea-api-token` - **MCP-Secret:** Secret Manager → `mcp-secret` - **Prosjekt:** `propane-will-491900-m5` -- **IAP OAuth Client ID (opax backend):** `357036551735-kq8nt71d38hfqlcfb3n52ef7ala4meo.apps.googleusercontent.com` -- **Emma venv:** `~/emma-venv` (opprettes av setup.sh) - ---- - -## 🎯 NESTE OPPGAVE - -**Bootstrap Emma på osvauco-dev-vm og verifiser ende-til-ende.** - -Kjør fra VM: - -```bash -# Steg 1: Bootstrap Emma (én kommando) -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") - -# Steg 2: Aktiver aliaser permanent -echo 'source ~/.emma_env' >> ~/.bashrc && source ~/.emma_env - -# Steg 3: Verifiser at seed er utført -ls -lh ~/OSVauco/emma/data/morphic.db -tail -3 ~/OSVauco/emma/emma_flynn_log.jsonl - -# Steg 4: Verifiser Gitea-tilkobling fra Emma -cd ~/OSVauco/emma && ~/emma-venv/bin/python -c " -from emma_gitea import GiteaClient -g = GiteaClient() -print(g.verify_boot()) -" - -# Steg 5: Verifiser OPAX-tilkobling fra Emma -cd ~/OSVauco/emma && ~/emma-venv/bin/python -c " -from emma_opax import OpaxClient -c = OpaxClient() -print(c.health()) -" - -# Steg 6: Start Emma CLI -emma -``` - -Forventet etter bootstrap: -- `morphic.db` eksisterer med > 20 mønstre -- Gitea-tilkobling returnerer `status: ok` med repo-liste -- OPAX health returnerer `status: ok` eller `unreachable` (akseptabelt fra dev-vm uten metadata-server) +- **IAP OAuth Client ID:** `357036551735-kq8nt71d38hfqlcfb3n52ef7ala4meo.apps.googleusercontent.com` +- **VM compute SA:** `357036551735-compute@developer.gserviceaccount.com` --- ## 🔨 Gjenstår (prioritert) -1. **Bootstrap Emma på VM** — kjør setup.sh (se NESTE OPPGAVE over) -2. **Verifiser IAP auth end-to-end** — bekreft `HTTP/2 200` fra opax.vauco.no -3. **Synk Gitea ←→ GitHub** — push emma/-modulene til Gitea (de er for øyeblikket kun på GitHub) -4. DNS/TLS for Gitea (`git.vauco.no`) -5. GPU VM-arbeid (planlagt) - ---- - -## 🚀 Neste sesjon — start her - -### 0. Boot-sjekk (kjør alltid først) - -```bash -# 1. Hvem er du og hvilken branch er canonical? -git -C ~/OSVauco remote -v -git -C ~/OSVauco 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 -``` - -### 1. IAP auth-verifisering (fortsatt åpen) - -```bash -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/opax/build-status \ - -H "Authorization: Bearer $TOKEN" | head -5 -# Forventet: HTTP/2 200 -``` - -### 2. Synk emma/ til Gitea - -```bash -# emma/-modulene ble pushet til GitHub — sjekk om Gitea er oppdatert -git -C ~/OSVauco log --oneline -3 # skal vise d2b0c6ac eller nyere - -# Hvis ikke: pull fra GitHub og push til Gitea -git -C ~/OSVauco remote add github https://github.com/vauco-saas/OSVauco.git 2>/dev/null || true -git -C ~/OSVauco fetch github main -git -C ~/OSVauco merge github/main --ff-only -git -C ~/OSVauco push origin main -``` +1. **IAP 401-diagnose** — kjør 4 diagnosesteg, gi IAP-rettighet til compute SA hvis mangler +2. **Bootstrap Emma på VM** — synk Gitea + kjør setup.sh +3. **DNS/TLS for Gitea** (`git.vauco.no`) +4. **GPU VM-arbeid** (planlagt) --- @@ -195,47 +174,36 @@ Bruker └─► osvauco-agent (Cloud Run) └─► opax-mcp (Cloud Run) └─► [IAP] opax.vauco.no - └─► OPAX backend (GCP) osvauco-dev-vm - └─► Emma (lokal MDP/MCoT-agent) - ├─► Morfisk minne (SQLite, ~/OSVauco/emma/data/morphic.db) - ├─► Guardrails (5-nivå, blokkerer HIGH/CRITICAL uten GO) - ├─► OPAX-klient (identity token → opax.vauco.no) - └─► Gitea-klient (alle repoer på 34.59.131.162:3000) + └─► Gemini CLI (denne agenten) + └─► Emma (lokal MDP/MCoT-agent, ikke bootstrappt ennå) + ├─► Morfisk minne (SQLite) + ├─► Guardrails (5-nivå) + ├─► OPAX-klient (identity token) + └─► Gitea-klient ``` -**Auth-flyt for opax-mcp → opax.vauco.no:** -``` -opax-mcp container - → GCE Metadata Service - → identity token med audience = IAP_CLIENT_ID - → Authorization: Bearer - → IAP validerer token - → Request videresendt til OPAX backend +**Auth-flyt VM → opax.vauco.no (IAP):** ``` +VM (Gemini CLI eller Emma) + → curl metadata.google.internal → identity token (audience = IAP_CLIENT_ID) + → curl https://opax.vauco.no -H "Authorization: Bearer $TOKEN" + → IAP validerer token mot roles/iap.httpsResourceAccessor + → HTTP 200 (eller 401 hvis SA mangler rollen) -**Emma-mønster:** -``` -Input → Guardrails → MDP → Morphic Recall → MCoT → OPAX/Gitea → Flynn-tracker → Output +NOTAT: gcloud auth print-identity-token virker KUN for user accounts mot Cloud Run. + For IAP må du bruke metadata server (GCE) eller service account key. ``` --- -## 📚 Relevante docs (les ved behov) +## 📚 Relevante docs | Dok | Innhold | |-----|---------| | `docs/LEARNINGS.md` | Append-only lærdomslogg — LEARNING-001 til 016 | -| `docs/AGENT_RULEBOOK.md` | Boot-protokoll, korreksjonsregler, friction-regler | -| `docs/MASTERPLAN.md` | Fase-oversikt og mål | -| `docs/ROADMAP.md` | Prioritert oppgaveliste | -| `docs/ARCHITECTURE.md` | Systemarkitektur | -| `docs/DNS-OG-INFRASTRUKTUR.md` | DNS-kart, IAP-routing, forwarding rules | -| `.gemini/GEMINI.md` | Instrukser til Gemini på VM (dette er deg) | -| `emma/README.md` | Emma-dokumentasjon — filer, bootstrap, guardrails | -| `emma/emma_identity.py` | Emmas identitet og ansettelsesforhold | -| `emma/emma_guardrails.py` | Guardrails-logikk — risikonivåer og regler | -| `emma/emma_gitea.py` | Gitea-klient — les/skriv repoer | -| `emma/emma_seed.py` | Boot-minne frø — kjøres én gang | +| `docs/AGENT_RULEBOOK.md` | Boot-protokoll, deploy-regler | +| `.gemini/GEMINI.md` | Instrukser til Gemini CLI på VM (dette er deg) | | `emma/setup.sh` | VM-bootstrap — klon, venv, install, seed | +| `docs/DNS-OG-INFRASTRUKTUR.md` | DNS-kart, IAP-routing, forwarding rules |