docs: korriger mappestruktur i MASTERPLAN + oppdater HANDOFF med faktisk repo-layout [2026-06-12]
This commit is contained in:
parent
7aa73842d4
commit
9783ed10f8
138
docs/HANDOFF.md
138
docs/HANDOFF.md
|
|
@ -1,8 +1,8 @@
|
|||
# HANDOFF — Vauco OS
|
||||
|
||||
**Sist oppdatert:** 2026-06-12 16:09 CEST
|
||||
**Sist oppdatert:** 2026-06-12 16:16 CEST
|
||||
**Skrevet av:** Perplexity (stand-in) via GitHub MCP
|
||||
**Sprint:** CostGuard prismodell v2 + push-first arkitektur + delivery layer definert
|
||||
**Sprint:** Mappestruktur korrigert — main.py er hovudapp, opax-mcp/ er MCP-server
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -10,15 +10,11 @@
|
|||
|
||||
| Task | Detalj |
|
||||
|------|--------|
|
||||
| **MASTERPLAN seksjon 10** | Prismodell v2 godkjent og pushet — Starter $499 / Guard $999 / Shield $1.999 / Enterprise $3.500+ |
|
||||
| **Tier-grenser** | Basert på kundens GCP-spend (ikke token-volum) — $0–3k / $3–15k / $15–50k / >$50k |
|
||||
| **Feature-spec per tier** | Full feature-liste per tier definert og låst i MASTERPLAN |
|
||||
| **Push-first arkitektur** | Konsept: "Jason finner kunden — ikke omvendt". Delivery layer definert |
|
||||
| **Delivery layer** | Tre kanaler: CG5a webhook / CG5b e-post / CG5c SMS |
|
||||
| **Nye endepunkter definert** | `POST /notify/webhook`, `POST /notify/email`, `POST /notify/sms` — ikke bygget ennå |
|
||||
| **Markedsposisjon** | Dokumentert mot Kubecost ($199) / Cloudability ($1.930) / CloudHealth ($5.400+) |
|
||||
| **ROADMAP oppdatert** | CG4d + CG5a + CG5b + CG5c + CG5-onboard lagt til som 🔴 NOW |
|
||||
| **Commit** | [`c312f4a`](https://github.com/vauco-saas/OSVauco/commit/c312f4a7274f65eb213477956854977df10d7a7a) |
|
||||
| **MASTERPLAN seksjon 10** | Prismodell v2: Starter $499 / Guard $999 / Shield $1.999 / Enterprise $3.500+ |
|
||||
| **Push-first arkitektur** | Delivery layer: CG5a webhook + CG5b e-post + CG5c SMS |
|
||||
| **Mappestruktur korrigert** | Verifisert mot GitHub API — main.py er hovudapp, opax-mcp/ er MCP-mappa |
|
||||
| **MASTERPLAN seksjon 4** | Korrekt repo-layout dokumentert med alle faktiske mapper |
|
||||
| **Commits** | [`c312f4a`](https://github.com/vauco-saas/OSVauco/commit/c312f4a7274f65eb213477956854977df10d7a7a) + [`7aa7384`](https://github.com/vauco-saas/OSVauco/commit/7aa73842d46b2b65610358c0ff8e456b2189e7f4) |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -26,34 +22,21 @@
|
|||
|
||||
| Task | Detalj |
|
||||
|------|--------|
|
||||
| **CG4b** | Chart.js donut live — `renderDonut()`, 8-farge palett, DOM-safe |
|
||||
| **Build 2f385fe3** | ✅ Grønt — commit `87345b1` |
|
||||
| **Medioteq presisert** | Joint venture, ikke SaaS-kunde — alle filer oppdatert |
|
||||
| **C4 deprioritert** | Partnerstrategimøte, aktiveres etter CostGuard klient-flow |
|
||||
| **CG4b** | Chart.js donut live — build 2f385fe3 ✅ |
|
||||
| **Medioteq** | Joint venture presisert — ikke SaaS-kunde |
|
||||
|
||||
---
|
||||
|
||||
## 🔴 NOW — Neste oppgaver (prioritert rekkefølge)
|
||||
## 🔴 NOW — Neste oppgaver (prioritert)
|
||||
|
||||
| ID | Oppgave | Prioritet | Byggetid | Notat |
|
||||
|----|---------|-----------|----------|-------|
|
||||
| **CG5a** | Delivery layer + webhook — `POST /notify/webhook` → Slack/Teams/Chat/Discord | 🔴 Høy | 2–3t | Gir Starter-tieren verdi umiddelbart |
|
||||
| **CG4d** | Prisingskalkulator i `opax.html` — GCP-spend slider, tier-highlight, ROI | 🔴 Høy | 2t | Selger produktet visuelt |
|
||||
| **CG5b** | E-post digest — SendGrid, daglig + månedlig rapport | 🔴 Høy | 2t | Starter-tier inkludert |
|
||||
| **CG5c** | SMS-varsler — Twilio, kun kritiske spikes | 🔴 Medium | 2t | Guard+ |
|
||||
| **CG5-onboard** | Klient-onboarding flow — provisjonering + kanal-oppsett | 🔴 Høy | 1–2d | Kobler alt sammen |
|
||||
| **CG6** | Klient-dashboard på `costguard.oss.vauco.no` | 🔴 Høy | 2–3d | Frontend mot eksisterende API |
|
||||
|
||||
---
|
||||
|
||||
## 🟠 NEXT (etter Fase B)
|
||||
|
||||
| ID | Oppgave |
|
||||
|----|---------|
|
||||
| CI1 | OPAX-MCP full CI/CD-kanal (CI1a–e) |
|
||||
| ML-3a | GPU-VM for Emma (Gemma 4) + `emma.vauger@vauco.no` |
|
||||
| C4 | Medioteq partnerstrategimøte |
|
||||
| C5 | Salgsdemo |
|
||||
| ID | Oppgave | Fil | Byggetid |
|
||||
|----|---------|-----|----------|
|
||||
| **CG5a** | `POST /notify/webhook` — Jason poster til Slack/Teams/Chat/Discord | `main.py` | 2–3t |
|
||||
| **CG4d** | Prisingskalkulator — GCP-spend slider + tier + ROI | `static/opax.html` | 2t |
|
||||
| **CG5b** | `POST /notify/email` — SendGrid digest | `main.py` | 2t |
|
||||
| **CG5c** | `POST /notify/sms` — Twilio spikes [Guard+] | `main.py` | 2t |
|
||||
| **CG5-onboard** | Klient-onboarding + kanal-oppsett | `main.py` + `static/` | 1–2d |
|
||||
| **CG6** | Klient-dashboard `costguard.oss.vauco.no` | `static/` | 2–3d |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -61,21 +44,16 @@
|
|||
|
||||
| Komponent | Status |
|
||||
|-----------|--------|
|
||||
| Cloud Run `osvauco-agent` | ✅ Live, `us-central1` |
|
||||
| `opax.vauco.no` (LB + SSL + IAP) | ✅ Live |
|
||||
| `static/opax.html` | ✅ Live — OPAX Hub inkl. billing donut |
|
||||
| `static/jason.html` | ✅ Live — Jason fullskjerm |
|
||||
| Cloud Build trigger | ✅ Operativt |
|
||||
| BQ token-logging | ✅ CG3e live |
|
||||
| Chart.js donut (billing) | ✅ CG4b live |
|
||||
| `POST /notify/webhook` | 🔴 Ikke bygget — CG5a |
|
||||
| `POST /notify/email` | 🔴 Ikke bygget — CG5b |
|
||||
| `POST /notify/sms` | 🔴 Ikke bygget — CG5c |
|
||||
| Prisingskalkulator | 🔴 Ikke bygget — CG4d |
|
||||
| Klient-onboarding | 🔴 Ikke bygget — CG5-onboard |
|
||||
| Klient-dashboard | 🔴 Ikke bygget — CG6 |
|
||||
| Emma (Gemma GPU-VM) | 🔮 ML-3a ikke utløst |
|
||||
| OPAX-MCP server | 🔮 CI1 |
|
||||
| Cloud Run `osvauco-agent` | ✅ Live `us-central1` |
|
||||
| `opax.vauco.no` | ✅ Live |
|
||||
| `main.py` | ✅ Hovudapp — alle ruter her |
|
||||
| `static/opax.html` | ✅ Live |
|
||||
| `static/jason.html` | ✅ Live |
|
||||
| `opax-mcp/` | ✅ MCP-server mappe |
|
||||
| `POST /notify/webhook` | 🔴 CG5a — ikke bygget |
|
||||
| `POST /notify/email` | 🔴 CG5b — ikke bygget |
|
||||
| `POST /notify/sms` | 🔴 CG5c — ikke bygget |
|
||||
| `docs/gemma/world.md` | ❌ Mangler — blokkerer ML-3a |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -86,55 +64,57 @@
|
|||
| GCP Project | `propane-will-491900-m5` |
|
||||
| Region (LÅST) | `us-central1` |
|
||||
| Cloud Run service | `osvauco-agent` |
|
||||
| Cloud Run URL (direkte) | `https://osvauco-agent-zjbqp3prqq-uc.a.run.app` |
|
||||
| Direct URL | `https://osvauco-agent-zjbqp3prqq-uc.a.run.app` |
|
||||
| Public URL | `https://opax.vauco.no` |
|
||||
| Hovudapplikasjon | `main.py` (rot i repo) |
|
||||
| MCP-server | `opax-mcp/` |
|
||||
| Static filer | `static/` |
|
||||
| Jason chat | `https://opax.vauco.no/static/jason.html` |
|
||||
| OPAX Hub | `https://opax.vauco.no/` |
|
||||
| LB IP | `34.98.77.173` |
|
||||
| VM | `osvauco-dev-vm` · `us-central1-b` · `e2-standard-2` |
|
||||
| AI-modell | `gemini-2.5-pro` via Vertex |
|
||||
| Repo | `vauco-saas/OSVauco` |
|
||||
| Eier | `chris.christiansen@vauco.no` |
|
||||
| Jason (kundeagent) | `jason.vauger@vauco.no` |
|
||||
| Emma (intern agent) | `emma.vauger@vauco.no` — 🔮 ML-3a |
|
||||
| Jason | `jason.vauger@vauco.no` |
|
||||
| Emma | `emma.vauger@vauco.no` — 🔮 ML-3a |
|
||||
|
||||
---
|
||||
|
||||
## CostGuard — prismodell v2 (fasit for neste agent)
|
||||
## CostGuard — prismodell v2 (fasit)
|
||||
|
||||
| Tier | GCP-spend/mnd | Pris | Kjernefunksjon |
|
||||
|------|--------------|------|----------------|
|
||||
| Starter | $0–$3k | $499/mnd | Dashboard + e-postvarsler + 1 webhook-kanal |
|
||||
| Guard | $3k–$15k | $999/mnd | + sanntid spikes + AI-anbefalinger + SMS + interaktiv Jason i chat |
|
||||
| Shield | $15k–$50k | $1.999/mnd | + auto-remediation + multi-prosjekt + CUD-anbefalinger |
|
||||
| Enterprise | >$50k | $3.500+/mnd | + dedikert Jason-agent + CI/CD cost gates + SSO + custom subdomain |
|
||||
| Tier | GCP-spend/mnd | Pris |
|
||||
|------|--------------|------|
|
||||
| Starter | $0–$3k | $499/mnd |
|
||||
| Guard | $3k–$15k | $999/mnd |
|
||||
| Shield | $15k–$50k | $1.999/mnd |
|
||||
| Enterprise | >$50k | $3.500+/mnd |
|
||||
|
||||
**Push-first prinsipp:** Jason leverer til kunden der de er (webhook/e-post/SMS). Kunden setter opp kanal ved onboarding.
|
||||
**Salgspitch:** *"Du trenger ikke lære et nytt verktøy. Jason finner deg."*
|
||||
**Push-first:** Jason leverer til webhook/e-post/SMS — kunden setter opp kanal ved onboarding.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Regler — ikke gjør disse feilene
|
||||
## ⚠️ Regler
|
||||
|
||||
- **Ikke opprett nye HANDOFF_YYYYMMDD-filer.** Kun denne. Overskriv.
|
||||
- **Ikke bytt til Claude før kvote + `MODEL APPROVED`.**
|
||||
- **Ikke migrer fra us-central1** — regionen er låst.
|
||||
- **Ikke rør IAP/OAuth/Secret Manager** uten `DEPLOY GODKJENT`.
|
||||
- **Ikke opprett nye repos** uten `REPO APPROVED`.
|
||||
- **Medioteq er joint venture** — ikke behandle som vanlig SaaS-kunde.
|
||||
- **Prismodell er låst** — ikke endre uten `PLAN APPROVED` fra Chris.
|
||||
- **Hovudapp er `main.py`** — ikke `agents/core-logic/app.py`
|
||||
- **MCP-server er `opax-mcp/`** — ikke `agents/mcp_server/`
|
||||
- **Absolutte stier i Python** — `Path(__file__).parent / "..."`
|
||||
- **Ikke migrer fra us-central1**
|
||||
- **Ikke rør IAP/OAuth** uten `DEPLOY GODKJENT`
|
||||
- **Ikke opprett repos** uten `REPO APPROVED`
|
||||
- **Medioteq = joint venture** — ikke SaaS-kunde
|
||||
- **Prismodell låst** — ikke endre uten `PLAN APPROVED`
|
||||
- **Verifiser alltid mappestruktur** via GitHub API før du bygger
|
||||
|
||||
---
|
||||
|
||||
## 📁 Viktige filer (i denne rekkefølgen)
|
||||
## 📁 Filer (i prioritert rekkefølge)
|
||||
|
||||
1. `docs/MASTERPLAN.md` — autoritativ sannhet
|
||||
2. `docs/ROADMAP.md` — hva som skjer akkurat nå
|
||||
2. `docs/ROADMAP.md` — hva skjer nå
|
||||
3. `docs/HANDOFF.md` — denne filen
|
||||
4. `docs/AGENT_RULEBOOK.md` — agent-regler
|
||||
5. `docs/UNIVERSAL_BOOT_PROMPT.md` — boot-protokoll v1.4
|
||||
6. `docs/gemma/world.md` — Emma sin kontekstpakke ❌ mangler
|
||||
4. `CLAUDE.md` — kontekst for Claude (rot)
|
||||
5. `docs/AGENT_RULEBOOK.md`
|
||||
6. `docs/UNIVERSAL_BOOT_PROMPT.md` v1.4
|
||||
7. `docs/gemma/world.md` ❌ mangler
|
||||
|
||||
---
|
||||
|
||||
*Vauco AS · propane-will-491900-m5 · us-central1 · Jason live · Emma 🔮 · Perplexity stand-in · Sesjon 2026-06-12*
|
||||
*Vauco AS · propane-will-491900-m5 · us-central1 · Sesjon 2026-06-12*
|
||||
|
|
|
|||
|
|
@ -14,7 +14,10 @@
|
|||
- 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.
|
||||
- **2026-06-10 — app.py mangler GET /:** FastAPI returnerer `{"detail":"Not Found"}` for alle ruter som ikke er definert. Sørg alltid for at rot-ruten er eksplisitt definert.
|
||||
- **2026-06-12 — Mappestruktur må verifiseres mot repo:** MASTERPLAN-dokumentasjon av mappestruktur må alltid verifiseres via GitHub API før bygging. Antakelser om struktur er ikke nok.
|
||||
|
||||
---
|
||||
|
||||
## 1. Plattformhierarki — sannheten i én modell
|
||||
|
||||
|
|
@ -22,31 +25,23 @@
|
|||
Vauco AS (selskap, eier alle merkevarer)
|
||||
│
|
||||
├── vauco.no (APEX — bedriftens salgs- og portalside; ansiktet utad)
|
||||
│ └── ruter besøkende videre til riktig modul
|
||||
│
|
||||
└── VAUCO OS (plattform — visjon, økonomi, token-lag, agent-fabrikk)
|
||||
└── VAUCO OS (plattform)
|
||||
└── OPAX (engine — Cloud Run, RAG, agentic arkitektur, IAP)
|
||||
├── Modul #1 · CostGuard (live på costguard.oss.vauco.no)
|
||||
├── Modul #2 · Threadstone (landingsside live, app i bygg)
|
||||
└── Modul #3 · [navngis senere]
|
||||
|
||||
Separat merkevare under Vauco AS (parkert til etter Modul #1 + #2 lever):
|
||||
└── Proof of Curiosity (egen identitet, ikke en OPAX-modul)
|
||||
Separat merkevare (parkert):
|
||||
└── Proof of Curiosity
|
||||
```
|
||||
|
||||
**Fire nivåer, fire formål:**
|
||||
|
||||
| Nivå | Hva | Hvem ser det |
|
||||
|---|---|---|
|
||||
| **vauco.no (apex)** | **Bedriftens salgsportal — viser hvem Vauco AS er og hvilke moduler vi selger** | **Alle: kunder, partnere, presse, kandidater** |
|
||||
| Vauco OS | Plattformen Chris bygger og selger fra | Internt (Chris + agenter) |
|
||||
| **vauco.no (apex)** | Bedriftens salgsportal | Alle |
|
||||
| Vauco OS | Plattformen Chris bygger | Internt |
|
||||
| OPAX | Engine som driver modulene | Internt + utviklere |
|
||||
| Modul (CostGuard / Threadstone / …) | Det kundene faktisk kjøper | Kunder |
|
||||
|
||||
**Salgskanal-prinsipp:**
|
||||
- `vauco.no` = portalen som forteller "hva selger vi" og leder til riktig modul
|
||||
- Hver modul har sin egen landings-/produktside
|
||||
- Vauco OS og OPAX nevnes ikke som produkter på `vauco.no` — de er interne verktøy
|
||||
| Modul | Det kundene kjøper | Kunder |
|
||||
|
||||
**Ikke selg Vauco OS. Ikke selg OPAX. De er interne verktøy.**
|
||||
|
||||
|
|
@ -54,50 +49,19 @@ Separat merkevare under Vauco AS (parkert til etter Modul #1 + #2 lever):
|
|||
|
||||
## 2. Registrerte domener — fasit
|
||||
|
||||
### Vauco (hos Proisp)
|
||||
|
||||
| Domene | Prosjekt | Status |
|
||||
|--------|----------|--------|
|
||||
| `vauco.no` | Rot for alle Vauco-tjenester | ✅ Aktiv, live på GCS+LB |
|
||||
|
||||
**Aktive subdomener:**
|
||||
|
||||
| Domene/subdomen | Teknologi | Status | Eier-flate |
|
||||
|----------|-----------|--------|------------|
|
||||
| `vauco.no` (apex) | GCS + GCP Load Balancer + Cloud CDN | ✅ LIVE · 2026-06-05 | Vauco AS apex |
|
||||
| `www.vauco.no` | Følger apex | ✅ LIVE | Vauco AS apex |
|
||||
| `opax.vauco.no` | LB + IAP → Cloud Run `osvauco-agent` | ✅ Live (IP 34.98.77.173) | OPAX |
|
||||
| `oss.vauco.no` | Staging-miljø | ✅ Aktiv | OPAX |
|
||||
| `os.vauco.no` | Prod-miljø | 🔮 Fase C | OPAX |
|
||||
| `costguard.oss.vauco.no` | Cloud Run via IAP | ✅ Live | CostGuard |
|
||||
| `costguard.os.vauco.no` | Promoteres fra oss | 🔮 Fase C | CostGuard |
|
||||
| `threadstone.vauco.no` | GitHub Pages (`threadstone-landing`) | ✅ Live | Threadstone |
|
||||
| `app.threadstone.vauco.no` | GitHub Pages (`vauco-saas.github.io`) | ⚠️ CNAME satt, side mangler | Threadstone |
|
||||
| `<kunde>.vauco.no` | LB + IAP via Terraform | 🔮 Fase C2 | OPAX/Multi-tenant |
|
||||
| Domene/subdomen | Teknologi | Status |
|
||||
|----------|-----------|--------|
|
||||
| `vauco.no` (apex) | GCS + LB + CDN | ✅ LIVE 2026-06-05 |
|
||||
| `opax.vauco.no` | LB + IAP → Cloud Run | ✅ Live (IP 34.98.77.173) |
|
||||
| `oss.vauco.no` | Staging | ✅ Aktiv |
|
||||
| `costguard.oss.vauco.no` | Cloud Run via IAP | ✅ Live |
|
||||
| `threadstone.vauco.no` | GitHub Pages | ✅ Live |
|
||||
| `app.threadstone.vauco.no` | GitHub Pages | ⚠️ CNAME satt, side mangler |
|
||||
| `os.vauco.no` | Prod-miljø | 🔮 Fase C |
|
||||
|
||||
**Reservert til senere:**
|
||||
|
||||
| Subdomen | Tiltenkt formål | Trigger |
|
||||
|----------|------------------|---------|
|
||||
| `status.vauco.no` | Statuspage | Etter første kunde |
|
||||
| `docs.vauco.no` | Offentlig kundedok | CG4 / første kunde |
|
||||
| `careers.vauco.no` | Stillinger | Når Vauco rekrutterer |
|
||||
|
||||
**Email-infra:**
|
||||
- MX: Google Workspace ✅
|
||||
- SPF/DKIM/DMARC: ✅ Live 2026-06-10
|
||||
|
||||
### Proof of Curiosity (hos Proisp) — egen merkevare
|
||||
|
||||
| Domene | Merknad |
|
||||
|--------|---------|
|
||||
| `proof-of-curiosity.com` | Registrert — ikke i bruk |
|
||||
| `proofofcuriosity.com` | Registrert — ikke i bruk |
|
||||
| `proofofcuriosity.io` | Registrert — ikke i bruk |
|
||||
| `proof-of-curiosity.no` | Registrert — ikke i bruk |
|
||||
| `proofofcuriosity.no` | Registrert — ikke i bruk |
|
||||
|
||||
> **Trigger:** Ingen POC-arbeid før Modul #1 + #2 lever.
|
||||
**Email-infra:** MX + SPF/DKIM/DMARC ✅ Live 2026-06-10
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -105,122 +69,115 @@ Separat merkevare under Vauco AS (parkert til etter Modul #1 + #2 lever):
|
|||
|
||||
### Aktive repos (5)
|
||||
|
||||
| Repo | Formål | Synlighet | Eier-flate |
|
||||
|------|--------|-----------|------------|
|
||||
| `OSVauco` | Mono-repo: OPAX-engine, infra, Terraform, all dokumentasjon | Privat | OPAX (rot) |
|
||||
| `vauco-bootstrap` | Terraform-modul for kunde-provisjonering | Privat | OPAX |
|
||||
| `vauco-site` | `vauco.no` salgsportal | Public | Vauco AS apex |
|
||||
| `threadstone-landing` | `threadstone.vauco.no` landingsside | Public | Threadstone |
|
||||
| `vauco-saas.github.io` | `app.threadstone.vauco.no` Threadstone-app frontend | Public | Threadstone |
|
||||
|
||||
### Arkiverte repos
|
||||
|
||||
| Repo | Arkivert | Innholdet finnes nå i |
|
||||
|------|----------|------------------------|
|
||||
| `vauco-os` | ✅ 2026-05-27 | `OSVauco/docs/architecture/` |
|
||||
| `vauco-gemini-tui-bridge` | ✅ 2026-05-27 | Arkiv — reaktiveres som del av OX1b |
|
||||
| `command-hub` | ✅ 2026-05-27 | `OSVauco/static/command-hub.html` |
|
||||
| Repo | Formål | Synlighet |
|
||||
|------|--------|-----------|
|
||||
| `OSVauco` | Mono-repo: OPAX-engine, infra, Terraform, all dokumentasjon | Privat |
|
||||
| `vauco-bootstrap` | Terraform-modul for kunde-provisjonering | Privat |
|
||||
| `vauco-site` | `vauco.no` salgsportal | Public |
|
||||
| `threadstone-landing` | `threadstone.vauco.no` landingsside | Public |
|
||||
| `vauco-saas.github.io` | Threadstone-app frontend | Public |
|
||||
|
||||
> **Regel:** Nytt repo krever eksplisitt `REPO APPROVED` fra Chris.
|
||||
|
||||
---
|
||||
|
||||
## 4. OSVauco — intern mappestruktur (fasit)
|
||||
## 4. OSVauco — FAKTISK mappestruktur (verifisert 2026-06-12)
|
||||
|
||||
> **VIKTIG:** Denne seksjonen er verifisert mot GitHub API. Ikke anta struktur — alltid verifiser.
|
||||
|
||||
```
|
||||
OSVauco/
|
||||
├── MASTERPLAN.md
|
||||
├── README.md
|
||||
OSVauco/ (root)
|
||||
├── main.py (26 KB) ⭐ HOVUDAPPLIKASJON — FastAPI app + alle ruter
|
||||
├── AGENTS.md
|
||||
├── Dockerfile / cloudbuild.yaml
|
||||
├── CLAUDE.md ← Kontekstfil for Claude-agenter
|
||||
├── README.md
|
||||
├── CNAME
|
||||
├── cloudbuild.yaml ← CI/CD trigger
|
||||
├── cloudbuild.base.yaml
|
||||
├── requirements.txt
|
||||
├── .env.example / .env.prefilled
|
||||
├── dev-startup.sh / opax.sh
|
||||
│
|
||||
├── agents/
|
||||
│ ├── core-logic/ OPAX orchestrator + FastAPI app
|
||||
│ │ ├── agent.py
|
||||
│ │ ├── app.py
|
||||
│ │ └── token_logger.py
|
||||
│ ├── mcp_server/
|
||||
│ ├── rag/
|
||||
│ ├── memory/
|
||||
│ ├── multi_agent/
|
||||
│ ├── eval/
|
||||
│ ├── tests/
|
||||
│ └── tools/
|
||||
│
|
||||
├── auth/
|
||||
├── ml/
|
||||
├── infrastructure/
|
||||
├── scripts/
|
||||
├── static/
|
||||
│ ├── opax.html
|
||||
│ ├── jason.html
|
||||
│ ├── billing-dashboard.html
|
||||
│ ├── command-hub.html
|
||||
│ └── admin.html
|
||||
├── docs/
|
||||
├── agents/ ← Agent-logikk (ikke hovudapp)
|
||||
├── architecture/ ← Arkitekturdokumenter
|
||||
├── auth/ ← Auth-logikk
|
||||
├── data/
|
||||
├── dialogflow/ ← Dialogflow-integrasjon
|
||||
├── docs/ ← All dokumentasjon
|
||||
│ ├── MASTERPLAN.md
|
||||
│ ├── ROADMAP.md
|
||||
│ ├── HANDOFF.md
|
||||
│ ├── AGENT_RULEBOOK.md
|
||||
│ ├── gemma/
|
||||
│ │ ├── world.md
|
||||
│ │ └── README.md
|
||||
│ └── [øvrige tema-docs]
|
||||
├── protocols/sessions/
|
||||
└── data/
|
||||
│ ├── UNIVERSAL_BOOT_PROMPT.md
|
||||
│ ├── LEARNINGS.md
|
||||
│ ├── ARCHITECTURE.md
|
||||
│ ├── AGENTIC_CONTRACT_MCP_PROVISIONING.md
|
||||
│ ├── DNS-OG-INFRASTRUKTUR.md
|
||||
│ ├── SECRETS-SETUP.md
|
||||
│ ├── LEARNINGS_CICD_2026-06-10.md
|
||||
│ ├── GCP_Best_Practices.md
|
||||
│ └── gemma/
|
||||
│ └── world.md ❌ MANGLER — blokkerer ML-3a/Emma-boot
|
||||
├── infrastructure/
|
||||
├── master_hub/ ← Eksisterer — formål ikke klarlagt
|
||||
├── ml/
|
||||
├── opax-mcp/ ← MCP-server (ikke agents/mcp_server/)
|
||||
├── protocols/
|
||||
├── scripts/
|
||||
└── static/
|
||||
├── opax.html
|
||||
├── jason.html
|
||||
├── billing-dashboard.html
|
||||
├── command-hub.html
|
||||
└── admin.html
|
||||
```
|
||||
|
||||
**Kritiske korrекsjoner fra tidligere feil dokumentasjon:**
|
||||
- `main.py` (rot) er hovudapplikasjonen — IKKE `agents/core-logic/app.py`
|
||||
- MCP-server ligger i `opax-mcp/` — IKKE `agents/mcp_server/`
|
||||
- `master_hub/` og `dialogflow/` eksisterer — formål må kartlegges
|
||||
- Nye ruter/endepunkter legges i `main.py` — ikke i agents/
|
||||
|
||||
---
|
||||
|
||||
## 4b. vauco.no — salgsportal (Vauco AS apex)
|
||||
|
||||
> Eget repo: `vauco-saas/vauco-site` — LIVE 2026-06-05 på GCS+LB.
|
||||
|
||||
### Versjons-evolusjon
|
||||
## 4b. vauco.no — salgsportal
|
||||
|
||||
| Versjon | Inneholder | Trigger |
|
||||
|---------|------------|---------|
|
||||
| V1 (MVP) ✅ | Hero + modul-grid + om-oss + kontakt + personvern | LIVE 2026-06-05 |
|
||||
| V2 | Sales-CTA + CostGuard ROI-kalkulator | Etter første betalende kunde |
|
||||
| V3 | Blogg, kundereferanser, status-widget | Når 3+ kunder |
|
||||
| V4 | Internasjonalt (`vauco.no/en`), Proof of Curiosity i footer | Etter Modul #3 |
|
||||
| V1 (MVP) ✅ | Hero + modul-grid + om-oss + kontakt | LIVE 2026-06-05 |
|
||||
| V2 | Sales-CTA + ROI-kalkulator | Etter første betalende kunde |
|
||||
| V3 | Blogg, kundereferanser | Når 3+ kunder |
|
||||
|
||||
---
|
||||
|
||||
## 5. Dokumenthierarki — én kilde til sannhet
|
||||
## 5. Dokumenthierarki
|
||||
|
||||
| Fil | Rolle | Oppdateres |
|
||||
|-----|-------|------------|
|
||||
| `docs/MASTERPLAN.md` | Arkitektur, domener, repos, agent-identitet | Ved arkitekturendringer |
|
||||
| `docs/ROADMAP.md` | Faser, status, backlog | Hver sesjon |
|
||||
| `docs/HANDOFF.md` | Hva ble gjort, hva er neste | Overskrives hver sesjon |
|
||||
| `docs/AGENT_RULEBOOK.md` | Locked definitions for agent-boot | Ved infrastruktur-låsing |
|
||||
| `docs/gemma/world.md` | Emmas verden — kontekstpakke for lokal Gemma-modell | Bygges simultant med alt annet |
|
||||
| `protocols/sessions/YYYY-MM-DD_<tema>.md` | Detaljerte protokoller | Append-only |
|
||||
| Fil | Rolle |
|
||||
|-----|-------|
|
||||
| `docs/MASTERPLAN.md` | Autoritativ sannhet |
|
||||
| `docs/ROADMAP.md` | Faser og status |
|
||||
| `docs/HANDOFF.md` | Sesjonsstatus — overskrives hver sesjon |
|
||||
| `docs/AGENT_RULEBOOK.md` | Locked agent-regler |
|
||||
| `docs/UNIVERSAL_BOOT_PROMPT.md` | Boot-protokoll v1.4 |
|
||||
| `CLAUDE.md` | Kontekst for Claude-agenter (rot) |
|
||||
| `docs/gemma/world.md` | Emma sin kontekstpakke ❌ mangler |
|
||||
|
||||
---
|
||||
|
||||
## 6. AI-modell — tofase-strategi
|
||||
|
||||
### Fase 1 — Nå (Vertex AI, løper ut kreditter)
|
||||
### Fase 1 — Nå
|
||||
| Parameter | Verdi |
|
||||
|-----------|-------|
|
||||
| Intern stand-in | Perplexity (Sonnet 4.6) via GitHub MCP |
|
||||
| Kundemodell (Jason) | `gemini-2.5-flash` via Vertex AI |
|
||||
| Region | `us-central1` |
|
||||
|
||||
| Parameter | Verdi | Merknad |
|
||||
|-----------|-------|---------|
|
||||
| **Intern modell (Emma/Chris)** | `gemini-2.5-pro` / `gemini-2.5-flash` | Via Vertex AI, tærer på kreditter |
|
||||
| **Stand-in operatør** | Perplexity (Sonnet 4.6) via GitHub MCP | Erstatter Emma til Gemma-VM er oppe |
|
||||
| **Kundemodell (Jason)** | `gemini-2.5-flash` | Via Vertex AI — kunder betaler indirekte |
|
||||
| **Endpoint** | `us-central1` | Vertex-kreditter |
|
||||
| **SDK** | `google-adk` + `google-genai` | |
|
||||
| **Status Claude** | ⏳ Venter på EU-kvote | Bytt når kvote innvilget |
|
||||
|
||||
### Fase 2 — Gemma-migrering
|
||||
|
||||
| Parameter | Verdi | Merknad |
|
||||
|-----------|-------|---------|
|
||||
| **Emma (intern)** | `gemma-4-12b-it` int4 | GCP `g2-standard-4` Spot VM (~$120–150/mnd) |
|
||||
| **Serving** | Ollama (utvikling) → vLLM (produksjon) | |
|
||||
| **Jason (kunder)** | `gemini-2.5-flash` via Vertex | Uendret |
|
||||
| **Kontekst** | `docs/gemma/world.md` lastet som system-prompt | |
|
||||
### Fase 2 — Gemma (trigger: kreditter < 20% eller første kunde)
|
||||
| Parameter | Verdi |
|
||||
|-----------|-------|
|
||||
| Emma (intern) | `gemma-4-12b-it` int4 · GCP `g2-standard-4` Spot VM |
|
||||
| Jason (kunder) | `gemini-2.5-flash` via Vertex — uendret |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -229,35 +186,27 @@ OSVauco/
|
|||
> Full status i `docs/ROADMAP.md`.
|
||||
|
||||
### 🔴 NOW
|
||||
- [x] CG4b — Token dashboard breakdown per modul ✅
|
||||
- [x] OX1c — Jason fullskjerm-chat LIVE ✅
|
||||
- [x] CI5+CI6 — OPAX-MCP live ✅
|
||||
- [ ] CG4d — Kundeprisingskalkulator (GCP-spend-basert)
|
||||
- [ ] CG5a — Delivery layer: webhook-kanal onboarding
|
||||
- [ ] CG5b — E-postvarsler (SendGrid)
|
||||
- [ ] CG5c — SMS-varsler (Twilio) [Guard+]
|
||||
- [ ] CG4d — Prisingskalkulator i `static/opax.html`
|
||||
- [ ] CG5a — Delivery layer: `POST /notify/webhook` i `main.py`
|
||||
- [ ] CG5b — E-postvarsler: `POST /notify/email` via SendGrid
|
||||
- [ ] CG5c — SMS-varsler: `POST /notify/sms` via Twilio [Guard+]
|
||||
- [ ] CG5-onboard — Klient-onboarding flow
|
||||
- [ ] CG6 — Klient-dashboard
|
||||
|
||||
### 🟠 NEXT
|
||||
- CG6 — Klient-dashboard
|
||||
- CI1 — OPAX-MCP full CI/CD-kanal
|
||||
- ML-3a — GPU-VM for Emma
|
||||
- CI1 — opax-mcp/ full CI/CD-kanal
|
||||
- ML-3a — GPU-VM for Emma + `docs/gemma/world.md` opprettes
|
||||
- C4 — Medioteq partnerstrategimøte
|
||||
|
||||
### 🟡 LATER
|
||||
- ML-3c — Hybrid agent
|
||||
- T1–T4 — Threadstone
|
||||
- Fase C — Multi-tenant
|
||||
|
||||
---
|
||||
|
||||
## 8. Agent-identitet
|
||||
|
||||
| Identitet | E-post | Modell | Rolle | Status |
|
||||
|-----------|--------|--------|-------|--------|
|
||||
| Eier / admin | `chris.christiansen@vauco.no` | — | Full kontroll | ✅ Aktiv |
|
||||
| Jason Vauger | `jason.vauger@vauco.no` | `gemini-2.5-flash` via Vertex | Kundevendt agent | ✅ Live |
|
||||
| Emma Vauger | `emma.vauger@vauco.no` | `gemma-4-12b-it` (lokal GPU-VM) | Intern agent for Chris | 🔮 ML-3a |
|
||||
| Fremtidig gruppe | `billing@vauco.no` | — | `billing.viewer` (Fase C) | 🔮 Fase C |
|
||||
| Identitet | E-post | Modell | Status |
|
||||
|-----------|--------|--------|--------|
|
||||
| Eier | `chris.christiansen@vauco.no` | — | ✅ Aktiv |
|
||||
| Jason Vauger | `jason.vauger@vauco.no` | `gemini-2.5-flash` | ✅ Live |
|
||||
| Emma Vauger | `emma.vauger@vauco.no` | `gemma-4-12b-it` | 🔮 ML-3a |
|
||||
|
||||
**Forbudte kontoer:** `tinius.vauger`, `ccv` — aldri gi tilganger.
|
||||
|
||||
|
|
@ -265,27 +214,25 @@ OSVauco/
|
|||
|
||||
## 9. Cloud Run — live endepunkter
|
||||
|
||||
**Service:** `osvauco-agent` | **Region:** `us-central1` | **Project:** `propane-will-491900-m5`
|
||||
**Service:** `osvauco-agent` · `us-central1` · `propane-will-491900-m5`
|
||||
**Public URL:** `https://opax.vauco.no`
|
||||
**Jason UI:** `https://opax.vauco.no/static/jason.html` ✅
|
||||
**OPAX UI:** `https://opax.vauco.no/` ✅
|
||||
|
||||
| Endepunkt | Status |
|
||||
|-----------|--------|
|
||||
| `GET /` | ✅ opax.html |
|
||||
| `GET /health` | ✅ |
|
||||
| `POST /run` | ✅ |
|
||||
| `GET /static/jason.html` | ✅ |
|
||||
| `GET /billing/tokens/by-module` | ✅ |
|
||||
| `GET /billing/tokens/estimate` | ✅ |
|
||||
| `GET /billing/summary` | ✅ |
|
||||
| `GET /billing/anomalies` | ✅ |
|
||||
| `GET /billing/history` | ✅ |
|
||||
| `GET /billing/budget` | ✅ |
|
||||
| `POST /billing/budget` | ✅ |
|
||||
| `POST /notify/webhook` | 🔴 CG5a |
|
||||
| `POST /notify/email` | 🔴 CG5b |
|
||||
| `POST /notify/sms` | 🔴 CG5c |
|
||||
| Endepunkt | Fil | Status |
|
||||
|-----------|-----|--------|
|
||||
| `GET /` | `main.py` | ✅ Serverer opax.html |
|
||||
| `GET /health` | `main.py` | ✅ |
|
||||
| `POST /run` | `main.py` | ✅ |
|
||||
| `GET /static/jason.html` | `main.py` | ✅ |
|
||||
| `GET /billing/tokens/by-module` | `main.py` | ✅ |
|
||||
| `GET /billing/tokens/estimate` | `main.py` | ✅ |
|
||||
| `GET /billing/summary` | `main.py` | ✅ |
|
||||
| `GET /billing/anomalies` | `main.py` | ✅ |
|
||||
| `GET /billing/history` | `main.py` | ✅ |
|
||||
| `GET /billing/budget` | `main.py` | ✅ |
|
||||
| `POST /billing/budget` | `main.py` | ✅ |
|
||||
| `POST /notify/webhook` | `main.py` | 🔴 CG5a |
|
||||
| `POST /notify/email` | `main.py` | 🔴 CG5b |
|
||||
| `POST /notify/sms` | `main.py` | 🔴 CG5c |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -293,123 +240,58 @@ OSVauco/
|
|||
|
||||
### CostGuard — prismodell v2 (godkjent 2026-06-12)
|
||||
|
||||
> **Prinsipp:** "Meet them where they are" — CostGuard push-first. Jason finner kunden, ikke omvendt.
|
||||
|
||||
#### Tier-oversikt
|
||||
> **Prinsipp:** Push-first — Jason finner kunden, ikke omvendt.
|
||||
> **Pitch:** *"Du trenger ikke lære et nytt verktøy. Jason finner deg."*
|
||||
|
||||
| Tier | GCP-spend/mnd | Pris | Kjerneløfte |
|
||||
|------|--------------|------|-------------|
|
||||
| **Starter** | $0 – $3k | **$499/mnd** | Synlighet — du vet hva du bruker |
|
||||
| **Guard** | $3k – $15k | **$999/mnd** | Kontroll — du stopper sløsing før det skjer |
|
||||
| **Shield** | $15k – $50k | **$1.999/mnd** | Automatisering — Jason handler, ikke bare varsler |
|
||||
| **Enterprise** | > $50k | **$3.500+/mnd** | Platform — Vauco er din interne FinOps-funksjon |
|
||||
|
||||
#### Hva er inkludert per tier
|
||||
|
||||
**Starter — $499/mnd**
|
||||
- CostGuard dashboard (read-only)
|
||||
- Daglig kostnadsoversikt per GCP-tjeneste
|
||||
- Anomali-varsler → e-post (månedlig rapport)
|
||||
- 1 bruker-login
|
||||
- Webhook til én kanal (Slack/Teams/Chat/etc.)
|
||||
|
||||
**Guard — $999/mnd**
|
||||
- Alt i Starter, pluss:
|
||||
- Budsjett-enforcement (Jason setter og overvåker grenser)
|
||||
- AI-anbefalinger: årsak + handling per anomali
|
||||
- Sanntids spike-varsler
|
||||
- E-post ukentlig digest
|
||||
- SMS-varsler ved kritiske spikes (Twilio)
|
||||
- Interaktiv Jason i valgt chat-kanal
|
||||
- 3 bruker-logins
|
||||
- Slack + Teams + Google Chat støtte
|
||||
|
||||
**Shield — $1.999/mnd**
|
||||
- Alt i Guard, pluss:
|
||||
- Automatisk remediation (Jason stopper overforbruk)
|
||||
- Multi-GCP-prosjekt (opp til 5)
|
||||
- CUD-anbefalinger (Committed Use Discounts)
|
||||
- FinOps-rapport til CFO/styret
|
||||
- Tagging-enforcement
|
||||
- 10 bruker-logins
|
||||
- Dedikert onboarding med Chris
|
||||
- SLA: respons innen 4 timer
|
||||
|
||||
**Enterprise — $3.500+/mnd**
|
||||
- Alt i Shield, pluss:
|
||||
- Ubegrenset GCP-prosjekter + multi-org
|
||||
- Jason som dedikert FinOps-agent (tilpasset kundens stack)
|
||||
- Terraform cost gates (blokkerer deploys over budsjett)
|
||||
- CI/CD cost gates
|
||||
- Custom rapportering + BI-eksport
|
||||
- BankID / SSO
|
||||
- Dedikert subdomain: `costguard.<kunde>.no`
|
||||
- SLA: 99.9% uptime, respons innen 1 time
|
||||
- Kvartalsvis strategimøte med Chris
|
||||
|
||||
#### Push-first arkitektur — Delivery layer
|
||||
| **Starter** | $0–$3k | $499/mnd | Synlighet |
|
||||
| **Guard** | $3k–$15k | $999/mnd | Kontroll |
|
||||
| **Shield** | $15k–$50k | $1.999/mnd | Automatisering |
|
||||
| **Enterprise** | >$50k | $3.500+/mnd | Platform |
|
||||
|
||||
**Delivery layer:**
|
||||
```
|
||||
GCP-event → Jason analyserer → Delivery layer → Kanal
|
||||
├── Webhook (Slack/Teams/Chat/Discord/etc.) [CG5a]
|
||||
├── E-post (SendGrid) [CG5b]
|
||||
├── SMS (Twilio) [Guard+] [CG5c]
|
||||
└── In-app (CG6 dashboard)
|
||||
GCP-event → Jason → Delivery layer → Webhook (CG5a) / E-post (CG5b) / SMS (CG5c)
|
||||
```
|
||||
|
||||
Kunden setter opp sin foretrukne kanal ved onboarding — Jason finner dem der.
|
||||
**Markedsposisjon:**
|
||||
|
||||
#### Markedsposisjon
|
||||
| Konkurrent | Pris | CostGuard vinner på |
|
||||
|-----------|------|--------------------|
|
||||
| Kubecost Business | $199/mnd | GCP-native + Jason AI |
|
||||
| Apptio Cloudability | $1.930/mnd | Enklere, push-first |
|
||||
| CloudHealth | $5.400+/mnd | Pris + SMB-fokus |
|
||||
|
||||
| Konkurrent | Pris | Svakhet | CostGuard vinner på |
|
||||
|-----------|------|---------|--------------------|
|
||||
| Kubecost Business | $199/mnd | Kun K8s, ingen AI | GCP-native + Jason AI |
|
||||
| Apptio Cloudability | $1.930/mnd | Komplekst, enterprise-only | Enklere, raskere, billigere |
|
||||
| CloudHealth | $5.400+/mnd | Overkill for SMB | Pris + push-first UX |
|
||||
|
||||
**Salgspitch:** *"Du trenger ikke lære et nytt verktøy. Jason finner deg."*
|
||||
|
||||
### Produkt #2: Threadstone (Q3 2026)
|
||||
Definisjon låses når Modul #1 har første kunde.
|
||||
|
||||
### Medioteq — Joint Venture (ikke en vanlig kunde)
|
||||
> Medioteq er et partnersamarbeid. **Ikke** standard SaaS-kundeforhold. C4 er partnerstrategimøte.
|
||||
### Medioteq — Joint Venture
|
||||
> Partnersamarbeid, ikke SaaS-kunde. C4 = partnerstrategimøte.
|
||||
|
||||
---
|
||||
|
||||
## 11. Kjente hull
|
||||
|
||||
| ID | Problem | Løsning | Prioritet |
|
||||
|----|---------|---------|-----------|
|
||||
| OQ-15 | BQ billing_export tabell | Venter på aktivering | Medium |
|
||||
| OQ-17 | `github-token` secret mangler | Opprett alias fra `github-pat` | Medium |
|
||||
| OQ-18 | VM alltid-på kostnad | Kjør `03-teardown.sh` hver kveld | Høy |
|
||||
| OQ-21 | `app.threadstone.vauco.no` CNAME uten side | Bygg T2 eller fjern CNAME | Lav |
|
||||
| OQ-22 | Claude EU-kvote | Vent på Google Cloud-team | Medium |
|
||||
| OQ-26 | Ingen statuspage | Etter første kunde | Lav |
|
||||
| ID | Problem | Prioritet |
|
||||
|----|---------|----------|
|
||||
| OQ-15 | BQ billing_export tabell | Medium |
|
||||
| OQ-17 | `github-token` secret mangler | Medium |
|
||||
| OQ-18 | VM alltid-på kostnad | Høy |
|
||||
| OQ-21 | `app.threadstone.vauco.no` CNAME uten side | Lav |
|
||||
| OQ-26 | `docs/gemma/world.md` mangler | Høy (ML-3a blokkert) |
|
||||
| OQ-27 | `master_hub/` formål ikke dokumentert | Medium |
|
||||
| OQ-28 | `dialogflow/` formål ikke dokumentert | Medium |
|
||||
|
||||
---
|
||||
|
||||
## 12. OPAX — fremtidig visjon
|
||||
## 12. OPAX — status
|
||||
|
||||
**Ferdig:**
|
||||
- ✅ opax.html LIVE via `GET /`
|
||||
- ✅ opax.html LIVE via `GET /` (main.py)
|
||||
- ✅ Jason-chat LIVE
|
||||
- ✅ Billing dashboard + Chart.js donut (CG4b)
|
||||
- ✅ Cloud Build live-widget
|
||||
- ✅ Token Intelligence endepunkter
|
||||
- ✅ CI5+CI6 — OPAX-MCP live
|
||||
- ✅ CI5+CI6 — opax-mcp live
|
||||
|
||||
**Gjenstår:**
|
||||
- CG4d — Prisingskalkulator
|
||||
- CG5a/b/c — Delivery layer
|
||||
- CG6 — Klient-dashboard
|
||||
- OX2 — Command Hub
|
||||
- CI1 — OPAX-MCP full CI/CD
|
||||
|
||||
---
|
||||
|
||||
## 13. TUI-bridge — reaktivert som OX1b ✅
|
||||
**Gjenstår:** CG4d / CG5a–c / CG5-onboard / CG6 / CI1 / ML-3a
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user