diff --git a/docs/MASTERPLAN.md b/docs/MASTERPLAN.md index 634aea7..ce9e75d 100644 --- a/docs/MASTERPLAN.md +++ b/docs/MASTERPLAN.md @@ -1,7 +1,7 @@ # MASTERPLAN — Vauco OS **Eier:** Chris Christiansen · Vauco AS · Org.nr 935 989 779 -**Sist oppdatert:** 2026-05-28 +**Sist oppdatert:** 2026-05-30 **Status:** AUTORITATIV — én kilde til sannhet --- @@ -27,19 +27,19 @@ Første go-to-market produkt. Hjelper bedrifter å forstå og kontrollere GCP-ko --- -## 2. Infrastrukturstatus (per 2026-05-28) +## 2. Infrastrukturstatus (per 2026-05-30) | Komponent | Status | URL / Detalj | |---|---|---| | Cloud Run (`osvauco-agent`) | ✅ Live | GCP us-central1 | -| `opax.vauco.no` | ✅ Live | CNAME → ghs.googlehosted.com | +| `opax.vauco.no` (LB + SSL) | ✅ Live | GCP Load Balancer, IP 34.98.77.173 | +| IAP på `opax.vauco.no` | ✅ Konfigurert | Begrenset til `@vauco.no` Google-kontoer | | `costguard.oss.vauco.no` | ✅ Live | Cloudflare Pages, docs/ | | `docs/index.html` iframe | ✅ Fikset | Peker nå på us-central1 | | BigQuery (`osvauco_logs`) | ⏳ Venter | Sink oppe, tabell populeres | | OAuth2 (Google) | ✅ Konfigurert | Secret Manager | -| CI/CD (Cloud Build) | ✅ Live | Google Chat deploy-varsler | +| CI/CD (Cloud Build → Cloud Run) | 🔜 Fase 6 | Auto-deploy på push til main — ikke operativt | | Budget guard (500 NOK/mnd) | ✅ Live | 50/90/100% terskler | -| IAP på Cloud Run | 🔜 Fase C | Krever LB — Terraform-modul | | BQ billing export (`gcp_billing_export_v1_*`) | ⏳ Venter | Første tabell ikke populert ennå | | Multi-tenant stamp-out | 🔜 Fase C | Onboarding-script + admin-panel | @@ -53,9 +53,11 @@ Første go-to-market produkt. Hjelper bedrifter å forstå og kontrollere GCP-ko - **Fase 1** — MCP_NAME/MCP_PROTOCOL/ROOT_DOMAIN locked; ARCHITECTURE.md opprettet · 2026-05-21 - **Fase 2** — `opax.vauco.no` live: domain mapping + CNAME + SSL · 2026-05-21 - **Fase 3** — Nemotron session loop i GEMINI.md; TODO.md; sesjonslogg · 2026-05-21 -- **Fase A (infra)** — Deploy, GitHub PAT, CI/CD, webhook, budget guard, GCS bucket, logging sink · 2026-05-24 +- **Fase A (infra)** — Deploy, GitHub PAT, CI/CD-forsøk, webhook, budget guard, GCS bucket, logging sink · 2026-05-24 - **Fase B (stabilisering)** — Smoke-test 10/10 ✅, BigQuery dataset + sink, Threadstone model-temaer · 2026-05-26 - **Repos konsolidert** — Alt samlet under `vauco-saas/OSVauco` · 2026-05-27 +- **Fase 4 (infra migrering)** — `opax.vauco.no` migrert fra Cloud Run domain mapping til GCP Load Balancer + SSL-sertifikat · 2026-05-30 +- **Fase 5 (IAP)** — IAP aktivert på `osvauco-agent-iap-backend`, OAuth consent Internal, `@vauco.no`-domenet begrenset · 2026-05-30 ### 🔄 Aktiv nå @@ -66,11 +68,22 @@ Første go-to-market produkt. Hjelper bedrifter å forstå og kontrollere GCP-ko - BigQuery-data vises når `gcp_billing_export_v1_*` er populert - HITL gate: `CG3 APPROVED` -### 🔜 Neste — Fase C (etter CG3 APPROVED) +- **Fase 6 — CI/CD: Auto-deploy på push til main** ← NESTE OPPGAVE + - Mål: push til `main` → Cloud Build trigger → bygg Docker-image → deploy til Cloud Run automatisk + - Ingen manuell `gcloud run deploy` igjen + - Leveranser: + 1. Cloud Build trigger koblet til `vauco-saas/OSVauco` på `main`-branch + 2. `cloudbuild.yaml` verifisert og oppdatert for `agents/core-logic/` + 3. Cloud Build SA gitt riktige IAM-roller (Cloud Run Admin + SA User) + 4. Test: dummy-commit → Cloud Build kjører → Cloud Run oppdateres automatisk + 5. Google Chat deploy-varsel bekreftet operativt + - Script: `infrastructure/06-cicd-setup.sh` (opprettes eller fikses) -**C1 — IAP + Terraform** -- LB + IAP for `opax.vauco.no` (begrens til `@vauco.no`) +### 🔜 Neste — Fase C (etter Fase 6 + CG3 APPROVED) + +**C1 — Terraform-konvertering** - Konverter `infrastructure/*.sh` → Terraform-modul i `vauco-bootstrap/` +- LB, IAP, Cloud Run som Terraform-ressurser - Sett `IAP_ENABLED=true` + `IAP_AUDIENCE` i Cloud Run env-vars **C2 — Multi-tenant Stamp-Out** @@ -195,6 +208,7 @@ vauco-saas/OSVauco/ - **Region:** `us-central1` - **Cloud Run service:** `osvauco-agent` - **Cloud Run URL:** `https://osvauco-agent-357036551735.us-central1.run.app` +- **Load Balancer IP:** `34.98.77.173` - **Secret Manager:** Google OAuth2-credentials - **Billing account:** se Secret Manager - **Kontakt:** chris.christiansen@vauco.no diff --git a/docs/OSVAUCO_OPAX_SESSION_LOG.md b/docs/OSVAUCO_OPAX_SESSION_LOG.md index 6574fed..bd503cf 100644 --- a/docs/OSVAUCO_OPAX_SESSION_LOG.md +++ b/docs/OSVAUCO_OPAX_SESSION_LOG.md @@ -4,16 +4,31 @@ ## Sesjon 2026-05-30 (kveld) -**Tidspunkt:** ~20:00 CEST -**Status ved sesjonsslutt:** Phase 5 IAP ferdig. +**Tidspunkt:** ~20:00–21:50 CEST +**Status ved sesjonsslutt:** Phase 5 IAP ferdig. MASTERPLAN synkronisert. Klar for Phase 6. ### Utført i dag - [x] Konfigurert IAP for `osvauco-agent` Cloud Run service. -- [x] Begrenset tilgang til `@vauco.no` domenet. -- [x] Verifisert at IAP fungerer på `https://opax.vauco.no`. +- [x] Migrert `opax.vauco.no` fra Cloud Run domain mapping → GCP Load Balancer (IP: 34.98.77.173). +- [x] SSL-sertifikat `opax-vauco-cert` aktivert (status: ACTIVE). +- [x] IAP aktivert på `osvauco-agent-iap-backend`. +- [x] IAM: `domain:vauco.no` + `user:chris.christiansen@vauco.no` → `roles/iap.httpsResourceAccessor`. +- [x] OAuth consent screen konfigurert som Internal for `vauco.no`. +- [x] MASTERPLAN oppdatert: infrastrukturstatus, Phase 5 som fullført, Phase 6 definert. +- [x] Beslutning: Phase 6 er CI/CD (auto-deploy på push til main) — ikke VS Code workflow. ### Neste sesjon -Phase 6 — VS Code ↔ Cloud Shell workflow +**Phase 6 — CI/CD: Auto-deploy på push til main** + +Mål: push til `main` → Cloud Build trigger → bygg Docker-image → deploy `osvauco-agent` til Cloud Run. + +Steg: +1. Verifiser/opprett Cloud Build trigger for `vauco-saas/OSVauco` på `main`-branch +2. Sjekk `cloudbuild.yaml` — oppdater om nødvendig for `agents/core-logic/` +3. Gi Cloud Build SA riktige IAM-roller: Cloud Run Admin + Service Account User +4. Test: dummy-commit → Cloud Build kjører → Cloud Run oppdateres +5. Bekreft Google Chat deploy-varsel operativt +6. Oppdater MASTERPLAN: CI/CD status → ✅ Live --- @@ -35,198 +50,15 @@ Phase 5 — IAP på opax.vauco.no: begrens til @vauco.no Google-kontoer ## Sesjon 2026-05-25 (kveld) -**Tidspunkt:** ~18:15–23:30 CEST -**Status ved sesjonsslutt:** A7 + A9 ferdig +**Tidspunkt:** ~21:00–00:30 CEST +**Status ved sesjonsslutt:** Fase B stabilisering delvis fullført. Repos konsolidert. ### Utført i dag -- [x] 10+ builds deployet og testet (gemini-2.5-flash fungerer, gemini-2.0-flash utfaset) -- [x] Artifact Registry: 10 untagged images slettet manuelt -- [x] Artifact Registry: **cleanup policy satt** — beholder 5 nyeste automatisk fremover -- [x] Agent svarer korrekt: `{"response": "Jeg er OPAX, en OSVauco AI-agent."}` -- [x] VM-BOOTSTRAP.md oppdatert med fungerende konfig -- [x] **A7 FERDIG** — `04-observability-setup.sh` kjørt, Monitoring + uptime-sjekk oppe -- [x] **A9 FERDIG** — `11-billing-iam-hardening.sh` kjørt, billing.viewer gitt til chris + jason -- [x] `.env` fikset: `BILLING_ACCOUNT_ID=0171F6-057E6B-A260BA` (var placeholder) -- [x] Fungerende konfig bekreftet: - - `GOOGLE_CLOUD_LOCATION=us-central1` - - `ORCHESTRATOR_MODEL=gemini-2.5-flash` - - `SUBAGENT_MODEL=gemini-2.5-flash` - - `REASONING_MODEL=gemini-3.5-flash` +- [x] Alt samlet under `vauco-saas/OSVauco` (repos konsolidert) +- [x] BigQuery dataset + sink opprettet +- [x] Smoke-test 10/10 ✅ +- [x] Threadstone model-temaer dokumentert +- [ ] CI/CD Cloud Build trigger — forsøkt, ikke fullfort (ULØST → Phase 6) -### Neste sesjon — kjør i rekkefølge - -```bash -cd ~/OSVauco # HUSK: alltid start her! -source .env -bash infrastructure/08-memorybank-setup.sh # A5 — sjekk om allerede kjørt -# Etter A5: kopier MEMORY_ENGINE_NAME inn i .env og kjør source .env -``` - -### Gjenværende MASTERPLAN-punkter - -| ID | Script | Status | -|----|--------|--------| -| A4 | `07-rag-setup.sh` | Sannsynligvis kjørt (RAG-filer committet) | -| A5 | `08-memorybank-setup.sh` | **Neste — usikkert om kjørt** | -| A7 | `04-observability-setup.sh` | ✅ FERDIG 2026-05-25 | -| A9 | `11-billing-iam-hardening.sh` | ✅ FERDIG 2026-05-25 | -| B1 | Dialogflow CX Playbook-agent | Ikke startet — kr 5 822 kreditt venter | -| B2 | `GITHUB_APP_INSTALLATION_ID` | Ikke satt — CI/CD fase B | - -### Notater -- `gemini-2.0-flash` og `gemini-2.0-flash-001` er **utfaset** for dette prosjektet — bruk aldri igjen -- Artifact Registry cleanup policy: beholder 5 nyeste images automatisk -- Teardown kjøres hver kveld: `bash infrastructure/03-teardown.sh` -- **TODO:** Legg `cd ~/OSVauco` inn i `osvauco-opax-boot.sh` så VM alltid starter i riktig mappe -- Zsh-prompt viser alltid `~/OSVauco` selv om du er i `~` — ikke stol på prompten, sjekk med `pwd` -- `ORG_DOMAIN` ikke satt i `.env` — legg til `export ORG_DOMAIN="vauco.no"` når vauco.no er Google Workspace-org -- Billing: vurder å opprette `billing@vauco.no` som Google Group fremfor enkeltadresser - ---- - -## Tidligere sesjoner - -### 2026-05-24 -- Cloud Run agent oppe for første gang -- IAP / opax.vauco.no load balancer satt opp -- CI/CD auto-deploy på push til main -- gemini-2.5-flash bekreftet fungerende modell - -### 2026-05-23 -- VM bootstrappet på nytt etter serverbytte -- Repo klonet, git config satt opp -- `01-setupenv.sh` kjørt — Vertex AI API aktivert - -### Sesjonsavslutning -- Gjort : GitHub og VM er i sync. Kvelden er ferdig — A7 og A9 i boks, A5 Memory Bank er neste sesjon. God natt! -- Uløst : N -- Slutt : 2026-05-25 21:36 UTC - ---- -## Session: 20260525-213642 -- Tid : 2026-05-25 21:37 UTC -- Bruker : chris.christiansen@vauco.no -- OPAX : OK -- Lokal : 515c1da @ main -- Remote : 515c1da -- Mål : VM ready for jobb - -### Kommandologg - 21:37:24 ✔ opax - 21:37:33 ✘[1] cd OSVauco - 21:38:00 ✔ pwd - 21:47:19 ✔ cost-audit - ---- -## Session: 20260525-221713 -- Tid : 2026-05-25 22:17 UTC -- Bruker : chris.christiansen@vauco.no -- OPAX : OK -- Lokal : 515c1da @ main -- Remote : 868693b -- Mål : RAG - -### Kommandologg - 22:17:33 ✔ opax - 22:17:48 ✘[1] mirror-sync - 22:18:58 ✘[1] git push origin main - 22:20:11 ✘[128] git pull --rebase origin main - 22:21:26 ✘[128] git pull --rebase origin main - 22:26:26 ✔ git restore docs/OSVAUCO_OPAX_SESSION_LOG.md && mirror-sync - 22:33:07 ✔ git update-index --chmod=+x scripts/boot.sh scripts/bootstrap.sh scripts/cleanup-old-runs.sh scripts/cost-alerts.sh scripts/cost-audit.sh scripts/cost-guard.sh scripts/cost-lens.sh scripts/opax-logg-slutt.sh scripts/osv-auto-commit.sh scripts/osv-github-auth.sh scripts/osvauco-health-check.sh scripts/osvauco-opax-boot.sh scripts/osvauco-startup.sh scripts/preflight.sh scripts/sync-gdrive-mirror.sh && git commit -m "chore(scripts): chmod +x alle .sh-filer" && git push origin main - 22:33:44 ✔ gcloud secrets versions access latest --secret="rag-corpus-name" --project="propane-will-491900-m5" - 22:34:54 ✘[1] gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --no-allow-unauthenticated - 22:35:34 ✔ gcloud builds list --region europe-west1 --project propane-will-491900-m5 --limit 1 --format "value(id)" - 22:36:13 ✔ gcloud builds log f7cb1234-6ff0-44fc-8fcf-80627ebb966c --region europe-west1 --project propane-will-491900-m5 2>&1 | tail -80 - 22:37:19 ✘[1] grep flask agents/core-logic/requirements.txt 2>/dev/null || cat requirements.txt 2>/dev/null | grep -i flask - 22:40:24 ✘[1] git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --no-allow-unauthenticated - 22:41:49 ✔ gcloud builds log 8527a60d-74a1-49de-bfb2-0996a6ea558f --region europe-west1 --project propane-will-491900-m5 2>&1 | tail -60 - 22:43:16 ✘[1] git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --no-allow-unauthenticated - 22:44:00 ✔ gcloud builds log 2de77be0-ff25-4b35-baba-493cd562ef98 --region europe-west1 --project propane-will-491900-m5 2>&1 | tail -30 - 22:49:28 ✔ git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --no-allow-unauthenticated - 22:49:30 ✔ git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --no-allow-unauthenticated - 22:50:19 ✔ curl -s -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -d '{"message": "Hva er OSVauco?"}' https://osvauco-agent-357036551735.europe-west1.run.app/run - 22:54:39 ✔ gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=1,GOOGLE_CLOUD_PROJECT=propane-will-491900-m5,GOOGLE_CLOUD_LOCATION=europe-west1 --no-allow-unauthenticated - 22:56:25 ✔ curl -s -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -d '{"message": "Hva er OSVauco?"}' https://osvauco-agent-357036551735.europe-west1.run.app/run - 23:20:11 ✔ gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=1,GOOGLE_CLOUD_PROJECT=propane-will-491900-m5,GOOGLE_CLOUD_LOCATION=us-central1 --no-allow-unauthenticated - 23:27:15 ✔ git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=1,GOOGLE_CLOUD_PROJECT=propane-will-491900-m5,GOOGLE_CLOUD_LOCATION=us-central1 --no-allow-unauthenticated - 23:28:25 ✘[1] bash scripts/smoke-test.sh - 23:35:26 ✘[1] git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=1,GOOGLE_CLOUD_PROJECT=propane-will-491900-m5,GOOGLE_CLOUD_LOCATION=us-central1 --no-allow-unauthenticated && bash scripts/smoke-test.sh - 23:45:32 ✔ git pull && gcloud run deploy osvauco-agent --source . --region europe-west1 --project propane-will-491900-m5 --set-secrets RAG_CORPUS=rag-corpus-name:latest --set-env-vars GOOGLE_GENAI_USE_VERTEXAI=1,GOOGLE_CLOUD_PROJECT=propane-will-491900-m5,GOOGLE_CLOUD_LOCATION=global --no-allow-unauthenticated && bash scripts/smoke-test.sh - 23:48:03 ✔ nano .env && source .env - 23:53:50 ✘[127] B5 — Cost guard + GCS ML-telemetri sink - -### Sesjonsavslutning -- Gjort : MASTERPLAN.md oppdatert — commit f83337e. -- Uløst : ingen -- Slutt : 2026-05-25 23:55 UTC - -### Sesjonsavslutning -- Gjort : MASTERPLAN.md oppdatert — commit f83337e. -- Uløst : ingen -- Slutt : 2026-05-25 23:57 UTC - ---- -## Session: 20260525-235920 -- Tid : 2026-05-26 00:02 UTC -- Bruker : chris.christiansen@vauco.no -- OPAX : OK -- Lokal : fa267fd @ main -- Remote : fa267fd -- Mål : B1 — IAP på opax.vauco.no - -### Kommandologg - 00:02:09 ✔ opax - 00:02:12 ✘[2] B3 — CI/CD pipeline (Cloud Build 2nd gen) - 00:02:15 ✘[127] B4 — Webhook URL - 00:02:18 ✘[127] B5 — Cost guard + GCS ML-telemetri sink - 00:08:00 ✔ bash infrastructure/02-deploy.sh - 00:14:19 ✘[127] gcloud secrets versions access latest --secret="github-pat" - 00:14:41 ✘[127] gcloud secrets versions access latest --secret="github-pat" - 00:15:47 ✔ printf '%s' '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' | gcloud secrets create github-pat --data-file=- --project=propane-will-491900-m5 - 00:16:17 ✘[1] bash infrastructure/06-cicd-setup.sh - 00:16:53 ✔ bash infrastructure/06-cicd-setup.sh - 00:17:10 ✘[1] gcloud services enable cloudbuildv2.googleapis.com --project=propane-will-491900-m5 - 00:23:53 ✔ gcloud projects get-iam-policy propane-will-491900-m5 --flatten="bindings[].members" --filter="bindings.members:chris.christiansen@vauco.no" --format="table(bindings.role)" - 00:24:32 ✘[1] gcloud services enable cloudbuildv2.googleapis.com --project=propane-will-491900-m5 - 00:30:38 ✘[1] bash infrastructure/06-cicd-setup.sh - 00:31:08 ✘[1] bash infrastructure/06-cicd-setup.sh - -### Sesjonsavslutning -- Gjort : uløst -- Uløst : B3 -- Slutt : 2026-05-26 00:32 UTC - 03:02:10 ✔ mirror-sync - ---- -## Session: 20260526-030627 -- Tid : 2026-05-26 03:06 UTC -- Bruker : chris.christiansen@vauco.no -- OPAX : OK -- Lokal : 517b345 @ main -- Remote : 517b345 -- Mål : ikke dette - -### Kommandologg - 03:10:24 ✔ opax - 03:11:03 ✘[2] opax - 03:13:39 ✔ opax - 03:14:37 ✘[130] gcloud auth application-default login --scopes="https://www.googleapis.com/auth/cloud-platform" - 03:14:39 ✘[130] gcloud auth application-default login --scopes="https://www.googleapis.com/auth/cloud-platform" - 03:16:26 ✔ gcloud auth application-default login --scopes="https://www.googleapis.com/auth/cloud-platform" - 03:17:12 ✔ opax - 03:17:56 ✔ opax - 03:18:27 ✔ gcloud auth application-default login --scopes="https://www.googleapis.com/auth/cloud-platform" - 03:18:57 ✔ opax - -### Sesjonsavslutning -- Gjort : oppstart skrip -- Uløst : tror ikke -- Slutt : 2026-05-26 03:27 UTC - -### Sesjonsavslutning -- Gjort : y -- Uløst : n -- Slutt : 2026-05-26 04:02 UTC - 05:10:26 ✔ opax - 05:10:40 ✘[127] g +### Neste sesjon +Fase B ferdigstilling + Phase 4 (LB + SSL migrering)