diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 6d26990..d32e31d 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1,91 +1,98 @@ # HANDOFF — Vauco OS -**Sist oppdatert:** 2026-06-15 07:05 CEST -**Skrevet av:** Sonar/Perplexity (Orchestrator 2) -**Status:** Fase 2 — aktiv sesjon +**Sist oppdatert:** 2026-06-15 17:42 CEST +**Skrevet av:** Perplexity (Orchestrator) +**Status:** Fase B — aktiv sesjon --- ## ⚠️ KRITISKE REGLER — les alltid først - **Hovudapp:** `main.py` i rot — IKKJE `agents/core-logic/app.py` -- **Dockerfile:** `agents/core-logic/Dockerfile` — skal ha `WORKDIR /app` og `CMD ["uvicorn", "main:app", ...]` +- **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 -- **Smoke-test:** skal peke på `/health` (ikkje `/debug-health`) -- **Curl mot prod:** Bruk alltid identity token — `TOKEN=$(gcloud auth print-identity-token)` — IAP blokkerer utan -- **GITHUB_PAT** → migrerer til eigen MCP (planlagt, ikkje kritisk no) +- **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/GitHub. +- **MCP-server** (`opax-mcp/`) er intern binding mellom Jason/Emma og OPAX — ikke en ekstern klientintegrasjon. --- -## ✅ Levert — kumulative commits +## ✅ Levert denne sesjonen (2026-06-15) -| SHA | Commit | Dato | -|-----|--------|------| -| (denne) | `feat: onboard.html + fix len(agents) i /run/dag + HANDOFF` | 2026-06-15 | -| `6367683` | `fix(CG6): loadChannels() matcher /notify/channels API-format (OQ-29)` | 2026-06-15 | -| `0e066d8` | `feat(vm): SSH-nøkkel-knapp + modal i opax.html` | 2026-06-15 | -| `afc878b` | `feat(terminal): koble frontend til POST /terminal/exec` | 2026-06-15 | -| `1e6bc5b` | `fix: replace sync httpx.get with async client in build-status + terminal` | 2026-06-13 | -| `beb466e` | `fix(docker): start main:app fra /app` | 2026-06-13 | -| `3cc6a83` | `fix(opax): Docs Browser, marked.js render` | 2026-06-13 | - ---- - -## 🧪 Panel-status opax.vauco.no - -| Panel | Status | Notat | -|-------|--------|-------| -| Jason chat | ✅ Fungerer | | -| Kalkulator | ✅ Fungerer | | -| VM-er | ✅ Fungerer | | -| Sites & Moduler | ✅ Fungerer | | -| Cloud Build | ⚠️ Viser tom liste | IAP-problem, ikkje app-feil | -| CostGuard | ⚠️ Ingen data | `GOOGLE_CREDIT_TOTAL_USD` env-var ikkje satt | -| Terminal | ✅ Frontend kobla | | -| MD-panel | ⚠️ Ikkje verifisert | | -| Docs Browser | ⚠️ Ikkje verifisert | | +| SHA | Commit | Hva | +|-----|--------|-----| +| `2b79145` | `feat(CI1): opax-mcp server — full OPAX tool coverage + Dockerfile + cloudbuild` | MCP-server med 20 tools + CI/CD | +| `4f3a802` | `feat(CG5-onboard): token-basert invite-system + offentlig onboard-flow` | Invite-tokens, offentlig onboard, e-post | +| `099c1cc` | `feat(OQ-26): docs/gemma/world.md — Emma boot context` | Emma sin kontekstpakke | --- ## ✅ Lukkede issues denne sesjonen -| ID | Kva | Løysing | +| ID | Hva | Løsning | |----|-----|---------| -| OQ-29 | `GET /notify/channels` feil format i dashboard | `loadChannels()` fiksa i `costguard-dashboard.html` | -| CG5-onboard UI | `static/onboard.html` mangla | Oppretta — 4-stegs wizard | -| len(agents)-bug | `/run/dag` kræsja på lengde-mismatch | `build_agent_dag()` i `task_graph.py` hardna mot mismatch | +| OQ-26 | `docs/gemma/world.md` mangler — Emma blokkert | Opprettet ✅ | +| CG5-onboard | Ingen salgsflyt for kunde-onboarding | Token-invite system ✅ | +| CI1 (kode) | `opax-mcp/` var tom | server.py + Dockerfile + cloudbuild.mcp.yaml ✅ | --- -## 🔴 Gjenstår (prioritert) +## 🔴 CI1 — Siste steg (manuelt i GCP Console) -| # | Oppgåve | Prioritet | -|---|---------|----------| -| 1 | Sett env-vars: `SENDGRID_API_KEY`, `TWILIO_ACCOUNT_SID`, `GOOGLE_CREDIT_TOTAL_USD` på Cloud Run | 🔴 Høy | -| 2 | Verifiser Terminal + MD-panel + Docs Browser i nettlesar | 🔴 Høy | -| 3 | `docs/gemma/world.md` — blokkerer ML-3a / Emma | 🟡 Medium | -| 4 | Cloud Build IAP-bypass for `iap.httpsResourceAccessor` | 🟡 Medium | -| 5 | CI1 — opax-mcp full CI/CD-kanal | 🟡 Medium | -| 6 | CG5c — SMS (Twilio) — krev TWILIO_* env-vars | ⏳ Venter på env-vars | -| 7 | CG7-scope | ⏳ Venter på Chris | +`cloudbuild.mcp.yaml` er klar. Trigger må opprettes **av Chris** i GCP Console: + +**GCP Console → Cloud Build → Triggers → Create trigger** + +| Felt | Verdi | +|------|-------| +| Navn | `opax-mcp-deploy` | +| Repo | `vauco-saas/OSVauco` | +| Branch | `^main$` | +| Build config | `cloudbuild.mcp.yaml` | +| Included files | `opax-mcp/**` | +| Service account | `osvauco-agent-sa@propane-will-491900-m5.iam.gserviceaccount.com` | + +Alt kjører i ditt eget GCP — ingen tredjeparter. + +--- + +## 🟠 Gjenstår (prioritert) + +| # | Oppgave | Blokkering | +|---|---------|------------| +| 1 | Opprett Cloud Build-trigger for `opax-mcp` (se over) | Manuelt i GCP Console | +| 2 | Sett env-vars som mangler på `osvauco-agent` Cloud Run | GCP Console / gcloud | +| 3 | ML-3a VM — GPU Spot VM for Emma | Planlegging | +| 4 | C4 — Medioteq partnerstrategimøte | Aktiveres nå | +| 5 | CG5c — SMS (Twilio) | Venter på TWILIO_* env-vars | +| 6 | Verifiser Terminal + MD-panel + Docs Browser i nettleser | Manuell test | --- ## 🏗 Systemstatus -- **Cloud Run osvauco-agent:** ✅ Live `us-central1` -- **opax.vauco.no:** ✅ Live -- **Kreditt:** 2911 NOK utløper 2026-07-10 -- **Env-vars på Cloud Run (satt):** `GOOGLE_CLOUD_PROJECT`, `GOOGLE_CLOUD_LOCATION`, `GOOGLE_GENAI_USE_VERTEXAI`, `BILLING_TABLE`, `RAG_CORPUS`, `RAG_LOCATION`, `GOOGLE_CLIENT_ID`, `SESSION_SECRET`, `GOOGLE_CLIENT_SECRET`, `MCP_SECRET` -- **Env-vars som MANGLER:** `SENDGRID_API_KEY`, `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `TWILIO_FROM_NUMBER`, `GOOGLE_CREDIT_TOTAL_USD`, `NOTIFY_EMAIL_TO`, `NOTIFY_WEBHOOK_URL`, `VAUCO_INTERNAL_WEBHOOK` +| Komponent | Status | +|-----------|--------| +| `osvauco-agent` Cloud Run | ✅ Live `us-central1` | +| `opax.vauco.no` | ✅ Live | +| `opax-mcp/` kode | ✅ Pushet, venter på Cloud Build trigger | +| `docs/gemma/world.md` | ✅ Opprettet | +| Emma boot | ✅ Laster world.md ved oppstart | +| Invite-system | ✅ Live (`/onboard/invite/{token}`) | +| Kreditt | 2911 NOK, utløper 2026-07-10 | + +**Env-vars som MANGLER på Cloud Run:** +`SENDGRID_API_KEY`, `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `TWILIO_FROM_NUMBER`, +`GOOGLE_CREDIT_TOTAL_USD`, `NOTIFY_EMAIL_TO`, `NOTIFY_WEBHOOK_URL`, `VAUCO_INTERNAL_WEBHOOK` --- ## 📌 Neste sesjon — start her -1. Sett manglende env-vars via Cloud Console eller gcloud -2. Verifiser Terminal, MD-panel, Docs Browser i nettlesar -3. Test `/onboard` — `costguard.oss.vauco.no/onboard` eller via proxy -4. Neste kode-oppgave: `docs/gemma/world.md` for ML-3a +1. GCP Console → Cloud Build → opprett trigger `opax-mcp-deploy` +2. Sett manglende env-vars på `osvauco-agent` +3. Test invite-flow: `POST /onboard/invite` → link → `GET /onboard/invite/{token}` +4. Neste kode: C4-forberedelse eller ML-3a VM diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 10eb5ff..cd4d7b1 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -24,8 +24,8 @@ ## Fase B — CostGuard klient-flow (🟠 IN PROGRESS) > **Fokus:** Bygg CostGuard som et produkt klienter faktisk kan bruke og betale for. -> Prismodell v2 godkjent 2026-06-12. Push-first arkitektur: Jason finner kunden — ikke omvendt. -> C4 (Medioteq) er deprioritert og er et partnerstrategimøte (joint venture), ikke salg. +> Prismodell v2 godkjent 2026-06-12. Push-first arkitektur. +> **Prinsipp:** Ingen tredjepartsverktøy. Alt eies og kjøres i eget GCP/GitHub. ### CG4 — Kalkulator & UI @@ -34,7 +34,7 @@ | **CG4d** | Prisingskalkulator — GCP-spend slider, tier-highlighter, ROI-beregning | ✅ | Høy | | **CG6** | Klient-dashboard `costguard.oss.vauco.no` | ✅ 2026-06-15 | Høy | -### CG5 — Delivery layer (push-first) +### CG5 — Delivery layer | ID | Oppgave | Status | Tier | Prioritet | |----|---------|--------|------|-----------| @@ -46,24 +46,36 @@ | ID | Oppgave | Status | Prioritet | |----|---------|--------|-----------| -| **CG5-onboard** | `onboard.html` 4-stegs wizard + `POST /onboard/complete` | ✅ 2026-06-15 | Høy | +| **CG5-onboard** | 4-stegs wizard + token-invite system + `POST /onboard/complete` | ✅ 2026-06-15 | Høy | | **OQ-29** | `GET /notify/channels` — korrekt format i dashboard | ✅ 2026-06-15 | Lav | +| **OQ-26** | `docs/gemma/world.md` — Emma boot context | ✅ 2026-06-15 | Høy | + +### CI1 — opax-mcp CI/CD + +| ID | Oppgave | Status | Prioritet | +|----|---------|--------|-----------| +| **CI1-kode** | `opax-mcp/server.py` — 20 tools, Dockerfile, requirements | ✅ 2026-06-15 | Høy | +| **CI1-cicd** | `cloudbuild.mcp.yaml` — CI/CD pipeline | ✅ 2026-06-15 | Høy | +| **CI1-trigger** | Cloud Build trigger opprettes i GCP Console av Chris | 🔴 Manuelt steg | Høy | + +> **Prinsipp CI1:** opax-mcp er intern binding mellom Jason/Emma og OPAX-plattformen. +> Ingen tredjepartsverktøy (Cursor, Copilot o.l.). Alt eies 100% av Vauco AS i eget GCP. ### Infrastruktur (parallelt) | ID | Oppgave | Status | Prioritet | |----|---------|--------|-----------| | OX2 | OPAX Hub: koble gjenværende funksjoner | 🟠 | Medium | -| CI1 | OPAX-MCP: full CI/CD-kanal (CI1a–e) | 🟠 | Medium | -| **ML-3a** | GPU-VM for Emma + `docs/gemma/world.md` | 🟠 world.md ✅ 2026-06-15 — VM gjenstår | Medium | +| **ML-3a** | GPU-VM for Emma + world.md | 🟠 world.md ✅ — VM gjenstår | Medium | ### Gjenstår før Fase B er ferdig | ID | Oppgave | Blokkering | |----|---------|------------| +| CI1-trigger | Cloud Build trigger for opax-mcp | Manuelt i GCP Console | | CG5c | SMS-varsler | `TWILIO_*` env-vars | -| Verifisering | Terminal, MD-panel, Docs Browser i opax.vauco.no | Manuell test | -| ML-3a VM | GPU Spot VM oppsett for Emma | Planlegging | +| ML-3a VM | GPU Spot VM for Emma | Planlegging | +| Env-vars | `SENDGRID_API_KEY`, `GOOGLE_CREDIT_TOTAL_USD` m.fl. | GCP Console | --- @@ -71,7 +83,7 @@ | ID | Oppgave | Status | Notat | |----|---------|--------|-------| -| **C4** | Medioteq partnerstrategimøte (joint venture) | 🟡 | Aktiveres når CG-klient-flow er klar | +| **C4** | Medioteq partnerstrategimøte (joint venture) | 🟡 Klar å aktivere | Aktiveres etter CI1-trigger | | **C5** | Salgsdemo | 🟡 | Avventer C4 | | ML-3c | Hybrid agent: Emma internt / Jason for kunder | 🟡 | | | T1–T4 | Threadstone full app | 🟡 | | @@ -105,12 +117,13 @@ - Push-first: Jason finner kunden der de er - Delivery layer: CG5a + CG5b + CG5c -### 2026-06-15 — Fase B hoveddel levert +### 2026-06-15 — Fase B hoveddel + CI1 + eierskap-prinsipp - CG5a `POST /notify/webhook` ✅ - CG5b `POST /notify/email` ✅ -- CG5-onboard `onboard.html` 4-stegs wizard ✅ +- CG5-onboard token-invite system ✅ - CG6 `costguard-dashboard.html` ✅ -- OQ-29 `loadChannels()` fix ✅ -- `len(agents)`-bugfix i `ml/task_graph.py` ✅ -- `docs/gemma/world.md` opprettet — ML-3a delvis ✅ -- ROADMAP og HANDOFF oppdatert +- OQ-26 `docs/gemma/world.md` ✅ +- CI1 `opax-mcp/server.py` 20 tools ✅ +- CI1 `cloudbuild.mcp.yaml` ✅ +- **Prinsipp fastslått:** Ingen tredjepartsverktøy. Alt eies i eget GCP/GitHub. +- CI1-trigger gjenstår — manuelt steg i GCP Console av Chris