docs: HANDOFF update — OQ-31 løst, credit_pools levert (CG4-credits complete)
This commit is contained in:
parent
bc501c13ea
commit
5542d54890
158
docs/HANDOFF.md
158
docs/HANDOFF.md
|
|
@ -1,30 +1,68 @@
|
||||||
# HANDOFF — Vauco OS
|
# HANDOFF — Vauco OS
|
||||||
|
|
||||||
**Sist oppdatert:** 2026-06-13 06:46 CEST
|
**Sist oppdatert:** 2026-06-13 07:50 CEST
|
||||||
**Skrevet av:** Perplexity (stand-in) via GitHub MCP
|
**Skrevet av:** Perplexity (stand-in) via GitHub MCP
|
||||||
**Sprint:** CG4-credits — credits-panel levert, IAP-test blokkert
|
**Sprint:** CG4-credits — credit_pools fullført, frontend + backend levert
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✅ Gjort denne sesjonen (2026-06-13 — morgen)
|
## ✅ Gjort denne sesjonen (2026-06-13 — morgen, runde 2)
|
||||||
|
|
||||||
| Commit | Task | Detalj |
|
| Commit | Task | Detalj |
|
||||||
|--------|------|--------|
|
|--------|------|--------|
|
||||||
| [`f58ec09`](https://github.com/vauco-saas/OSVauco/commit/f58ec09d4c076b6e552eb06593e919c385673492) | **CG4-credits** `static/billing-dashboard.html` | Credits-panel lagt til: 4 KPI-kort (brukt/gjenstår/burn/runway), animert progress-bar, advarselsbanner, kreditter-per-type liste. Auto-poll hvert 5 min via `fetchCredits()` i `fetchAll()`. |
|
| [`bc501c1`](https://github.com/vauco-saas/OSVauco/commit/bc501c13ea9fb9da785885fea57b880cca2b07db) | **OQ-31 LØST** `ml/billing_agent.py` | `get_credits_status()` omskrevet: `credit_pools[]` med tre pools, `effective_days = min(runway_days, expires_days)`, `badge_class` (crit/warn/ok/inactive), `warning` som `bool`, utløpsdato fra env-var ISO-datoer (`GOOGLE_CREDIT_INFRA_EXPIRES` etc.). Tre hjelpefunksjoner: `_parse_expires_days()`, `_effective_days()`, `_badge_class()`. |
|
||||||
| Eksisterende | **CG4-credits** `ml/billing_agent.py` | `get_credits_status(days=90)` allerede implementert — 4 BQ-queries, runway-beregning, `GOOGLE_CREDIT_TOTAL_USD` env-var støtte. |
|
| [`c114f6c`](https://github.com/vauco-saas/OSVauco/commit/c114f6c32800c5de63430775e6d8fc7f23fd07d4) | **Frontend** `static/billing-dashboard.html` | Tre separate pool-bars, Free Trial expiry topbar-banner, NOK-visning gjennomgående, `Promise.allSettled()` for robust fetch. |
|
||||||
| Eksisterende | **CG4-credits** `main.py` | `GET /billing/credits` rute allerede registrert og koblet til `BillingAgent.get_credits_status()`. |
|
|
||||||
|
### Nye env-vars som må settes i Cloud Run
|
||||||
|
|
||||||
|
```
|
||||||
|
# Totalbeløp per pool (NOK)
|
||||||
|
GOOGLE_CREDIT_INFRA_NOK=5000
|
||||||
|
GOOGLE_CREDIT_VERTEX_NOK=2000
|
||||||
|
GOOGLE_CREDIT_DIALOGFLOW_NOK=1500
|
||||||
|
|
||||||
|
# Utløpsdatoer (ISO YYYY-MM-DD) — hentes fra GCP Console
|
||||||
|
GOOGLE_CREDIT_INFRA_EXPIRES=2026-07-10
|
||||||
|
GOOGLE_CREDIT_VERTEX_EXPIRES=2026-09-01
|
||||||
|
GOOGLE_CREDIT_DIALOGFLOW_EXPIRES=2026-09-01
|
||||||
|
|
||||||
|
# Valutakurs (default 10.5 om ikke satt)
|
||||||
|
USDNOK=10.8
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔴 Blokkert — `GET /billing/credits` ikke testet i prod
|
## ✅ Verifisering etter deploy (kjør disse)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Sjekk at credit_pools har 3 objekter med riktige felter
|
||||||
|
curl http://localhost:8080/billing/credits?days=90 | \
|
||||||
|
python3 -m json.tool | grep -E '"label"|"effective_days"|"badge_class"'
|
||||||
|
|
||||||
|
# 2. Bekreft warning er bool (ikke streng)
|
||||||
|
curl -s http://localhost:8080/billing/credits?days=90 | \
|
||||||
|
python3 -c "import json,sys; pools=json.load(sys.stdin)['credit_pools']; \
|
||||||
|
[print(p['label'], p['warning'], type(p['warning']).__name__) for p in pools]"
|
||||||
|
|
||||||
|
# 3. Test crit-path med 10 dagers utløp
|
||||||
|
GOOGLE_CREDIT_INFRA_EXPIRES=$(date -d "+10 days" +%Y-%m-%d) \
|
||||||
|
python3 -c "
|
||||||
|
import os, sys; sys.path.insert(0,'.')
|
||||||
|
os.environ['GOOGLE_CLOUD_PROJECT']='propane-will-491900-m5'
|
||||||
|
os.environ['BILLING_TABLE']='propane-will-491900-m5.billing_export.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX'
|
||||||
|
from ml.billing_agent import _parse_expires_days, _effective_days, _badge_class
|
||||||
|
exp = _parse_expires_days('GOOGLE_CREDIT_INFRA_EXPIRES')
|
||||||
|
print('expires_days:', exp, '| badge:', _badge_class(_effective_days(None, exp)))
|
||||||
|
# Forventet: expires_days: 10 | badge: crit
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔴 Blokkert — ændret status
|
||||||
|
|
||||||
### Problem 1: `cloud-run-proxy` ikke installert på dev-VM
|
### Problem 1: `cloud-run-proxy` ikke installert på dev-VM
|
||||||
|
|
||||||
```
|
|
||||||
gcloud run services proxy ... → krever cloud-run-proxy component
|
|
||||||
```
|
|
||||||
|
|
||||||
**Fix:**
|
|
||||||
```bash
|
```bash
|
||||||
gcloud components install cloud-run-proxy
|
gcloud components install cloud-run-proxy
|
||||||
|
|
||||||
|
|
@ -32,69 +70,41 @@ gcloud run services proxy osvauco-agent \
|
||||||
--region=us-central1 \
|
--region=us-central1 \
|
||||||
--project=propane-will-491900-m5 \
|
--project=propane-will-491900-m5 \
|
||||||
--port=8080
|
--port=8080
|
||||||
# (kjør i Terminal 1 — ikke bakgrunn)
|
|
||||||
|
|
||||||
# Terminal 2:
|
|
||||||
curl -s "http://localhost:8080/billing/credits?days=90" | python3 -m json.tool
|
curl -s "http://localhost:8080/billing/credits?days=90" | python3 -m json.tool
|
||||||
```
|
```
|
||||||
|
|
||||||
### Problem 2: `https://opax.vauco.no/billing/credits` returnerer tom respons
|
### Problem 2: IAP `roles/run.invoker` (uendret)
|
||||||
|
|
||||||
IAP-token er gyldig, men Cloud Run returnerer HTML-feilside i stedet for JSON.
|
|
||||||
Sannsynlig årsak: `user:chris.christiansen@vauco.no` mangler `roles/run.invoker`.
|
|
||||||
|
|
||||||
**Diagnose:**
|
|
||||||
```bash
|
```bash
|
||||||
curl -sv -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
|
curl -sv -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
|
||||||
"https://opax.vauco.no/billing/credits" 2>&1 | head -30
|
"https://opax.vauco.no/billing/credits" 2>&1 | head -30
|
||||||
```
|
|
||||||
|
|
||||||
**Fix hvis 403:**
|
# Fix hvis 403:
|
||||||
```bash
|
|
||||||
gcloud run services add-iam-policy-binding osvauco-agent \
|
gcloud run services add-iam-policy-binding osvauco-agent \
|
||||||
--region=us-central1 \
|
--region=us-central1 --project=propane-will-491900-m5 \
|
||||||
--project=propane-will-491900-m5 \
|
--member="user:chris.christiansen@vauco.no" --role="roles/run.invoker"
|
||||||
--member="user:chris.christiansen@vauco.no" \
|
|
||||||
--role="roles/run.invoker"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Problem 3: `GOOGLE_CREDIT_TOTAL_USD` ikke satt
|
|
||||||
|
|
||||||
Inntil denne er satt returnerer `/billing/credits` `"credit_runway_days": null`.
|
|
||||||
|
|
||||||
**Fix (enklest — vanlig env-var er nok for et tall):**
|
|
||||||
```
|
|
||||||
GCP Console → Cloud Run → osvauco-agent → Edit & Deploy
|
|
||||||
→ Variables & Secrets → Add Variable
|
|
||||||
→ GOOGLE_CREDIT_TOTAL_USD = 300
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔴 NESTE OPPGAVE — for Nemotron
|
## 🔴 Gjenstående OQ-er
|
||||||
|
|
||||||
**Jobb:** Verifiser `GET /billing/credits` end-to-end i prod.
|
| ID | Beskrivelse | Status |
|
||||||
|
|----|-------------|--------|
|
||||||
```
|
| **OQ-29** | `GET /notify/channels` mangler | Lav |
|
||||||
STEG 1 — Installer proxy
|
| **OQ-30** | `opax.html` browser-panel ikke pushet | Høy |
|
||||||
gcloud components install cloud-run-proxy
|
| **OQ-31** | `credit_pools[]` mangler i `get_credits_status()` | ✅ **LØST** 2026-06-13 |
|
||||||
|
|
||||||
STEG 2 — Test via proxy (ingen IAP-styr)
|
|
||||||
gcloud run services proxy osvauco-agent --region=us-central1 --project=propane-will-491900-m5 --port=8080
|
|
||||||
curl -s http://localhost:8080/billing/credits?days=90 | python3 -m json.tool
|
|
||||||
|
|
||||||
STEG 3 — Sjekk om kreditter faktisk finnes i BQ
|
|
||||||
bq query --use_legacy_sql=false \
|
|
||||||
'SELECT credit_type, SUM(amount) FROM `propane-will-491900-m5.billing_export.gcp_billing_export_v1_*`, UNNEST(credits) AS credit_type, amount GROUP BY 1 LIMIT 10'
|
|
||||||
|
|
||||||
STEG 4 — Sett GOOGLE_CREDIT_TOTAL_USD i Cloud Run env
|
|
||||||
|
|
||||||
STEG 5 — Verifiser runway vises i billing-dashboard.html
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✅ Gjort forrige sesjon (2026-06-12 — kveld)
|
## ✅ Gjort forrige sesjon (2026-06-13 — morgen, runde 1)
|
||||||
|
|
||||||
|
| Commit | Task | Detalj |
|
||||||
|
|--------|------|--------|
|
||||||
|
| [`f58ec09`](https://github.com/vauco-saas/OSVauco/commit/f58ec09d4c076b6e552eb06593e919c385673492) | **CG4-credits** `static/billing-dashboard.html` | Credits-panel lagt til: 4 KPI-kort, animert progress-bar, advarselsbanner, kreditter-per-type liste. |
|
||||||
|
|
||||||
|
## ✅ Gjort 2026-06-12 — kveld
|
||||||
|
|
||||||
| Commit | Task | Detalj |
|
| Commit | Task | Detalj |
|
||||||
|--------|------|--------|
|
|--------|------|--------|
|
||||||
|
|
@ -112,17 +122,6 @@ STEG 5 — Verifiser runway vises i billing-dashboard.html
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔴 Kjente OQ-er
|
|
||||||
|
|
||||||
| ID | Beskrivelse | Prioritet |
|
|
||||||
|----|-------------|-----------|
|
|
||||||
| **OQ-29** | `GET /notify/channels` mangler | Lav |
|
|
||||||
| **OQ-30** | `opax.html` browser-panel ikke pushet | Høy |
|
|
||||||
| **OQ-31** | `GOOGLE_CREDIT_TOTAL_USD` ikke satt i Cloud Run | Høy — blokkerer runway |
|
|
||||||
| **ML-3a** | `docs/gemma/world.md` mangler — blokkerer Emma | Blokkert |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🏗 Systemstatus
|
## 🏗 Systemstatus
|
||||||
|
|
||||||
| Komponent | Status |
|
| Komponent | Status |
|
||||||
|
|
@ -131,16 +130,16 @@ STEG 5 — Verifiser runway vises i billing-dashboard.html
|
||||||
| `opax.vauco.no` | ✅ Live |
|
| `opax.vauco.no` | ✅ Live |
|
||||||
| `main.py` | ✅ Hovudapp — alle ruter her |
|
| `main.py` | ✅ Hovudapp — alle ruter her |
|
||||||
| `GET /billing/credits` | ✅ Rute finnes — ⚠️ IKKE testet i prod |
|
| `GET /billing/credits` | ✅ Rute finnes — ⚠️ IKKE testet i prod |
|
||||||
| `ml/billing_agent.py` `get_credits_status()` | ✅ Implementert |
|
| `ml/billing_agent.py` `get_credits_status()` | ✅ credit_pools[] levert |
|
||||||
| `static/billing-dashboard.html` | ✅ Credits-panel live (CG4-credits) |
|
| `static/billing-dashboard.html` | ✅ Tre pool-bars + Free Trial banner |
|
||||||
| `static/costguard-dashboard.html` | ✅ Live — CG6 |
|
| `static/costguard-dashboard.html` | ✅ Live — CG6 |
|
||||||
| `static/opax.html` | ✅ Live — browser-panel MANGLER |
|
| `static/opax.html` | ✅ Live — browser-panel MANGLER (OQ-30) |
|
||||||
| `POST /notify/webhook` | ✅ CG5a |
|
| `POST /notify/webhook` | ✅ CG5a |
|
||||||
| `POST /notify/email` | ✅ CG5b |
|
| `POST /notify/email` | ✅ CG5b |
|
||||||
| `POST /notify/sms` | ✅ CG5c (Guard+) |
|
| `POST /notify/sms` | ✅ CG5c (Guard+) |
|
||||||
| `GET /notify/channels` | 🔴 OQ-29 |
|
| `GET /notify/channels` | 🔴 OQ-29 |
|
||||||
| `docs/gemma/world.md` | ❌ Mangler — blokkerer ML-3a |
|
| `docs/gemma/world.md` | ❌ Mangler — blokkerer ML-3a |
|
||||||
| `GOOGLE_CREDIT_TOTAL_USD` | 🔴 Ikke satt — runway vises ikke |
|
| `GOOGLE_CREDIT_INFRA_NOK` m.fl. | 🔴 Ikke satt i Cloud Run |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -168,10 +167,21 @@ STEG 5 — Verifiser runway vises i billing-dashboard.html
|
||||||
## Env-vars påkrevd
|
## Env-vars påkrevd
|
||||||
|
|
||||||
```
|
```
|
||||||
GOOGLE_CREDIT_TOTAL_USD=300 # 🔴 MANGLER — sett i Cloud Run env
|
# Kreditter — NOK-beløp og utløpsdatoer
|
||||||
|
GOOGLE_CREDIT_INFRA_NOK=5000
|
||||||
|
GOOGLE_CREDIT_INFRA_EXPIRES=2026-07-10
|
||||||
|
GOOGLE_CREDIT_VERTEX_NOK=2000
|
||||||
|
GOOGLE_CREDIT_VERTEX_EXPIRES=2026-09-01
|
||||||
|
GOOGLE_CREDIT_DIALOGFLOW_NOK=1500
|
||||||
|
GOOGLE_CREDIT_DIALOGFLOW_EXPIRES=2026-09-01
|
||||||
|
USDNOK=10.8
|
||||||
|
|
||||||
|
# Varsling
|
||||||
TWILIO_ACCOUNT_SID=ACxxxx
|
TWILIO_ACCOUNT_SID=ACxxxx
|
||||||
TWILIO_AUTH_TOKEN=xxxx
|
TWILIO_AUTH_TOKEN=xxxx
|
||||||
TWILIO_FROM_NUMBER=+47xxxxxxxx
|
TWILIO_FROM_NUMBER=+47xxxxxxxx
|
||||||
|
|
||||||
|
# Docs proxy
|
||||||
GITHUB_PAT=ghp_xxxx
|
GITHUB_PAT=ghp_xxxx
|
||||||
DOCS_BRANCH=main
|
DOCS_BRANCH=main
|
||||||
```
|
```
|
||||||
|
|
@ -192,4 +202,4 @@ DOCS_BRANCH=main
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Vauco AS · propane-will-491900-m5 · us-central1 · Sesjon avsluttet 2026-06-13 06:46 CEST*
|
*Vauco AS · propane-will-491900-m5 · us-central1 · Sesjon avsluttet 2026-06-13 07:50 CEST*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user