From 69813592236370f2d1b8b3f7cc0eb274be293ad8 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Wed, 10 Jun 2026 07:55:30 +0200 Subject: [PATCH] CI6 post-mortem: legg til RUNBOOK.md og oppdater .env.example med MCP_SECRET --- agents/core-logic/.env.example | 13 +++- docs/runbook/CI6-post-mortem.md | 119 ++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 docs/runbook/CI6-post-mortem.md diff --git a/agents/core-logic/.env.example b/agents/core-logic/.env.example index cfca802..a92e4e9 100644 --- a/agents/core-logic/.env.example +++ b/agents/core-logic/.env.example @@ -11,12 +11,21 @@ GOOGLE_GENAI_USE_VERTEXAI=True # Only set if GOOGLE_GENAI_USE_VERTEXAI=False (local testing without gcloud) # GOOGLE_API_KEY=your-api-key-here -# RAG corpus resource name (from setup_corpus.py output) -# RAG_CORPUS=projects/propane-will-491900-m5/locations/us-central1/ragCorpora/XXXXXXXXX +# RAG corpus resource name — DEAKTIVERT i root_agent (CI6) +# Blokkerte AFC når kombinert med FunctionTools. TODO: sub-agent når korpus er oppdatert. +# RAG_CORPUS=projects/propane-will-491900-m5/locations/europe-west4/ragCorpora/XXXXXXXXX # Agent Engine ID (from memory_setup.py output) # AGENT_ENGINE_ID=your-agent-engine-id +# OPAX-MCP server URL (intern CI/CD-kanal) +MCP_SERVER_URL=https://opax-mcp-zjbqp3prqq-uc.a.run.app + +# OPAX-MCP autentiseringsnøkkel — hentes fra Secret Manager: mcp-server-key +# På Cloud Run: mount via --update-secrets=MCP_SECRET=mcp-server-key:latest +# Lokalt: gcloud secrets versions access latest --secret=mcp-server-key +MCP_SECRET=your-mcp-secret-here + # MCP server URLs (if using Google managed MCP) # MAPS_MCP_URL=https://maps.googleapis.com/mcp # BIGQUERY_MCP_URL=https://bigquery.googleapis.com/mcp diff --git a/docs/runbook/CI6-post-mortem.md b/docs/runbook/CI6-post-mortem.md new file mode 100644 index 0000000..6009b69 --- /dev/null +++ b/docs/runbook/CI6-post-mortem.md @@ -0,0 +1,119 @@ +# CI6 Post-Mortem — Jason bruker live MCP +**Dato:** 2026-06-10 +**Løst av:** Chris + Perplexity +**Varighet:** ~2.5 timer + +--- + +## Problemet +Jason-agenten skulle bruke live MCP-verktøy (`get_build_status` etc.) i stedet for RAG/gjetting. +CI6 gikk ikke igjennom på første forsøk — tok mange iterasjoner å debugge. + +--- + +## Rotårsaker (5 stk) + +### 1. Feil Cloud Run URL +`osvauco-agent` har **to** URLs: +- `https://osvauco-agent-357036551735.us-central1.run.app` — generert URL (ikke bak IAP) +- `https://osvauco-agent-zjbqp3prqq-uc.a.run.app` — faktisk URL (bak IAP) + +**Lærdom:** Bruk alltid `gcloud run services describe ... --format="value(status.url)"` for å hente riktig URL. + +--- + +### 2. IAP-middleware blokkerte alle kall unntatt /health +`main.py` har en `require_iap` middleware som krever `x-goog-authenticated-user-email`-header. +Kall fra VM uten denne headeren → `401 Unauthorized` før FastAPI prosesserer requesten. + +**Lærdom:** For API-kall fra ikke-browser-klienter (scripts, agenter, CI), legg til ruten i `IAP_EXEMPT_PATHS` eller send headeren manuelt: +``` +-H "x-goog-authenticated-user-email: accounts.google.com:user@vauco.no" +``` + +--- + +### 3. RAG blokkerte AFC (Automatic Function Calling) +RAG-verktøyet (`VertexAiRagRetrieval`) er ikke en Python callable — det er en ADK-spesifikk tool-type. +Når den kombineres med `FunctionTool`-er i samme agent, deaktiveres AFC: +``` +Tools at indices [1] are not compatible with automatic function calling (AFC). +``` +Dette betyr at agenten aldri kaller MCP-verktøyene. + +**Lærdom:** Bland ALDRI `VertexAiRagRetrieval` og `FunctionTool` i samme agent. +RAG må isoleres i en dedikert sub-agent. + +**Fix:** Fjernet RAG fra `root_agent` (commit `3bb95c8`). TODO: RAG som sub-agent når korpuset er oppdatert. + +--- + +### 4. `_opax_headers()` brukte access token, ikke identity token +`google.auth.default()` gir et **OAuth2 access token** — ikke et **identity token**. +Cloud Run krever identity token med riktig `aud`-claim for å autorisere kall. + +**Symptom:** `401 Unauthorized` fra `opax-mcp` selv om IAM var riktig. + +**Fix:** Bytt til GCE metadata server for å hente identity token med riktig audience (commit `8013bd8`): +```python +resp = httpx.get( + f"http://metadata.google.internal/.../identity?audience={OPAX_MCP_URL}", + headers={"Metadata-Flavor": "Google"}, +) +``` + +--- + +### 5. MCP_SECRET ikke mountet på osvauco-agent +`mcp-server-key` var i Secret Manager, men ikke eksponert som env-var på `osvauco-agent`. +Agenten sendte `X-MCP-Key: ""` → `opax-mcp` avviste alle kall. + +**Fix:** +```bash +gcloud run services update osvauco-agent \ + --update-secrets="MCP_SECRET=mcp-server-key:latest" +``` + +**Lærdom:** Dokumenter ALLE required secrets i `.env.example` og i Cloud Run deploy-scriptet. + +--- + +## IAM som måtte settes +```bash +# VM-SA må kunne kalle begge Cloud Run-tjenester +gcloud run services add-iam-policy-binding osvauco-agent \ + --member="serviceAccount:357036551735-compute@developer.gserviceaccount.com" \ + --role="roles/run.invoker" + +gcloud run services add-iam-policy-binding opax-mcp \ + --member="serviceAccount:357036551735-compute@developer.gserviceaccount.com" \ + --role="roles/run.invoker" +``` + +--- + +## Tidslinje +| Tid (CEST) | Hendelse | +|---|---| +| 06:20 | CI5 lukket, build SUCCESS | +| 06:25 | Første `/chat`-kall — 404 (feil endepunkt) | +| 06:30 | Oppdaget endepunkt heter `/run` | +| 06:34 | Feil URL brukt (`357036551735` vs `zjbqp3prqq`) | +| 06:45 | IAP-middleware identifisert i `main.py` | +| 06:51 | Riktig token-type identifisert (audience-problem) | +| 07:00 | VM-SA fikk `run.invoker` på `osvauco-agent` | +| 07:14 | AFC-feil identifisert — RAG blokkerer FunctionTools | +| 07:17 | RAG fjernet fra `root_agent` (commit `3bb95c8`) | +| 07:39 | `_opax_headers()` fikset til identity token (commit `8013bd8`) | +| 07:47 | VM-SA fikk `run.invoker` på `opax-mcp` | +| 07:52 | `MCP_SECRET` mountet på `osvauco-agent` | +| 07:53 | ✅ Jason svarer med live build-data | + +--- + +## Forebyggende tiltak +- [ ] `IAP_EXEMPT_PATHS` dokumentert i `main.py` +- [ ] `.env.example` oppdatert med `MCP_SECRET` +- [ ] RAG som sub-agent (OQ-RAG backlog) +- [ ] Deploy-script skal verifisere alle required secrets er mountet +- [ ] CI-test for MCP-kall skal kjøres automatisk etter hver deploy