docs+fix(CG6): mark CG6 done in ROADMAP, fix Compute Engine duplicates in billing_agent, add GCP-only hosting principle
This commit is contained in:
parent
fe923d9d17
commit
dc7fc0aa79
|
|
@ -1,13 +1,24 @@
|
|||
# VAUCO OS — ROADMAP
|
||||
|
||||
**Eier:** Chris Christiansen
|
||||
**Sist oppdatert:** 2026-06-09
|
||||
**Sist oppdatert:** 2026-06-10
|
||||
**Erstatter:** `docs/VAUCO_OS_ROADMAP.md` (deprecated)
|
||||
|
||||
> Levende dokument. Oppdateres hver sesjon. Arkitektur og fasit ligger i `docs/MASTERPLAN.md`.
|
||||
|
||||
---
|
||||
|
||||
## HOSTING-PRINSIPP (autoritativt)
|
||||
|
||||
> **All hosting skjer på GCP. GitHub Pages og Cloudflare Pages skal fases ut.**
|
||||
> Begrunnelse: samle all infrastruktur på Google Cloud for kontroll, konsolidering og fremtidig multi-tenant.
|
||||
> - `vauco.no` → GCS + GCP Load Balancer + Cloud CDN ✅ (migrert 2026-06-05)
|
||||
> - `costguard.oss.vauco.no` → Cloud Run via IAP (ikke Cloudflare Pages)
|
||||
> - `threadstone.vauco.no` → GitHub Pages midlertidig — migreres til GCP ved T2
|
||||
> - Ingen nye tjenester skal deployes til GitHub Pages eller Cloudflare Pages
|
||||
|
||||
---
|
||||
|
||||
## NOW — Aktiv akkurat nå
|
||||
|
||||
- [x] **K2 — AGENT_RULEBOOK retting**
|
||||
|
|
@ -17,45 +28,42 @@
|
|||
- Cloud Run `/health` ✅, IAP blokk ✅
|
||||
- browser-login → chat → svar ✅
|
||||
- HITL gate: `FASE8 APPROVED` ✅
|
||||
- [x] **CG6 — Modulært drag+collapse dashboard + nye billing-endepunkter** · 2026-06-10
|
||||
- `/billing/anomalies` ✅ — live, henter ekte BigQuery-data
|
||||
- `/billing/history` ✅ — daglig MTD-historikk for bar-chart
|
||||
- `/billing/budget` GET+POST ✅ — localStorage frontend, in-memory backend
|
||||
- Alle dashboard-moduler draggable + collapsible + layout persistert i localStorage
|
||||
- Compute Engine SKU-duplikater fikset — grupperes nå per tjeneste
|
||||
- TODO Fase-C: `/billing/budget` migreres til Firestore per bruker
|
||||
- [ ] **CG3e — Tokenmeter for agenter (LLM-bruk i CostGuard)**
|
||||
- Logg LLM-bruk (tokens, modell, agent) til egen BigQuery-tabell
|
||||
- Nytt endpoint `/billing/tokens/summary` som aggregerer kost per agent/modell
|
||||
- Nytt kort på `static/billing-dashboard.html` for "Tokenbruk per agent" (MVP)
|
||||
- Logg LLM-bruk (tokens, modell, agent) til egen BigQuery-tabell `llm_token_usage`
|
||||
- Endpoint `/billing/tokens/summary` eksisterer ✅ — mangler data (tabellen ikke populert ennå)
|
||||
- Kort på dashbordet vises ✅ — venter på data
|
||||
|
||||
---
|
||||
|
||||
## NEXT — Neste opp (etter NOW)
|
||||
|
||||
### vauco.no salgsportal (V-spor) — kan kjøres parallelt med CG3
|
||||
> **ARKITEKTURVALG 2026-06-05:** vauco.no hostes på **GCP** (GCS static bucket + global HTTPS load balancer + Cloud CDN), IKKE GitHub Pages. Begrunnelse: samle all hosting på Google for fremtidig konsolidering der alle sider bygges/selges fra ett sted. Kildekode i `vauco-saas/vauco-site` (public). Stack: bucket `vauco-site-public` → backend-bucket `vauco-site-backend` (CDN på) → url-map `vauco-site-urlmap` → managed SSL `vauco-site-cert` → egen global IP **34.13.124.217** (HTTPS-proxy + HTTP→HTTPS-redirect). Rører IKKE opax/costguard/threadstone-LB-ene.
|
||||
- [x] **V1a** — Opprett `vauco-saas/vauco-site` (public repo) · 2026-06-05 (commit 187ca40)
|
||||
- [x] **V1b** — Bygg MVP: hero + modul-grid + om-oss + kontakt + personvern + vilkår (mobil-først) · 2026-06-05
|
||||
- [x] **V1c** — DNS i Proisp: apex `vauco.no` + `www` A-record → 34.13.124.217 (GCP LB) · 2026-06-05 (erstattet GitHub Pages-plan)
|
||||
- [x] **V1d** — Erstatt "Under construction" — V1 LIVE på https://vauco.no (GCS+LB, SSL ACTIVE) · 2026-06-05
|
||||
### vauco.no salgsportal (V-spor)
|
||||
> **ARKITEKTURVALG 2026-06-05:** vauco.no hostes på **GCP** (GCS static bucket + global HTTPS load balancer + Cloud CDN), IKKE GitHub Pages. Stack: bucket `vauco-site-public` → backend-bucket → url-map → managed SSL → global IP **34.13.124.217**.
|
||||
- [x] **V1a** — Opprett `vauco-saas/vauco-site` (public repo) · 2026-06-05
|
||||
- [x] **V1b** — Bygg MVP: hero + modul-grid + om-oss + kontakt + personvern + vilkår · 2026-06-05
|
||||
- [x] **V1c** — DNS i Proisp: apex `vauco.no` + `www` A-record → 34.13.124.217 · 2026-06-05
|
||||
- [x] **V1d** — V1 LIVE på https://vauco.no (GCS+LB, SSL ACTIVE) · 2026-06-05
|
||||
- [ ] **V1e** — Sett opp SPF + DKIM + DMARC TXT-records på `vauco.no`
|
||||
|
||||
### CostGuard Strategi & Arkitektur
|
||||
> Dette er de overordnede prinsippene for CostGuard-modulen.
|
||||
|
||||
- **Dobbelt formål:** CostGuard er én felles kostnadsmotor som tjener to formål:
|
||||
- **"Min kost" (Egenbruk):** Intern overvåkning av Vauco sine egne GCP- og AI-kostnader, inkludert anomalideteksjon og tokenmeter.
|
||||
- **"Salgsmodus":** Den samme motoren og dataene brukes til å bygge innsikt, argumentasjon og tilbud i dialog med potensielle kunder.
|
||||
|
||||
- **Modellstrategi (prinsipp, ingen bytte nå):**
|
||||
- **Pro-modell (`gemini-2.5-pro`):** Brukes til "high-touch" oppgaver der kvalitet er kritisk: kundedemoer, komplekse analyser, generering av pitch-tekst og viktige forklaringer.
|
||||
- **Flash-modell (fremtidig):** En rimeligere og raskere modell skal på sikt brukes for alt som kjører kontinuerlig: periodiske rapporter, varsler, grunnleggende anomalideteksjon og andre bakgrunnsoppgaver.
|
||||
- **Modell-agnostisk Arkitektur:** Backend-API-et for CostGuard skal ha et `analysis_engine`-lag som kan rute kall til riktig modell (Pro eller Flash) basert på type oppgave og viktighet.
|
||||
- **Eksplisitt modell-lås:** Ingen endring av produksjonsmodell skjer før Chris gir en eksplisitt `MODEL APPROVED`, i henhold til `AGENT_RULEBOOK.md`.
|
||||
|
||||
- **Data & Logging:**
|
||||
- **Hierarkisk koststruktur:** CostGuard skal unngå flate kostnadsetiketter (som "Compute Engine") og heller presentere kostnader i en hierarkisk struktur der totalsummer ruller opp fra underkomponenter (f.eks. agenter, nettsteder, spesifikke tjenester).
|
||||
- **Token-logging:** All AI-bruk skal logges til en `llm_token_usage`-tabell (med input/output/total tokens + estimert kostnad). Dette er kritisk for å senere kunne sammenligne kost/nytte-effekten av Pro vs. Flash-modeller.
|
||||
- **Dobbelt formål:** Egenbruk (intern kostnadsovervåkning) + Salgsmodus (kundedemoer og pitch)
|
||||
- **Modellstrategi:** `gemini-2.5-pro` for high-touch, Flash-modell (fremtidig) for bakgrunnsoppgaver
|
||||
- **Hierarkisk koststruktur:** Kostnader grupperes per tjeneste (ikke flate SKU-labels)
|
||||
- **Token-logging:** All AI-bruk logges til `llm_token_usage`-tabell
|
||||
|
||||
### CostGuard frontend wiring
|
||||
- [x] **CG3a** — Bygg `static/costguard.html` (OAuth-knapp + billing embed)
|
||||
- [x] **CG3b** — Sett CNAME `costguard.oss.vauco.no` → Cloud Run i Proisp
|
||||
- [x] **CG3c** — Verifiser `/static/costguard.html` tilgjengelig via Cloud Run
|
||||
- [x] **CG3d** — Test OAuth-flow fra landingssiden
|
||||
- [x] **CG3a** — Bygg `static/costguard.html`
|
||||
- [x] **CG3b** — Sett CNAME `costguard.oss.vauco.no` → Cloud Run
|
||||
- [x] **CG3c** — Verifiser `/static/costguard.html` via Cloud Run
|
||||
- [x] **CG3d** — Test OAuth-flow
|
||||
- [ ] **OQ-21** — Bygg `app.threadstone.vauco.no` eller fjern CNAME
|
||||
|
||||
---
|
||||
|
|
@ -69,22 +77,18 @@
|
|||
- [ ] **ML-2** — Adaptiv intelligens (trigger: >500 telemetri-kall)
|
||||
|
||||
### Modul #2 — Threadstone
|
||||
- [ ] **T1** — Konsolider `threadstone-instructions` → `OSVauco/docs/threadstone/` (trigger: T2 starter)
|
||||
- [ ] **T2** — Bygg `app.threadstone.vauco.no` i `vauco-saas.github.io`
|
||||
- [ ] **T1** — Konsolider `threadstone-instructions` → `OSVauco/docs/threadstone/`
|
||||
- [ ] **T2** — Bygg `app.threadstone.vauco.no` — migrer fra GitHub Pages til GCP
|
||||
- [ ] **T3** — Koble til OPAX-engine via `POST /threadstone/generate`
|
||||
- [ ] **T4** — Pilot med første kunde
|
||||
|
||||
### Infrastruktur — Fase C
|
||||
- [ ] **C1** — Terraform-konvertering (påbegynt: `infrastructure/terraform/modules/`)
|
||||
- [ ] **C1** — Terraform-konvertering
|
||||
- [ ] **C2** — Multi-tenant stamp-out (`scripts/onboard-client.sh`)
|
||||
- [ ] **C3** — BQ-2 / Looker Studio kobling
|
||||
- [ ] **CG6-Fase-C** — Migrer `/billing/budget` fra in-memory til Firestore per bruker
|
||||
- [ ] Full boot cycle acceptance test (automatisert)
|
||||
- [ ] OPS agent + BigQuery live logging
|
||||
- [ ] `opax-mcp/` restruktureres som ordentlig modul-subtree
|
||||
- [ ] **CI1 — MCP-native CI/CD uten GitHub**
|
||||
- Etablere egen MCP-kanal mot Google Cloud Build / Cloud Deploy
|
||||
- Migrere deploy-styring for Jason fra GitHub-PAT til GCP service account (IAM + Secrets Manager)
|
||||
- Dokumentere ny flyt der Jason kan trigge build/deploy direkte via MCP i stedet for GitHub-webhooks
|
||||
- [ ] **CI1** — MCP-native CI/CD: GCP Cloud Build/Deploy, fjern GitHub-avhengighet for deploy
|
||||
|
||||
### OPAX-evolusjon
|
||||
- [ ] Voice-input på `opax.vauco.no` (Web Speech API → Whisper)
|
||||
|
|
@ -99,14 +103,14 @@
|
|||
|
||||
## BLOCKED
|
||||
|
||||
- ⏳ **OQ-22** — Claude Opus 4.6/4.7 EU-kvote ikke innvilget. Midlertidig på `gemini-2.5-pro` via Vertex AI EU.
|
||||
- ⏳ **OQ-22** — Claude Opus 4.6/4.7 EU-kvote ikke innvilget. Midlertidig på `gemini-2.5-pro` via Vertex AI.
|
||||
|
||||
---
|
||||
|
||||
## KJENTE HULL — ikke i en fase ennu
|
||||
## KJENTE HULL
|
||||
|
||||
- [x] **OQ-23** — `vauco.no` LIVE (GCS+LB) · 2026-06-05
|
||||
- [ ] **OQ-24** — SPF/DKIM/DMARC mangler på `vauco.no` (Google Workspace MX er satt, men autentisering ikke) → V1e
|
||||
- [ ] **OQ-24** — SPF/DKIM/DMARC mangler på `vauco.no` → V1e
|
||||
- [x] **OQ-25** — Personvern + vilkår publisert · 2026-06-05
|
||||
- [ ] **OQ-26** — Ingen statuspage → etter første kunde
|
||||
|
||||
|
|
@ -118,17 +122,18 @@
|
|||
- [x] **Phase 1** — Domain/protocol locking, `ARCHITECTURE.md`
|
||||
- [x] **Phase 2** — `opax.vauco.no` LIVE: Cloud Run, CNAME, SSL · 2026-05-21
|
||||
- [x] **Phase 3** — Nemotron session loop, `docs/TODO.md`, Phase 1+2 rapport · 2026-05-21
|
||||
- [x] **Phase 4** — Docs hardening: LEARNINGS 007–009, SECRETS-SETUP, IAP-SETUP kartlegging · 2026-05-25
|
||||
- [x] **Phase 5** — Cloud Run IAM-autentisering på `osvauco-agent`: kun Chris + Jason · 2026-05-25
|
||||
- [x] **Phase 4** — Docs hardening · 2026-05-25
|
||||
- [x] **Phase 5** — Cloud Run IAM-autentisering · 2026-05-25
|
||||
- [x] **Phase 5 IAP** — IAP migrering til GCP Load Balancer (IP 34.98.77.173) · 2026-05-30
|
||||
- [x] **Phase 6** — CI/CD: auto-deploy på push til main · 2026-05-30
|
||||
- [x] **Phase 7** — RAG corpus `osvauco-corpus` populert i `europe-west4` · 2026-05-30
|
||||
- [x] **GDrive/GitHub paritet** — mirror-script, PS1 prompt, IAM/Secrets · 2026-05-25
|
||||
- [x] **Repo-konsolidering trinn 1** — `vauco-os`, `vauco-gemini-tui-bridge`, `command-hub` arkivert · 2026-05-27
|
||||
- [x] **Terraform bootstrap-modul** — `infrastructure/terraform/modules/{vauco-bootstrap,vauco-platform}` opprettet · 2026-05-26
|
||||
- [x] **Repo-konsolidering trinn 1** — arkivert 3 repos · 2026-05-27
|
||||
- [x] **Terraform bootstrap-modul** · 2026-05-26
|
||||
- [x] **OPAX operator hub** — `static/opax.html` deployet · 2026-05-31
|
||||
- [x] **K1 — Repo-konsolidering** · 2026-06-09
|
||||
- [x] **K3 — Fiks nattlig GDrive backup** · 2026-06-09
|
||||
- [x] **CG6 — Modulært dashboard, anomalier, historikk, budsjett** · 2026-06-10
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class BillingAgent:
|
|||
}
|
||||
return {"summary": summary}
|
||||
|
||||
# ── forecast ─────────────────────────────────────────────────────────────
|
||||
# ── forecast ──────────────────────────────────────────────────────────────
|
||||
def get_forecast(self):
|
||||
q7 = f"""
|
||||
SELECT SUM(cost) + SUM(IFNULL(
|
||||
|
|
@ -130,7 +130,7 @@ class BillingAgent:
|
|||
def get_daily_history(self, days: int = 30):
|
||||
"""
|
||||
Returnerer [{date: str, mtd: float}] for siste `days` dager, sortert ASC.
|
||||
MTD (month-to-date) er kumulativ sum fra 1. i måneden til den dato.
|
||||
MTD er kumulativ sum fra 1. i måneden til den dato.
|
||||
"""
|
||||
query = f"""
|
||||
SELECT
|
||||
|
|
@ -147,15 +147,19 @@ class BillingAgent:
|
|||
history = []
|
||||
mtd = 0.0
|
||||
for row in results:
|
||||
# Nullstill MTD ved månedsskifte
|
||||
if history and row.usage_date.day == 1:
|
||||
mtd = 0.0
|
||||
mtd += float(row.day_cost or 0)
|
||||
history.append({"date": str(row.usage_date), "mtd": round(mtd, 6)})
|
||||
return history
|
||||
|
||||
# ── tjenester med SKU-detaljer (CG5) ─────────────────────────────────────
|
||||
# ── tjenester gruppert per service (CG5+CG6) ─────────────────────────────
|
||||
def get_service_totals(self, days: int = 30):
|
||||
"""
|
||||
Grupperer kostnader per tjeneste (ikke per SKU).
|
||||
Compute Engine vises som én rad med total, med SKU-detaljer som sub-liste.
|
||||
Unngår duplikate tjeneste-rader i dashbordet.
|
||||
"""
|
||||
query = f"""
|
||||
SELECT
|
||||
service.description AS service,
|
||||
|
|
@ -170,6 +174,8 @@ class BillingAgent:
|
|||
ORDER BY service, sku_cost DESC
|
||||
"""
|
||||
results = self.bq_client.query(query).result()
|
||||
|
||||
# Grupper SKU-er under tjeneste — én rad per tjeneste i dashbordet
|
||||
services: dict = {}
|
||||
for row in results:
|
||||
svc = row.service
|
||||
|
|
@ -182,13 +188,14 @@ class BillingAgent:
|
|||
"sku": row.sku,
|
||||
"sku_cost": round(float(row.sku_cost), 6),
|
||||
})
|
||||
|
||||
return sorted(services.values(), key=lambda x: x["total_cost"], reverse=True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
agent = BillingAgent()
|
||||
print("Summary:", agent.get_summary())
|
||||
print("Forecast:", agent.get_forecast())
|
||||
print("Anomalies:", agent.get_anomalies())
|
||||
print("By-service:", agent.get_service_totals())
|
||||
print("History:", agent.get_daily_history())
|
||||
print("Summary:", agent.get_summary())
|
||||
print("Forecast:", agent.get_forecast())
|
||||
print("Anomalies:", agent.get_anomalies())
|
||||
print("By-service:", agent.get_service_totals())
|
||||
print("History:", agent.get_daily_history())
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user