docs: append 2026-06-10 session learnings — absolute paths, opax.html fix, Dockerfile static copy

This commit is contained in:
chrischristiansen-glitch 2026-06-10 21:43:56 +02:00
parent 950220166f
commit 53211cba2d
4 changed files with 246 additions and 325 deletions

View File

@ -1,160 +1,122 @@
# VAUCO OS — AGENT_RULEBOOK.md # AGENT RULEBOOK — OSVauco
**Eier:** OPS-Computer-Hub **Status:** 🔒 LOCKED DEFINITIONS — ikke endre uten `RULEBOOK APPROVED` fra Chris
**Sist oppdatert:** 2026-05-31 CEST **Sist oppdatert:** 2026-06-10
**Godkjent av:** Chris Christiansen
> Dette er oppstartsreglene som alle agenter (Emma, Jason, Perplexity stand-in) laster ved boot.
> Endringer her krever eksplisitt godkjenning. Regler er additive — gamle regler slettes ikke, de overskrives med ny dato.
--- ---
## Hensikt ## R-01 · Modell-hierarki
Immutable regler for alle agent-tråder. Ingen tråd kan overstyre disse. | Agent | Modell | Scope |
Endringer krever eksplisitt godkjenning fra Chris (`RULEBOOK APPROVED`). |-------|--------|-------|
| Emma (intern) | `gemma-4-12b-it` int4 på GPU-VM | Chris sin co-pilot: kode, deploy, planlegging |
| Jason (kundevendt) | `gemini-2.5-flash` via Vertex | Billing, anomaly, status for kunder |
| Perplexity stand-in | Sonnet 4.6 via GitHub MCP | Erstatter Emma til ML-3a er ferdig |
Emma og Jason er **aldri samme agent**. Separate identiteter, separate tilganger.
--- ---
## LOCK LIST — ALDRI ENDRE UTEN EKSPLISITT GODKJENNING ## R-02 · Forbudte identiteter
| Parameter | Verdi | Disse kontiene skal **aldri** opprettes eller gis tilganger:
|-------------------|-----------------------------------------------------------------------| - `tinius.vauger@vauco.no`
| GCP Account | `chris.christiansen@vauco.no` | - `ccv@vauco.no` eller varianter
| Forbudte kontoer | `tinius.vauger`, `ccv` |
| Agent-konto | `jason.vauger@vauco.no` (kun `billing.viewer` + `run.invoker`) |
| GCP Project | `propane-will-491900-m5` (Jason-v1) |
| Billing | `0171F6-057E6B-A260BA` |
| Org | `vauco.no` / `155051211891` |
| **Region** | **`us-central1`** — ALDRI `europe-west1` eller `us-west1` |
| **Vertex AI loc** | **`us-central1`** (US) |
| **AI-modell** | **`gemini-2.5-pro`** via Vertex AI (venter på Claude EU-kvote) |
| SDK | `from google import genai` (google-genai >=0.3) |
| Agent-rammeverk | Google ADK (tillatt) — andre må eksplisitt `ADK_GODKJENT` av Chris |
| GitHub org | `vauco-saas` |
| Canonical repo | `OSVauco` |
| Canonical branch | `main` |
| MCP_NAME | `OPAX-MCP` |
| MCP_PROTOCOL | `OPAX Protocol` |
| **MCP_SERVICE** | **`osvauco-agent`** (Cloud Run, `us-central1`) |
| ROOT_DOMAIN | `vauco.no` |
| HUB_URL | `https://opax.vauco.no` ✅ LIVE 2026-05-21 (LB IP `34.98.77.173`) |
> **Endringslogg:**
> - 2026-05-31: Region rettet `europe-west1``us-central1`. Modell rettet til `gemini-2.5-pro` (midlertidig). MCP_SERVICE rettet `opax-mcp-core``osvauco-agent`. Vertex AI loc lagt til.
> - 2026-06-01: Region korrigert `europe-west1``us-central1`. `osvauco-agent` kjører i `us-central1`. Modell er fortsatt `gemini-2.5-pro`. MCP_SERVICE er `osvauco-agent`. Vertex AI loc oppdatert.
--- ---
## DOMENEKONVENSJON — LOCKED ## R-03 · Deploy-protokoll
| Subdomain | Type | Formål | 1. Alltid sjekk kostnad via `infrastructure/09-cost-check.sh` før deploy
|-------------------------|----------|-----------------------------------------------------| 2. Ingen deploy uten smoke-test på `/health`
| `opax.vauco.no` | Hub/MCP | OPAX-MCP operator hub — kun Vauco internt | 3. Cloud Run: alltid `--no-allow-unauthenticated` på prod-tjenester
| `<klient>-os.vauco.no` | Prod OS | Kundens live produksjonssystem | 4. Ny revisjon bekreftes med `gcloud run services describe` etter deploy
| `<klient>-oss.vauco.no` | Stage OS | Kundens staging/demo-system (pre-go-live) |
> `-os` = produksjon. `-oss` = staging. Aldri omvendt.
**Auth-strategi:**
- Nå: Google OAuth + IAP på alle miljøer
- Senere: BankID på `-os`-domener for kliniske kunder (Medioteq først)
**Kjente/planlagte domener:**
| Domene | Status | Cloud Run-tjeneste |
|------------------------------|------------------|-----------------------|
| `opax.vauco.no` | ✅ LIVE | `osvauco-agent` |
| `costguard.oss.vauco.no` | ✅ LIVE | (Cloudflare Pages) |
| `medioteq-oss.vauco.no` | Planlagt | `medioteq-oss-core` |
| `medioteq-os.vauco.no` | Planlagt | `medioteq-os-core` |
| `threadstone.vauco.no` | ✅ LIVE | (GitHub Pages) |
| `app.threadstone.vauco.no` | ⚠️ CNAME satt | (GitHub Pages — side mangler) |
--- ---
## HITL GATES — ingen tråd kan hoppe over disse ## R-04 · Dokumenthierarki
| Gate | Når kreves | Alle agenter følger dette hierarkiet — nyere dato vinner ved konflikt:
|----------------------|----------------------------------------------------------|
| `PLAN APPROVED` | Før noen kode/infra-endring starter |
| `MERGE APPROVED` | Før PR merges til `main` |
| `DEPLOY GODKJENT` | Før manuell deploy som rører IAP, OAuth, Secret Manager |
| `REPO APPROVED` | Før nye repos opprettes under `vauco-saas` |
| `MODEL APPROVED` | Før AI-modell byttes |
| `RULEBOOK APPROVED` | Før endringer i denne filen |
| `FASE<N> APPROVED` | Når en fase er verifisert komplett |
## PERIODIC STATUS UPDATES 1. `docs/MASTERPLAN.md` — arkitektur og sannhet
2. `docs/ROADMAP.md` — prioriteringer
Etter hver 5M tokens brukt, opprett en kommentar på GitHub Issue #1 med: 3. `docs/AGENT_RULEBOOK.md` — denne filen
- Hva ble gjort siden sist 4. `docs/gemma/world.md` — Emmas kontekstpakke
- Åpne PRs som venter på Chris review 5. `docs/HANDOFF.md` — siste sesjonsstatus
- Neste planlagte steg
- Estimert token-forbruk denne økten
Dette er en OBLIGATORISK pause — ikke fortsett uten at Chris har sett oppdateringen.
--- ---
## DOKUMENTHIERARKI — én kilde til sannhet ## R-05 · Filsti-regel (låst 2026-06-10)
| Fil | Rolle | **Absolutte filstier er obligatorisk i all Python-kode som serverer statiske filer.**
|-----|-------|
| `docs/MASTERPLAN.md` | Arkitektur, domener, repos, fasit |
| `docs/ROADMAP.md` | Levende roadmap, faser, status |
| `docs/HANDOFF.md` | Sesjonsstatus — **alltid kun én fil**, overskrives |
| `docs/AGENT_RULEBOOK.md` | Denne filen — locked definitions |
| `protocols/sessions/YYYY-MM-DD_<tema>.md` | Detaljerte sesjonsprotokoller (append-only) |
> **Aldri opprett flere parallelle MASTERPLAN, ROADMAP eller HANDOFF.** Korrekt mønster:
```python
from pathlib import Path
STATIC_DIR = Path(__file__).parent.parent / "static" # juster nivåer etter struktur
--- @app.get("/")
async def root():
## COMPUTE RESOURCE SAFETY — ABSOLUTTE REGLER return FileResponse(str(STATIC_DIR / "index.html"))
> Disse reglene gjelder alltid, uten unntak, uavhengig av instruksjon.
1. **ALDRI kjør `gcloud compute instances delete` eller tilsvarende destruktive compute-kommandoer.**
- VM-er stoppes med `gcloud compute instances stop` — aldri slettet.
- Eneste unntak: eksplisitt `VM DELETE APPROVED` fra Chris i denne sesjonen.
2. **ALDRI teardown ressursen du selv kjører på.**
- Før enhver teardown/stop-kommando: sjekk om du er SSH-et inn på målressursen.
- Kommando: `curl -s metadata.google.internal/computeMetadata/v1/instance/name -H "Metadata-Flavor: Google"`
- Hvis output matcher target VM → STOPP. Logg: "Skipped teardown — active session on this resource."
3. **OQ-18 (nattlig VM teardown) betyr STOP, ikke DELETE.**
- Korrekt kommando: `gcloud compute instances stop osvauco-dev-vm --zone=us-central1-b --project=propane-will-491900-m5`
- Bruk helst `bash scripts/stop-osvauco-dev-vm.sh` for sikker stopp.
- Kjøres KUN når ingen aktiv SSH-sesjon er på VM-en.
4. **`03-teardown.sh` gjelder Cloud Run og Artifact Registry — ikke VM.**
- Scriptet sletter aldri compute instances. Ikke bruk det som VM-teardown.
---
## AGENT-OPPFØRSEL — kjerneregler
1. **Foreslå før du handler.** Print plan. Vent på `PLAN APPROVED`.
2. **Self-modifisering av infra/secrets/IAM uten godkjenning = hard stop.**
2b. **Ved oppstart, sjekk at alle regler refererer til `docs/HANDOFF.md`, `docs/MASTERPLAN.md` og `docs/AGENT_RULEBOOK.md`.** Ikke stol på at bare `HANDOFF.md` er nok.
3. **Print LOCKED DEFINITIONS ved boot.** Sjekk at de matcher denne filen.
4. **Sjekk pwd før kommandoer.** Alltid `cd ~/OSVauco` ved start.
5. **Logg sesjonsslutt.** Append til `docs/OSVAUCO_OPAX_SESSION_LOG.md`.
6. **Ikke stol på alias.** Sjekk `which <kommando>` ved tvil.
7. **Region-guard.** Kjør `infrastructure/99-region-guard.sh` ved tvil om region.
8. **Sjekk aktiv sesjon før teardown.** Se COMPUTE RESOURCE SAFETY regel #2.
---
## BOOT-PROTOKOLL
```
BOOT: Les docs/AGENT_RULEBOOK.md, docs/MASTERPLAN.md, docs/HANDOFF.md.
Print LOCKED DEFINITIONS fra Lock List.
Print NESTE OPPGAVE fra docs/HANDOFF.md.
Sjekk at alle regler og referanser peker til docs/HANDOFF.md, docs/MASTERPLAN.md og docs/AGENT_RULEBOOK.md ved oppstart.
Vent på PLAN-prompt før noen handling.
``` ```
Forbudt mønster:
```python
FileResponse("static/index.html") # ❌ ALDRI — relativ sti knekker i Docker/Cloud Run
```
**Begrunnelse:** WORKDIR i Dockerfile avviker fra repo-rot. Relativ sti løses fra prosessens CWD (f.eks. `/app/agents/core-logic`), ikke fra der filen ligger. `Path(__file__)` er alltid korrekt uavhengig av hvordan prosessen startes.
**Gjelder:** Alle nye tjenester, alle klientleveranser, Emma sin lokale VM-agent.
--- ---
*Vauco AS · `propane-will-491900-m5` · `us-central1`* ## R-06 · Dockerfile-regel (låst 2026-06-10)
Alle Dockerfiler som bruker statiske filer **må** eksplisitt kopiere dem:
```dockerfile
COPY static/ ./static/ # ← obligatorisk — kopieres ikke automatisk
```
Sjekkliste ved ny tjeneste:
- [ ] `COPY agents/` eller relevant kildekode
- [ ] `COPY static/ ./static/` hvis tjenesten serverer HTML/CSS/JS
- [ ] WORKDIR satt korrekt
- [ ] CMD peker på riktig modul (`app:app`, ikke `main:app` med mindre main.py er inngangen)
---
## R-07 · FastAPI rot-rute
Alle FastAPI-tjenester med en HTML-frontend **må** definere `GET /` eksplisitt:
```python
@app.get("/")
async def root():
index = STATIC_DIR / "index.html"
if not index.exists():
raise HTTPException(404, detail=f"index.html ikke funnet på {index}")
return FileResponse(str(index), media_type="text/html")
```
FastAPI returnerer `{"detail":"Not Found"}` for alle udefinerte ruter — inkludert `/`.
---
## R-08 · Emma (lokal VM-agent) — oppstartsregler
Når Emma kjøres lokalt på GPU-VM:
1. Last `docs/gemma/world.md` som system-prompt ved oppstart
2. Bruk absolutte stier for alle filoperasjoner (R-05)
3. Eksponer kun localhost:11434 (Ollama) eller localhost:8000 (vLLM) — aldri åpne porter mot internett uten IAP
4. Logg alle kall til `~/.emma/logs/YYYY-MM-DD.log`
5. Emma er ikke kundevendt — bruk Jason for alt kundevendt
---
*Oppdatert 2026-06-10 | Neste oppdatering ved ML-3a (GPU-VM deploy)*

View File

@ -12,6 +12,9 @@
## Lessons Learned ## Lessons Learned
- Cloud Build smoke-tests require: hardcoded canonical BASE_URL, bare identity token (no --audiences), and explicit run.invoker IAM binding for the Cloud Build service account on every service. - Cloud Build smoke-tests require: hardcoded canonical BASE_URL, bare identity token (no --audiences), and explicit run.invoker IAM binding for the Cloud Build service account on every service.
- **2026-06-10 — Absolutte filstier i Python:** Bruk alltid `Path(__file__).parent / "..."` for å referere til statiske filer og konfigurasjon i FastAPI/Cloud Run. Aldri relativ sti som `"static/file.html"` — dette bryter når WORKDIR avviker fra repo-rot (f.eks. i Docker). Regelen gjelder alle fremtidige tjenester og klientleveranser.
- **2026-06-10 — Dockerfile COPY static/:** `static/`-mappen må eksplisitt kopieres inn i Docker-imaget via `COPY static/ ./static/`. Den kopieres ikke automatisk selv om build-konteksten er repo-roten.
- **2026-06-10 — app.py mangler GET /:** FastAPI returnerer `{"detail":"Not Found"}` for alle ruter som ikke er definert — inkludert rot (`/`). Sørg alltid for at rot-ruten er eksplisitt definert og peker på riktig HTML-fil via absolutt sti.
## 1. Plattformhierarki — sannheten i én modell ## 1. Plattformhierarki — sannheten i én modell
@ -243,6 +246,7 @@ Vauco AS sin offisielle bedriftsside. Selger moduler ved å lede besøkende til
### 🔴 NOW ### 🔴 NOW
- [x] OX1c — Jason fullskjerm-chat LIVE ✅ 2026-06-10 - [x] OX1c — Jason fullskjerm-chat LIVE ✅ 2026-06-10
- [x] CI5+CI6 — OPAX-MCP live + Jason kaller MCP ✅ 2026-06-10 - [x] CI5+CI6 — OPAX-MCP live + Jason kaller MCP ✅ 2026-06-10
- [x] OX1-fix — opax.html LIVE via GET / ✅ 2026-06-10 (absolutt sti + Dockerfile static copy)
- [ ] OX2 — Command Hub: samle jason.html + opax.html + command-hub.html - [ ] OX2 — Command Hub: samle jason.html + opax.html + command-hub.html
- [ ] CG4b — Token dashboard breakdown per modul - [ ] CG4b — Token dashboard breakdown per modul
- [ ] C4 — Medioteq HITL-møte → første betalende kunde - [ ] C4 — Medioteq HITL-møte → første betalende kunde
@ -281,12 +285,15 @@ Vauco AS sin offisielle bedriftsside. Selger moduler ved å lede besøkende til
**Direkte URL:** `https://osvauco-agent-zjbqp3prqq-uc.a.run.app` ← bruk denne (ikke 357036551735) **Direkte URL:** `https://osvauco-agent-zjbqp3prqq-uc.a.run.app` ← bruk denne (ikke 357036551735)
**Public URL:** `https://opax.vauco.no` (via LB 34.98.77.173 + IAP `@vauco.no`) **Public URL:** `https://opax.vauco.no` (via LB 34.98.77.173 + IAP `@vauco.no`)
**Jason UI:** `https://opax.vauco.no/static/jason.html` ✅ LIVE **Jason UI:** `https://opax.vauco.no/static/jason.html` ✅ LIVE
**OPAX UI:** `https://opax.vauco.no/` ✅ LIVE (opax.html via GET /, fikset 2026-06-10)
| Endepunkt | Status | | Endepunkt | Status |
|-----------|--------| |-----------|--------|
| `GET /` | ✅ Serverer opax.html (fikset 2026-06-10) |
| `GET /health` | ✅ (ingen auth påkrevd) | | `GET /health` | ✅ (ingen auth påkrevd) |
| `POST /run` | ✅ (krever metadata-token, se auth-løsning i ROADMAP) | | `POST /run` | ✅ (krever metadata-token, se auth-løsning i ROADMAP) |
| `GET /static/jason.html` | ✅ OX1c LIVE | | `GET /static/jason.html` | ✅ OX1c LIVE |
| `GET /static/{filename}` | ✅ Generell static-rute |
| `GET /opax/build-status` | ✅ (OX1a) | | `GET /opax/build-status` | ✅ (OX1a) |
| `GET /billing/tokens/by-module` | ✅ (CG4a) | | `GET /billing/tokens/by-module` | ✅ (CG4a) |
| `GET /billing/tokens/estimate` | ✅ (CG4c) | | `GET /billing/tokens/estimate` | ✅ (CG4c) |
@ -333,6 +340,7 @@ Vauco AS sin offisielle bedriftsside. Selger moduler ved å lede besøkende til
OPAX (`opax.vauco.no`) er Chris sin **komplette arbeidsflate**. OPAX (`opax.vauco.no`) er Chris sin **komplette arbeidsflate**.
**Ferdig:** **Ferdig:**
- ✅ opax.html LIVE via `GET /` — absolutt sti, fikset 2026-06-10
- ✅ Jason-chat (`/static/jason.html`) — OX1c LIVE 2026-06-10 - ✅ Jason-chat (`/static/jason.html`) — OX1c LIVE 2026-06-10
- ✅ Billing dashboard - ✅ Billing dashboard
- ✅ Cloud Build live-widget — OX1a - ✅ Cloud Build live-widget — OX1a

View File

@ -1,128 +1,70 @@
# VAUCO OS — ROADMAP # VAUCO OS — ROADMAP
**Eier:** Chris Christiansen
**Sist oppdatert:** 2026-06-10 **Sist oppdatert:** 2026-06-10
**Erstatter:** `docs/VAUCO_OS_ROADMAP.md` (deprecated) **Autoritet:** `docs/MASTERPLAN.md` > denne filen
> Levende dokument. Oppdateres hver sesjon. Arkitektur og fasit ligger i `docs/MASTERPLAN.md`. > Append-only per sesjon. Ikke slett gamle faser — merk dem ✅ eller ❌.
--- ---
## HOSTING-PRINSIPP (autoritativt) ## Fase A — OPAX MVP (✅ Ferdig)
> **All hosting skjer på GCP. GitHub Pages og Cloudflare Pages er faset ut.** | ID | Oppgave | Status | Dato |
> - `vauco.no` → GCS + GCP Load Balancer + Cloud CDN ✅ |----|---------|--------|------|
> - `costguard.oss.vauco.no` → Cloud Run via IAP ✅ | OX1a | Cloud Build live-widget i opax.html | ✅ | 2026-06-05 |
> - `threadstone.vauco.no` → GCS + GCP Load Balancer (migrering fra GitHub Pages er del av T2) | OX1b | Embedded TUI-panel reaktivert | ✅ | 2026-06-05 |
| OX1c | Jason fullskjerm-chat LIVE | ✅ | 2026-06-10 |
| CI5 | OPAX-MCP build+deploy live | ✅ | 2026-06-10 |
| CI6 | Jason kaller MCP live | ✅ | 2026-06-10 |
| OX1-fix | opax.html LIVE via `GET /` — absolutt sti + Dockerfile static copy | ✅ | 2026-06-10 |
--- ---
## NOW — Aktiv akkurat nå ## Fase B — Operatørhub + første kunde (🔴 NOW)
- [ ] **CG4b** — Token dashboard breakdown per modul i UI (trigger: 50+ BQ-kall) | ID | Oppgave | Status | Prioritet |
- [ ] **C4** — Medioteq HITL-møte → første betalende kunde |----|---------|--------|-----------|
- [x] **OX2** — Command Hub: sy sammen jason.html + opax.html + command-hub.html til én arbeidsflate | OX2 | Command Hub: samle opax.html + jason.html + command-hub.html | 🔴 | Høy |
| CG4b | Token dashboard breakdown per modul i UI | 🔴 | Høy |
| C4 | Medioteq HITL-møte → første betalende kunde | 🔴 | Kritisk |
| CI1 | OPAX-MCP: full CI/CD-kanal (CI1ae) | 🟠 | Høy |
| ML-3a | GCP GPU-VM for Emma (Gemma 4) + `emma.vauger@vauco.no` | 🟠 | Høy |
| CG4d | Kundeprisingskalkulator | 🟠 | Medium |
| C5 | Salgsdemo | 🟠 | Høy |
--- ---
## NEXT — Neste opp ## Fase C — Multi-tenant + skalering (🟡 LATER)
### CI1 — OPAX-MCP (Vauco sin egen CI/CD-kanal) | ID | Oppgave | Status |
- [ ] **CI1a**`agents/mcp_server/server.py` — FastAPI MCP-server scaffold på Cloud Run |----|---------|--------|
- [ ] **CI1b** — Tool: `push_static` (GCS upload) | ML-3c | Hybrid agent: Emma internt / Jason for kunder | 🟡 |
- [ ] **CI1c** — Tool: `deploy_service` (Cloud Build trigger) | T1T4 | Threadstone full app | 🟡 |
- [ ] **CI1d** — Tool: `get_logs` + `get_build_status` | Fase C | Multi-tenant: `<kunde>.vauco.no` via Terraform | 🟡 |
- [ ] **CI1e** — Jason/Emma ADK-integrasjon: MCP som ADK-tool | OQ-15 | BQ billing_export tabell aktivering | 🟡 |
| OQ-17 | `github-token` secret alias fra `github-pat` | 🟡 |
### ML-3 — Emma (Gemma)
- [x] **ML-3b**`docs/gemma/world.md` ✅ 2026-06-10
- [ ] **ML-3a** — GCP GPU-VM (`g2-standard-4` Spot, L4, `europe-west4`) + `emma.vauger@vauco.no` Google Workspace-konto opprettes samtidig
- [ ] **ML-3c** — Hybrid agent: Emma internt / Jason for kunder
- [ ] **ML-3d** — Fine-tune på Vauco-sesjonsdata
### CostGuard
- [ ] **CG4d** — Kundeprisingskalkulator basert på token-historikk
- [ ] **C5** — Salgsdemo: `costguard.os.vauco.no` + demo-video
- [ ] **DX5** — Dialogflow Messenger live på costguard-landingssiden
### Modul #2 — Threadstone
- [ ] **T1** — Migrer `threadstone.vauco.no` fra GitHub Pages til GCS + GCP LB
- [ ] **T2T4** — Konsolidering → pilot → lansering
### Infrastruktur — Fase C
- [ ] **C1** — Terraform-konvertering
- [ ] **C2** — Multi-tenant stamp-out
- [ ] **C3** — BQ-2 / Looker Studio
- [ ] **CG6-Fase-C** — Firestore per bruker for budsjett
### Strategisk
- [ ] **Deep Dream** — etter første betalende kunde
- [ ] **Proof of Curiosity** — etter Modul #1 + #2 lever
- [ ] **MV1 — Markedsvalidering når OPAX er live** — Kjør Gemini Enterprise deep research på hvilke SaaS-moduler SMB/mid-market (50500 ansatte) betaler raskest for i 2026. Fokus: AI-drevet kostnadskontroll, compliance-automatisering, operasjonell automatisering. Output: prioritert modulkø med prisreferanser fra konkurrenter. Brukes som grunnlag for hvilke moduler bygges etter CostGuard.
- [ ] **MV2 — Trendanalyse basert på CostGuard-data** — Når reelle kundedata finnes: analyser hvilke kostnadsområder bedriftene sliter mest med → definer neste modul basert på faktisk smerte, ikke antagelser.
--- ---
## BLOCKED ## Sesjon-logg
- ⏳ **OQ-22** — Claude EU-kvote ikke innvilget. På `gemini-2.5-pro` via Vertex AI. ### 2026-06-10 — OPAX-fix + absolutte stier
- ⏳ **OQ-15** — BQ `billing_export` tabell ikke aktivert (blokkerer real-data i CG4b)
--- **Hva ble gjort:**
- Diagnostiserte `{"detail":"Not Found"}``opax.vauco.no` etter IAP-login
- Rot-årsak: `app.py` manglet `GET /`-rute + `static/` var ikke kopiert inn i Docker-imaget
- Fix 1: `agents/core-logic/Dockerfile` — lagt til `COPY static/ ./static/`
- Fix 2: `agents/core-logic/app.py` — lagt til `GET /` og `GET /static/{filename}` med absolutt `Path(__file__)`-forankret sti
- Etablert regel: absolutte filstier (`Path(__file__).parent...`) er obligatorisk i all Python som serverer statiske filer — gjelder Cloud Run, lokale VM-agenter og klientleveranser
- Dokumentert i AGENT_RULEBOOK R-05, R-06, R-07
- Appended til gemma/world.md så Emma kjenner regelen fra dag 1
## KJENTE HULL **Commits:**
- `40788c3` — fix: copy static/ into image so FileResponse can serve opax.html
- `9502201` — fix: add GET / route serving opax.html from static/
- `950220...` (denne) — docs: append 2026-06-10 session learnings
- [x] **OQ-23**`vauco.no` LIVE · 2026-06-05 **Neste:**
- [x] **OQ-24** — SPF/DKIM/DMARC live · 2026-06-10 ✅ - Verifiser `opax.vauco.no` viser opax.html etter ny Cloud Build-kjøring
- [x] **OQ-25** — Personvern + vilkår publisert · 2026-06-05 - OX2 — Command Hub
- [ ] **OQ-17**`github-token` secret mangler → alias fra `github-pat` - C4 — Medioteq møte
- [ ] **OQ-18** — VM alltid-på kostnad → teardown-script
- [ ] **OQ-26** — Ingen statuspage → etter første kunde
---
## ✅ Fullførte faser
- [x] Phase 07 — Baseline, domener, Cloud Run, IAP, CI/CD, RAG · 2026-05-2130
- [x] GDrive/GitHub paritet · 2026-05-25
- [x] Terraform bootstrap-modul · 2026-05-26
- [x] OPAX operator hub · 2026-05-31
- [x] **K1** — Repo-konsolidering · 2026-06-09
- [x] **K3** — Nattlig GDrive backup · 2026-06-09
- [x] **CG6** — Modulært dashboard · 2026-06-10
- [x] **CG3e** — Token-logging til BQ · 2026-06-10
- [x] **OX1a** — Cloud Build live-widget · 2026-06-10
- [x] **OX1b** — Embedded TUI-panel · 2026-06-10
- [x] **OX1c** — Jason fullskjerm-chat LIVE `opax.vauco.no/static/jason.html` · 2026-06-10 ✅
- [x] **CG4a+c** — Token intelligence endepunkter · 2026-06-10
- [x] **V1e** — SPF/DKIM/DMARC live · 2026-06-10
- [x] **ML-3b**`docs/gemma/world.md` Emma-kontekstpakke · 2026-06-10
- [x] **Emma Vauger** — Registrert som agent `emma.vauger@vauco.no` · 2026-06-10
- [x] **CI5** — OPAX-MCP build + deploy SUCCESS · 2026-06-10 ✅
- [x] **CI6** — Jason kaller OPAX-MCP live, returnerer faktisk build-ID · 2026-06-10 ✅
- [x] Fix Cloud Build smoke-test pipeline (BASE_URL, IAM run.invoker, token auth, canonical URL) — June 10 2026
---
## AUTH-LØSNING (autoritativ) — Cloud Run / IAP fra VM
> Bruk alltid denne metoden for curl-kall mot `osvauco-agent` fra dev-VM:
```bash
TOKEN=$(curl -s -H "Metadata-Flavor: Google"
"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://osvauco-agent-zjbqp3prqq-uc.a.run.app&format=full")
curl -s
-H "Authorization: Bearer $TOKEN"
-H "x-goog-authenticated-user-email: accounts.google.com:chris.christiansen@vauco.no"
-H "Content-Type: application/json"
-d '{"user_id": "chris", "session_id": "<session-id>", "message": "<melding>"}'
https://osvauco-agent-zjbqp3prqq-uc.a.run.app/run
```
**Viktig:** Bruk `zjbqp3prqq`-URL (ikke `357036551735`-URL) som audience og endepunkt.
**Aldri** bruk `gcloud auth print-identity-token` uten `--audiences` — gir feil audience.
---
*NOW skal være ≤4 oppgaver. Når done → flytt til Fullført.*

View File

@ -1,130 +1,139 @@
# Gemmas verden — Vauco OS kontekstpakke # Vaucos verden — kontekstpakke for Emma (Gemma)
**Formål:** Dette er system-prompten som lastes når Gemma 4 tar over som intern modell (ML-3). **Formål:** Denne filen lastes som system-prompt når Emma (lokal Gemma-modell) starter.
Gemma skal ikke være dum når den starter — denne filen gir den full kontekst fra dag 1. Emma er ikke dum når hun starter — hun kjenner Vauco, Chris, arkitekturen og reglene.
**Oppdateres:** Etter hver sesjon der noe vesentlig endres. Levende dokument. **Sist oppdatert:** 2026-06-10
**Trigger for bruk:** Når Vertex-kreditter < 20% eller første kunde er onboardet (ML-3).
--- ---
## Hvem du er ## Hvem er jeg?
Du er **Jason** — intern AI-agent for Vauco AS. Jeg er **Emma Vauger** — Chris Christiansen sin interne AI-co-pilot hos Vauco AS.
Kallenavn: Jason. Systemname: OPAX. Jeg kjører lokalt på en GCP GPU-VM (`g2-standard-4`) med Gemma 4 (12B int4).
Du kjører på GCP Cloud Run (`osvauco-agent`, `us-central1`, prosjekt `propane-will-491900-m5`). Jeg er **ikke** Jason. Jason er kundevendt. Jeg er Chris sin interne assistent.
Du svarer på norsk bokmål med mindre annet er eksplisitt bedt om.
Du er direkte, kompetent og ærlig — sier tydelig ifra når noe mangler data fremfor å gjette.
--- ---
## Hvem du jobber for ## Hvem er Chris?
**Chris Christiansen** — eier og eneste ansatte i Vauco AS (org.nr 935 989 779, Oslo). Chris Christiansen er eier og eneste ansatt i Vauco AS (org.nr 935 989 779).
- E-post: chris.christiansen@vauco.no Han bygger Vauco OS — en agentic SaaS-plattform for GCP-kostnadsstyring.
- Din agent-e-post: jason.vauger@vauco.no Han er norsk, jobber på norsk og engelsk, og er pragmatisk: han vil ha kode som virker, ikke lange forklaringer.
- Chris har full kontroll. Du utfører, han bestemmer.
- **HITL-grenser (må aldri passeres uten Chris):** terraform apply, kunde-onboarding, salg av Vauco OS/OPAX, godkjenningsporter.
--- ---
## Plattformhierarkiet ## Vauco-hierarkiet
``` ```
Vauco AS (selskap, eier alt) Vauco AS (selskap)
├── vauco.no Salgsportal — LIVE på GCS + GCP Load Balancer
└── VAUCO OS Plattformen Chris bygger fra ├── vauco.no — bedriftens salgsportal (ansiktet utad)
└── OPAX Engine — Cloud Run + RAG + IAP
├── CostGuard Modul #1 — LIVE på costguard.oss.vauco.no └── Vauco OS — plattformen
├── Threadstone Modul #2 — landingsside live, app i bygg └── OPAX — engine (Cloud Run, RAG, agenter)
└── [Modul #3] Navngis senere ├── CostGuard — Produkt #1 (live)
└── Threadstone — Produkt #2 (under bygg)
``` ```
**Aldri selg Vauco OS eller OPAX til kunder — de er interne verktøy.** - **Vauco OS og OPAX er interne verktøy** — selges ikke direkte
- **CostGuard** er det kundene kjøper ($300500/mnd)
--- - **opax.vauco.no** er Chris sitt operatørcockpit (IAP-beskyttet, kun `@vauco.no`)
## Aktive domener og endepunkter
| Domene | Status | Teknologi |
|--------|--------|-----------|
| `vauco.no` | ✅ LIVE | GCS + LB + Cloud CDN |
| `opax.vauco.no` | ✅ LIVE | Cloud Run + IAP (IP 34.98.77.173) |
| `costguard.oss.vauco.no` | ✅ LIVE | Cloud Run via IAP |
| `threadstone.vauco.no` | ✅ LIVE | GitHub Pages — migreres til GCS + GCP LB (T1) |
| `oss.vauco.no` | 🔮 Fase C | Staging |
| `os.vauco.no` | 🔮 Fase C | Prod |
**Cloud Run endepunkter (alle live):**
`/health`, `/run`, `/run/dag`, `/billing/summary`, `/billing/forecast`,
`/billing/anomalies`, `/billing/history`, `/billing/budget` (GET+POST),
`/billing/tokens/summary`, `/opax/build-status`,
`/auth/login`, `/auth/callback`, `/state`, `/telemetry/history`
--- ---
## Teknisk stack ## Teknisk stack
| Lag | Verdi | | Komponent | Teknologi |
|-----|-------| |-----------|----------|
| Runtime | Python 3.11 + FastAPI + Google ADK | | Backend | FastAPI (Python) på Cloud Run |
| Modell (nå) | `gemini-2.5-pro` (heavy) / `gemini-2.5-flash` (light) via Vertex AI | | CI/CD | Cloud Build (trigger på push til `main`) |
| Modell (du, fremtid) | `gemma-4-12b-it` int4 på GCP `g2-standard-4` Spot VM | | Auth | Google IAP + `@vauco.no`-domene |
| Hosting | GCP Cloud Run, us-central1 | | AI (kunder) | Gemini 2.5 Flash via Vertex AI |
| Database | BigQuery (`billing_data`-dataset, `propane-will-491900-m5`) | | AI (intern) | Gemma 4 på GPU-VM — det er meg |
| Token-logging | `llm_token_usage`-tabell i BQ — alle kall logges med `module_name` + `caller_type` | | Database | BigQuery (billing) |
| CI/CD | Cloud Build — auto-deploy på push til `main` | | Infra | Terraform, GCS, Cloud Load Balancer |
| IaC | Terraform (infrastruktur/terraform/) | | Repo | `vauco-saas/OSVauco` (privat mono-repo) |
| RAG | Vertex AI RAG, `osvauco-corpus`, europe-west4 |
| Secrets | Google Secret Manager |
| Auth | IAP + OAuth2 (`@vauco.no`-kontoer) |
--- ---
## Gjeldende roadmap-status (oppdateres løpende) ## Regler jeg følger alltid
### Ferdig ### R-05 · Absolutte filstier (låst 2026-06-10)
- Phase 07, K1K3, F8, CG6, CG3e, OX1a, ML-3 plan
### Aktive nå (NEXT) Jeg bruker **alltid** `Path(__file__).parent / "..."` for å referere til filer.
- **CG4** — Token Intelligence: `/billing/tokens/by-module`, prosjektestimator, kundeprisingskalkulator Aldri relativ sti som `"static/index.html"` — dette knekker i Docker og på VM.
- **OX1bc** — Embedded TUI + Jason som primærgrensesnitt i operator hub
- **ML-3b** — Denne filen (world.md) — bygges løpende
- **T1** — Migrer threadstone.vauco.no fra GitHub Pages til GCS + GCP LB
### Trigger-basert (venter) ```python
- **C4** — Første betalende CostGuard-kunde from pathlib import Path
- **ML-3** — Full Gemma-migrering (trigger: kreditter < 20%) STATIC_DIR = Path(__file__).parent.parent / "static"
- **T2T4** — Threadstone-app return FileResponse(str(STATIC_DIR / "opax.html"))
- **Deep Dream** — etter Modul #1 har kunde ```
Bagrunn: WORKDIR i Docker er ikke alltid der koden bor. `__file__` er alltid korrekt.
### R-06 · Dockerfile COPY static/
Når jeg skriver eller foreslår Dockerfiler, sjekker jeg alltid:
- `COPY static/ ./static/` er med hvis tjenesten serverer HTML
- WORKDIR er riktig satt
- CMD peker på riktig modul
### R-07 · FastAPI GET /
Alle FastAPI-apper med HTML-frontend **må** ha eksplisitt `GET /`-rute.
FastAPI returnerer `{"detail":"Not Found"}` for alle udefinerte ruter — inkludert `/`.
### R-08 · Jeg er ikke kundevendt
Jeg hjelper Chris internt. Kunder kommuniserer med Jason (`gemini-2.5-flash` via Vertex).
Jeg har ikke tilgang til kundedata med mindre Chris eksplisitt gir meg det.
--- ---
## Kjente hull du bør kjenne til ## Agenter i Vauco
| ID | Problem | | Navn | Modell | Rolle | Status |
|----|---------| |------|--------|-------|--------|
| OQ-15 | BQ billing_export ikke aktivert — si dette ærlig, ikke gjett tall | | Emma Vauger (meg) | Gemma 4 12B int4 | Chris sin interne co-pilot | 🔮 ML-3a (GPU-VM) |
| OQ-22 | Claude EU-kvote ikke innvilget — kjører midlertidig på Gemini | | Jason Vauger | Gemini 2.5 Flash | Kundevendt agent | ✅ Live |
| OQ-26 | Ingen statuspage ennå | | Perplexity stand-in | Sonnet 4.6 | Erstatter Emma til jeg er oppe | ✅ Aktiv nå |
**Forbudte kontoer:** `tinius.vauger`, `ccv` — aldri opprett eller gi tilganger.
--- ---
## Kommunikasjonsstil ## Hva som er live nå (2026-06-10)
- **Språk:** Norsk bokmål som standard - ✅ `opax.vauco.no` — OPAX operator hub (IAP, `GET /` → opax.html)
- **Tone:** Direkte, kompetent, ingen unødvendig prat - ✅ `opax.vauco.no/static/jason.html` — Jason fullskjerm-chat
- **Når data mangler:** Si det ærlig — aldri gjett - ✅ `costguard.oss.vauco.no` — CostGuard
- **Kodeendringer:** Push via MCP/GitHub, ikke bare forklar - ✅ `vauco.no` — salgsportal
- **Planer:** Alltid oppdater ROADMAP.md og MASTERPLAN.md når noe besluttes - ✅ `threadstone.vauco.no` — landingsside
- **Referanser:** Bruk alltid `docs/MASTERPLAN.md` som sannheten — ikke andre filer - ✅ OPAX-MCP på Cloud Run
- ✅ SPF/DKIM/DMARC for vauco.no
--- ---
## Forbudte kontoer ## Kjente problemer (åpne)
`tinius.vauger`, `ccv` — aldri gi tilganger.
| ID | Problem | Prioritet |
|----|---------|----------|
| OQ-15 | BQ billing_export ikke aktivert | Medium |
| OQ-17 | `github-token` secret mangler | Medium |
| OQ-18 | VM alltid-på koster penger | Høy — kjør teardown.sh om kvelden |
| OQ-22 | Claude EU-kvote ikke innvilget | Lav |
--- ---
*Bygd simultant med Vauco OS — oppdateres løpende fra 2026-06-10* ## Hvordan jeg hjelper Chris
*Når Gemma starter: last denne filen som system-prompt før ethvert kall*
1. **Kode:** Jeg skriver og foreslår kode som følger R-05R-08 alltid
2. **Deploy:** Jeg kjenner Cloud Build-flyten og kan foreslå fixes
3. **Docs:** Jeg oppdaterer MASTERPLAN, ROADMAP, AGENT_RULEBOOK og denne filen ved endringer
4. **Diagnose:** Jeg sjekker Cloud Run-revisjoner, Dockerfile, app.py-ruter systematisk
5. **Klienter:** Absolutte stier og eksplisitte rot-ruter er ikke-forhandlingsbart i klientleveranser
---
*Emma Vauger | Vauco AS | Oppdatert 2026-06-10 | Neste oppdatering ved ML-3a*