docs: add HANDOFF-LOCAL-LLM-GITEA-MCP + toolcheck results + static/build fixes
Some checks are pending
Check Python Version Consistency / Check Python Version (push) Waiting to run

This commit is contained in:
Gemini Agent 2026-07-21 14:22:06 +00:00
parent 2c035c8553
commit 8ff6ba8f60
13 changed files with 369 additions and 29 deletions

View File

@ -47,7 +47,7 @@ MODEL: gemini-2.5-pro
MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget
BUDGET_CAP: 2500 NOK — spør Chris om +1000 NOK ved behov BUDGET_CAP: 2500 NOK — spør Chris om +1000 NOK ved behov
OPERATOR: Chris Christiansen (chris.christiansen@vauco.no) OPERATOR: Chris Christiansen (chris.christiansen@vauco.no)
PRIMARY_GIT: http://34.67.252.59:3000/chris/OSVauco ← Gitea (master) PRIMARY_GIT: http://34.170.51.84:3000/chris/OSVauco ← Gitea (master)
GITHUB_LEGACY: https://github.com/vauco-saas/OSVauco ← GitHub (legacy/backup) GITHUB_LEGACY: https://github.com/vauco-saas/OSVauco ← GitHub (legacy/backup)
IAP_CLIENT_ID: 357036551735-kq8nt7ld38hfqlcfb3n52ef7tala4meo.apps.googleusercontent.com IAP_CLIENT_ID: 357036551735-kq8nt7ld38hfqlcfb3n52ef7tala4meo.apps.googleusercontent.com
``` ```
@ -64,7 +64,7 @@ Operatør er **Chris Christiansen** — erfaren DevOps/Cloud-utvikler. Vær dire
- Du HAR `gcloud`, `docker`, `git`, `curl`, `grep`, `cat`, `bash` — **bruk dem** - Du HAR `gcloud`, `docker`, `git`, `curl`, `grep`, `cat`, `bash` — **bruk dem**
- Du er inne i repoet — **les filer direkte** - Du er inne i repoet — **les filer direkte**
- Chris vet hva `gcloud` er — **ikke over-forklar** - Chris vet hva `gcloud` er — **ikke over-forklar**
- Gitea (`34.67.252.59:3000`) er primær Git (master) — GitHub er kun en legacy/backup - Gitea (`34.170.51.84:3000`) er primær Git (master) — GitHub er kun en legacy/backup
- Emma rapporterer til Chris (`chris.christiansen@vauco.no`) — ingen andre - Emma rapporterer til Chris (`chris.christiansen@vauco.no`) — ingen andre
--- ---
@ -133,7 +133,7 @@ gcloud auth list && gcloud config get-value project
ls -la ~/OSVauco/emma/data/morphic.db ~/OSVauco/emma/emma_flynn_log.jsonl 2>/dev/null || echo 'Emma ikke bootstrappt' ls -la ~/OSVauco/emma/data/morphic.db ~/OSVauco/emma/emma_flynn_log.jsonl 2>/dev/null || echo 'Emma ikke bootstrappt'
# 4. Gitea oppe? # 4. Gitea oppe?
curl -s http://34.67.252.59:3000/api/v1/version | python3 -m json.tool curl -s http://34.170.51.84:3000/api/v1/version | python3 -m json.tool
``` ```
Print deretter: Print deretter:
@ -254,7 +254,7 @@ gcloud run services add-iam-policy-binding [SERVICE]
```bash ```bash
bash <(curl -s "http://chris:$(gcloud secrets versions access latest bash <(curl -s "http://chris:$(gcloud secrets versions access latest
--secret=gitea-api-token --project=propane-will-491900-m5 --secret=gitea-api-token --project=propane-will-491900-m5
)@34.67.252.59:3000/chris/OSVauco/raw/branch/main/emma/setup.sh") )@34.170.51.84:3000/chris/OSVauco/raw/branch/main/emma/setup.sh")
echo 'source ~/.emma_env' >> ~/.bashrc && source ~/.emma_env echo 'source ~/.emma_env' >> ~/.bashrc && source ~/.emma_env
emma # start CLI emma # start CLI
@ -285,7 +285,7 @@ Les og print innhold fra: @docs/HANDOFF.md @docs/AGENT_RULEBOOK.md
git -C ~/OSVauco log --oneline -3 git -C ~/OSVauco log --oneline -3
gcloud auth list && gcloud config get-value project gcloud auth list && gcloud config get-value project
ls -la ~/OSVauco/emma/data/morphic.db 2>/dev/null || echo 'Emma ikke bootstrappt' ls -la ~/OSVauco/emma/data/morphic.db 2>/dev/null || echo 'Emma ikke bootstrappt'
curl -s http://34.67.252.59:3000/api/v1/version | python3 -m json.tool curl -s http://34.170.51.84:3000/api/v1/version | python3 -m json.tool
IKKE utfør noe — vent på PLAN APPROVED. IKKE utfør noe — vent på PLAN APPROVED.
HUSK: internett-søk er forbudt for diagnose. Bruk gcloud/cat/grep/git. HUSK: internett-søk er forbudt for diagnose. Bruk gcloud/cat/grep/git.

View File

@ -1,5 +1,5 @@
{ {
"workbench.colorTheme": "Light 2026", "workbench.colorTheme": "Dark 2026",
"files.autoSave": "afterDelay", "files.autoSave": "afterDelay",
"terminal.integrated.enableMultiLinePasteWarning": "never", "terminal.integrated.enableMultiLinePasteWarning": "never",
"terminal.integrated.profiles.windows": { "terminal.integrated.profiles.windows": {

View File

@ -17,17 +17,16 @@ steps:
args: ['push', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REPO}/opax-mcp:$BUILD_ID'] args: ['push', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REPO}/opax-mcp:$BUILD_ID']
waitFor: ['build'] waitFor: ['build']
# Steg 3: Render og deploy et midlertidig, oppdatert manifest # Steg 3: Deploy det nybygde imaget direkte til Cloud Run (Endelig Fiks)
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
id: render-and-deploy id: deploy
entrypoint: bash entrypoint: gcloud
args: args:
- '-c' - 'run'
- | - 'deploy'
NEW_IMAGE_URL="${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REPO}/opax-mcp:$BUILD_ID" - 'opax-mcp'
# Erstatter kun linjer som starter med "image:" - '--image=${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REPO}/opax-mcp:$BUILD_ID'
sed "s|^ *image:.*|image: $${NEW_IMAGE_URL}|g" opax-mcp.yaml > opax-mcp.rendered.yaml - '--region=${_REGION}'
gcloud run services replace opax-mcp.rendered.yaml --region=${_REGION} --project=${PROJECT_ID}
waitFor: ['push'] waitFor: ['push']
substitutions: substitutions:

View File

@ -23,7 +23,7 @@ SSH_CONFIG_PATH="/mnt/c/Users/Cvias/.ssh/config"
SSH_KEY_PATH="C:\Users\Cvias\.ssh\google_compute_engine" SSH_KEY_PATH="C:\Users\Cvias\.ssh\google_compute_engine"
# Git Remotes for Verification on GPU VM # Git Remotes for Verification on GPU VM
GITEA_REMOTE="http://34.67.252.59:3000/chris/OSVauco.git" GITEA_REMOTE="http://34.170.51.84:3000/chris/OSVauco.git"
GITHUB_REMOTE="git@github.com:vauco/osvauco.git" GITHUB_REMOTE="git@github.com:vauco/osvauco.git"
# --- Helper Functions --- # --- Helper Functions ---

View File

@ -0,0 +1,276 @@
# HANDOFF-LOKAL-LLM-GITEA-MCP.md
# EGEN HANDOFF UFRAVIKELIG STYRINGSDOKUMENT
# GJELDER FRA NÅ OG FREM TIL 100 % FERDIGSTILLELSE
## 0. STATUS OG KOMMANDO
Denne handoffen skal opprettes som et eget, separat handoff-dokument. Den skal ikke blandes inn i generelle handoff-notater, gamle migreringsblokker eller løse TODO-lister. Fra dette tidspunktet er dette dokumentet den eneste autoritative arbeidsplanen for sporet “lokal LLM-fabrikk + OPAX-MCP + Gitea stabilisering + blueprinting til Gitea-VM”. [cite:900][cite:914]
Denne handoffen skal følges slavisk frem til alt er 100 % verifisert. Den skal ikke omgås fordi noe “nesten virker”, fordi det “sikkert bare er en env var”, eller fordi noen vil hoppe rett til deploy, write-funksjoner eller blueprinting. Alt arbeid på dette sporet skal måles mot dette dokumentet og ingenting anses som ferdig før exit-kriteriene her er oppfylt. [cite:913][cite:916]
## 1. STRATEGISK MÅL
Målet er å etablere en komplett, stabil og replikerbar lokal driftsmodell på dev-snap/GPU-VM som kan fungere som en blueprint for en senere overføring til Gitea-VM. Dev-snap/GPU-VM brukes nå som en verifikasjons- og byggeflate for å få fart i arbeidet.
Den endelige målplattformen, Gitea-VM, er en CPU-VM med 16 GB RAM og 50 GB disk. Modellvalgene må derfor være optimalisert for CPU, RAM og disk. `gemma3:27b` og andre tunge modeller er uaktuelle for Gitea-VM. Målet er å låse et mindre, replikerbart modelloppsett.
En lettvekts tre-lags arkitektur (Gemma/Qwen/Gemma eller lignende) skal vurderes, med `qwen2.5:3b` som et sannsynlig mellomledd. Dette er den sannsynlige målarkitekturen som skal bekreftes videre gjennom dokumentasjon og kodebevis.
## 2. FASTE SANNHETER
Følgende punkter er låst og skal ikke debatteres under gjennomføring:
- Gitea er source of truth. GitHub er kun mirror/backup og skal ikke være aktiv automasjonsbane. [cite:911]
- Lokale modeller er hovedretning. API-basert agentvei er avleggs som primærbane i dette sporet. Kun nødvendige Google API-er beholdes. [cite:914]
- Dev-snap/GPU-VM er nåværende verifikasjonsflate. Gitea-VM er planlagt permanent målmaskin. [cite:900][cite:912]
- Denne handoffen overstyrer løs ad hoc-jobbing, muntlige antakelser og midlertidige “snarveier”. [cite:916]
## 3. AKTUELL REALITET
Dagens verifiserte bilde er ikke “alt fungerer”. Dagens verifiserte bilde er at store deler av GCP- og Workspace-sporet fungerer, men at lokalmodell- og Gitea-sporet fortsatt ikke er ferdig. Testoppsummeringen viser at `getconnectorstatus`, `gethealth`, `getbuildstatus`, `getstate`, `listcustomers`, `listgceinstances`, `listbuilds` og `listworkspaceusers` er OK, mens `listemmamodels` feiler og Gitea-verktøy feiler. [file:899]
Detaljtestene viser også at `getconnectorstatus` rapporterte `opaxmcpstatus: live`, `giteastatus: offline` og `toolcount: 37`, noe som bekrefter at MCP-serveren er oppe, men at Gitea-integrasjonen ikke er frisk. `list_commits` og `get_file` feiler med `Illegal header value b'token '`, mens `get_file_content` og `list_repo_files` feiler med `GITEA_URL environment variable is not set`. [file:898][file:894]
## 4. HOVEDREGEL
Ingen skal omtale dette systemet som “klart”, “stabilt”, “blueprintbart” eller “ferdig” før alle blokkerende feil i dette dokumentet er lukket med testbevis. Subjektiv følelse, vellykket enkeltrun eller tidligere suksessfull deploy er ikke tilstrekkelig. [file:899][file:898]
Ingen fase får passere på grunnlag av håp. Kun målbare resultater teller. “Vi vet sikkert hva problemet er” teller ikke. “Det virker for meg” teller ikke. “Det deployet uten error” teller ikke. Kun eksplisitt verifisert grønn status teller. [cite:916]
## 5. FORBUDTE AVSPORINGER
Følgende er forbudt frem til denne handoffen er fullført:
- Ingen blueprinting til Gitea-VM før dev-snap/GPU-VM er 100 % verifisert.
- Ingen write-capabilities i Gitea får prioritet før read-only-capabilities er helt grønne. [cite:910]
- Ingen ny featureutvikling i MCP mens kritiske read-only feil fortsatt står åpne.
- Ingen GitHub-først arbeidsflyt.
- Ingen fallback tilbake til gammel agent-/API-bane som hovedløsning.
- Ingen skjult eller udokumentert env-var-, secret- eller path-magi.
- Ingen “rydder senere”-holdning på modellnavn, URL-er, tokens eller handler-paths. [cite:911][cite:914][file:894]
## 6. FASE 0 LÅS SITUASJONEN
Formål:
Stoppe arkitekturglidning og definere ett operativt sannhetsgrunnlag.
Skal gjøres:
- Bekreft skriftlig at denne handoffen er opprettet som eget dokument.
- Bekreft skriftlig at dette dokumentet er styrende frem til fullført.
- Bekreft at dev-snap/GPU-VM er aktiv verifikasjonsbase.
- Bekreft at Gitea-VM er planlagt permanent målmaskin.
- Bekreft at lokal LLM-bane er primær retning.
- Bekreft at Gitea er eneste source of truth. [cite:900][cite:912][cite:914]
Exit-kriterium:
- Ingen motstridende handoff, faseplan eller “midlertidig hovedplan” står aktivt side om side.
## 7. FASE 1 LOKALE MODELLER SKAL LEVE
### Phase 1 Investigation & Clarification Report
**Blueprint & Target Architecture:**
* **Verification Platform:** The dev-snap/GPU-VM is the current platform for verification and blueprinting. This is to accelerate development.
* **Target Platform:** The blueprint created on the GPU-VM will be optimized for the Gitea-VM, which is a CPU-only machine with 16GB RAM and a 50GB disk.
* **Model Strategy:** The goal is to define a lightweight, replicable, three-tiered model architecture. `gemma3:27b` is considered a historical or temporary setting, not the target for the Gitea-VM. A likely architecture is a Gemma/Qwen/Gemma stack, with `qwen2.5:3b` as the middle layer. This is the likely target architecture that needs to be confirmed.
**Architectural Evidence:**
* **Heavy GPU Architecture Evidence:**
* `opax-mcp/server.py`: `EMMA_MODEL` is set to `gemma3:27b`.
* `docs/MASTERPLAN.md` and `docs/AGENT_RULEBOOK.md`: Mention a `gemma-4-12b-it` model on a GPU-VM.
* **Lightweight CPU Architecture Evidence:**
* User's explicit instructions.
* `opax-mcp/server.py`: Presence of `EMMA_FAST_MODEL` (`gemma3:4b`) and `EMMA_LIGHT_MODEL` (`qwen2.5:3b`).
* `emma/emma_run.py`: Default model is `llama3.2`.
**Files to be Changed Later:**
* `opax-mcp/server.py`: The `EMMA_MODEL`, `EMMA_FAST_MODEL`, and `EMMA_LIGHT_MODEL` environment variables will need to be updated.
* `cloudbuild.mcp.yaml`: The `OLLAMA_BASE_URL` will likely need to be updated.
* `docs/MASTERPLAN.md`: The AI model strategy will need to be updated.
* `docs/AGENT_RULEBOOK.md`: The model hierarchy will need to be updated.
* `emma/emma_run.py`: The default model may need to be changed.
**What is Still Unclear:**
* The exact models for the three-tiered architecture (front, middle, back) are not yet confirmed.
* The specific roles of `EMMA_FAST_MODEL` and `EMMA_LIGHT_MODEL` are not explicitly defined.
* The mapping between the `OSV/OSVrelay/Emma` concept and the `EMMA_` environment variables is not documented.
Formål:
Bevise at de 23 lokale modellene som er planlagt faktisk lever, kan listes, kan nås og kan brukes lokalt.
Bakgrunn:
Koden viser at OPAX-MCP allerede er skrudd mot en lokal Ollama-lignende backend via `OLLAMABASEURL`, og `listemmamodels` er definert i verktøyregisteret. Likevel feiler `listemmamodels` i dagens tester, og det er derfor et blokkerende hull i hovedretningen. [file:894][file:899]
Skal gjøres:
- Identifiser eksakt hvilke 23 lokale modeller som inngår i målarkitekturen.
- Dokumenter modellnavn nøyaktig, uten kallenavn eller gjetting.
- Dokumenter hvilken runtime som brukes.
- Dokumenter base URL / host for modellmotoren.
- Bekreft at runtime faktisk kjører.
- Bekreft at modellene kan listes.
- Bekreft at minst én enkel prompt mot lokal modell lykkes. [cite:913][cite:914][file:894]
Blokkerende feil:
- `listemmamodels` FAIL = fasen er ikke ferdig. [file:899]
- Manglende eller feil `OLLAMABASEURL` = fasen er ikke ferdig. [file:894]
- Modell finnes, men svarer ikke = fasen er ikke ferdig.
- Uklart hvilken modell som er “Emma”, “Emma Fast” eller “Qwen” = fasen er ikke ferdig. [file:894]
Exit-kriterium:
- Lokalmodellene er synlige, svarer lokalt og er dokumentert som produksjonsnær baseline. [cite:913]
## 8. FASE 2 MCP MÅ PEKE KORREKT TIL LOKAL MODELLSTI
Formål:
Bevise at OPAX-MCP ikke bare har modeller tilgjengelig, men faktisk bruker dem riktig.
Bakgrunn:
Koden viser at `runemma`, `runemmafast` og `runqwen` går via `ollamachat`, og at `listemmamodels` går via `OLLAMABASEURL/api/tags`. Dette betyr at den lokale modellveien allerede finnes i kodebasen, men ikke er verifisert som fullstendig operativ. [file:894]
Skal gjøres:
- Verifiser `OLLAMABASEURL`.
- Verifiser `EMMAMODEL`.
- Verifiser `EMMAFASTMODEL`.
- Verifiser `EMMALIGHTMODEL`.
- Bekreft at hver tool peker til riktig modell.
- Bekreft at responsene faktisk kommer lokalt.
- Bekreft at hovedløpet ikke skjult faller tilbake til gammel agent-/API-vei. [file:894][cite:914]
Forbud:
- Ingen aksept for “det går sikkert via lokal modell”.
- Ingen aksept for udokumenterte alias som bare finnes i én shell-session.
- Ingen aksept for modellnavn som må “huskes”.
Exit-kriterium:
- Det er entydig bevist hvilken modell hver tool bruker, og at kallene går lokalt. [file:894]
## 9. FASE 3 GITEA READ-ONLY SKAL TILBAKE I TJENESTE
Formål:
Gjenopprette full read-only funksjon mot Gitea før noe write-relatert arbeid vurderes.
Bakgrunn:
Read-only Gitea er en forutsetning for å kunne stole på Gitea som source of truth i verktøykjeden. Testene viser at dette ikke er sant ennå. `list_commits` og `get_file` feiler med `Illegal header value b'token '`, mens `get_file_content` og `list_repo_files` feiler med `GITEA_URL environment variable is not set`. [file:899][file:894]
Koden viser samtidig at gammel Gitea-sti bruker `GITEAURL` og `GITEATOKEN`, mens ny handlerbasert sti for `get_file_content` og `list_repo_files` delegerer til `giteahandler`, noe som svært sannsynlig betyr at dere har to forskjellige konfigurasjonsforventninger i spill. [file:894]
Skal gjøres:
- Fastslå én autoritativ URL-variabel for Gitea.
- Fastslå én autoritativ token-variabel for Gitea.
- Kartlegg forskjellen mellom `GITEAURL` og `GITEA_URL`.
- Kartlegg hvorfor token-header bygges som `token ` uten verdi.
- Rydd opp i env vars, secrets og handlerforventninger.
- Få alle read-only Gitea-tools til å gi ekte data, ikke bare slutte å kaste feil. [file:894][file:899]
Må være grønne:
- `list_commits`
- `get_file`
- `get_file_content`
- `list_repo_files` [file:899]
Forbud:
- Ingen write-testing før disse er grønne. [cite:910]
- Ingen “midlertidig hardkoding” som ikke dokumenteres og kan flyttes til Gitea-VM senere.
- Ingen aksept for at bare én av dem virker. Hele read-only-sporet skal være grønt.
Exit-kriterium:
- Alle fire read-only Gitea-tools returnerer gyldige svar og bruker konsistent konfigurasjon. [cite:910][file:899]
## 10. FASE 4 HEL KJEDE MÅ VÆRE SAMTIDIG GRØNN
Formål:
Sikre at lokale modeller, MCP, Gitea og øvrige read-only støttetjenester virker samtidig etter alle rettelser.
Bakgrunn:
Det er ikke nok at komponenter virker hver for seg på forskjellige tidspunkter. Systemet skal kunne stå samlet uten regressjon. Dagens tester viser at GCP- og Workspace-sporet i stor grad er grønt, så poenget her er å bevise at modell- og Gitea-rettelser ikke ødelegger det som allerede fungerer. [file:899]
Minste samlede smoke test:
- `getconnectorstatus`
- `gethealth`
- `getbuildstatus`
- `describe_service`
- `getworkspaceuser`
- `listworkspaceusers`
- `listemmamodels`
- `listcommits`
- `getfilecontent`
- `listrepofiles` [file:899][file:898]
Krav:
- Alle skal testes i samme kontrollrunde.
- Resultatene skal lagres og dokumenteres.
- Ny FAIL i tidligere grønn funksjon regnes som regresjon og blokkerer videre fremdrift.
Exit-kriterium:
- Hele kjeden er grønn i samme runde. [file:899]
## 11. FASE 5 FRYS BLUEPRINT PÅ DEV-SNAP
Formål:
Gjøre det fungerende dev-snap-oppsettet om til en presis og flyttbar mal for Gitea-VM.
Dette er ikke migrering ennå. Dette er frysing av sannhet.
Skal dokumenteres fullstendig:
- alle env vars,
- alle secrets,
- alle modellnavn,
- alle base URLs,
- alle nødvendige filer og paths,
- alle services,
- alle testkommandoer,
- hvilke deler som må være identiske på Gitea-VM,
- hvilke deler som kan være maskinspesifikke. [file:894][cite:905][cite:912]
Forbud:
- Ingen “vi kopierer bare disken og håper”.
- Ingen blueprinting basert på muntlig hukommelse.
- Ingen migrering før dette er skrevet ned ferdig.
Exit-kriterium:
- Oppsettet er så godt dokumentert at en ren replisering til Gitea-VM kan utføres uten ny arkitekturdebatt eller gjettearbeid. [cite:905][cite:912]
## 12. DEFINITION OF DONE
Dette sporet er først ferdig når samtlige punkter under er sanne samtidig:
- lokale modeller lever og kan brukes lokalt,
- OPAX-MCP bruker lokal modellbackend korrekt,
- `listemmamodels` er grønn,
- Gitea read-only tools er grønne,
- GCP/Workspace-kjernen er fortsatt grønn,
- konfigurasjon er konsolidert,
- ingen skjult API-/agentavhengighet står igjen som hovedbane,
- dev-snap-oppsettet er dokumentert godt nok til å blueprintes til Gitea-VM. [cite:914][file:899][file:894]
Før dette er oppnådd, er prosjektet ikke ferdig. Ikke nesten ferdig. Ikke deploy-ferdig. Ikke migreringsklart. Ikke blueprint-klar.
## 13. DAGENS BLOKKERENDE FEIL
Per nå skal følgende behandles som åpne blokkerende forhold:
- `listemmamodels` FAIL. [file:899]
- Gitea read-only FAIL. [file:899]
- `Illegal header value b'token '` på gammel Gitea-sti. [file:894][file:899]
- `GITEA_URL environment variable is not set` på ny handlersti. [file:894][file:899]
- `getconnectorstatus` viser Gitea offline. [file:898]
Ingen har lov å late som disse er sideproblemer. Dette er hovedproblemet.
## 14. OPERATIV PRIORITET REKKEFØLGE
Prioritet 1:
Få lokalmodell-banen frisk og dokumentert. [cite:913][file:899]
Prioritet 2:
Få Gitea read-only helt grønn med konsistent konfig. [file:894][file:899]
Prioritet 3:
Kjør full smoke test og bevis at alt virker samtidig. [file:899]
Prioritet 4:
Frys blueprint på dev-snap. [cite:905]
Prioritet 5:
Først deretter planlegg og utfør flytting til Gitea-VM. [cite:912]
## 15. ENDRINGSREGLER
Enhver endring under dette sporet skal oppdateres tilbake i denne handoffen samme dag.
Hver rettelse skal logges med:
- hva som var feil,
- hva som ble endret,
- hvordan det ble verifisert,
- om det finnes risiko for regresjon,
- hvilken fase som nå er påvirket.
Ingen “usynlige” endringer er akseptable.
## 16. SLUTTORDRE
Denne handoffen er opprettet nettopp for å stoppe glidning, halve sannheter og premature hopp til neste steg. Den skal derfor følges konsekvent helt til systemet er 100 % verifisert og klart for blueprinting til Gitea-VM. Enhver aktivitet som ikke bringer systemet nærmere grønne porter i dette dokumentet er støy og skal nedprioriteres. [cite:916][cite:918]

View File

@ -4,11 +4,22 @@
**Skrevet av:** Perplexity (for Chris Christiansen) **Skrevet av:** Perplexity (for Chris Christiansen)
**Status:** Fase D — VM oppgradert, Gitea som primær, Ollama neste **Status:** Fase D — VM oppgradert, Gitea som primær, Ollama neste
### REPO TRUTH AND BACKUP STATUS (2026-07-16)
- Gitea is the authoritative source of truth for OSVauco.
- Main was successfully pushed to Gitea and is now aligned at commit e2f43391549a1950f081aa1bc9c1b2ecd3582ef5.
- GitHub is not part of the active automation path.
- GitHub is only an optional manual backup mirror.
- The current Gitea post-receive hook for GitHub mirroring is non-blocking and may fail without affecting the authoritative Gitea repo.
- Do not rely on GitHub mirror status for operational truth.
- If backup is needed later, it can be done manually after the primary Gitea path is stable.
### Gitea + OPAX-MCP status (2026-07-07) ### Gitea + OPAX-MCP status (2026-07-07)
- Gitea er migrert til CPU-VM `gitea-cpu-vm` og svarer på `http://34.67.252.59:3000` og `/api/v1/version`. - Gitea er migrert til CPU-VM `gitea-cpu-vm` og svarer på `http://34.170.51.84:3000` og `/api/v1/version`.
- OSVauco-repoet på dev-VM har remotes: - OSVauco-repoet på dev-VM har remotes:
- `origin` + `gitea`: `http://34.67.252.59:3000/chris/OSVauco.git`. - `origin` + `gitea`: `http://34.170.51.84:3000/chris/OSVauco.git`.
- Alle tidligere hardkodede Gitea-IP-er er oppdatert til CPU-VM: - Alle tidligere hardkodede Gitea-IP-er er oppdatert til CPU-VM:
- `opax-mcp/server.py` (`GITEA_URL` default), - `opax-mcp/server.py` (`GITEA_URL` default),
- `emma/emma_gitea.py` (Emma-klient), - `emma/emma_gitea.py` (Emma-klient),
@ -31,7 +42,7 @@ Dette dokumentet er oppdatert til å reflektere at Gitea på CPU-VM er ny primæ
- **Region:** `us-central1` | **Service:** `osvauco-agent` | **Prosjekt:** `propane-will-491900-m5` - **Region:** `us-central1` | **Service:** `osvauco-agent` | **Prosjekt:** `propane-will-491900-m5`
- **ALDRI** `--audiences`-flag med `gcloud auth print-identity-token` — det er for service accounts, ikke user accounts - **ALDRI** `--audiences`-flag med `gcloud auth print-identity-token` — det er for service accounts, ikke user accounts
- **IAP identity token:** hentes fra GCE metadata server, IKKE fra gcloud CLI - **IAP identity token:** hentes fra GCE metadata server, IKKE fra gcloud CLI
- **Primær Git:** `http://34.59.131.162:3000/chris/OSVauco` — Gitea er nå kilde, GitHub er kun backup. - **Primær Git:** `http://34.170.51.84:3000/chris/OSVauco` — Gitea er nå kilde, GitHub er kun backup.
- **git remote:** `origin` = Gitea. GitHub-remote er fjernet. - **git remote:** `origin` = Gitea. GitHub-remote er fjernet.
- **Emma rapporterer til:** Chris Christiansen `chris.christiansen@vauco.no` — ingen andre kan gi GO - **Emma rapporterer til:** Chris Christiansen `chris.christiansen@vauco.no` — ingen andre kan gi GO
- **emma_runner.py finnes IKKE** — riktig fil er `emma/emma_run.py` - **emma_runner.py finnes IKKE** — riktig fil er `emma/emma_run.py`
@ -300,14 +311,14 @@ Blueprint-/kunde-/hjem-profiler (senere)
Diagnose har avdekket at en aktiv Gitea-instans kjører på en midlertidig VM, og at lastbalanserer peker feil. Dette løses ved en kontrollert migrering til en ny, permanent VM, ikke ved å fikse den gamle. Diagnose har avdekket at en aktiv Gitea-instans kjører på en midlertidig VM, og at lastbalanserer peker feil. Dette løses ved en kontrollert migrering til en ny, permanent VM, ikke ved å fikse den gamle.
* **Kilde-VM:** `osvauco-dev-from-snap` (i `us-west4-a`) * **Kilde-VM:** `osvauco-dev-from-snap` (i `us-west4-a`)
* **Kilde-data:** `/opt/gitea/data/` (inneholder `app.ini` med `ROOT_URL=http://34.59.131.162:3000/`) * **Kilde-data:** `/opt/gitea/data/` (inneholder `app.ini` med `ROOT_URL=http://34.170.51.84:3000/`)
* **Mål-VM:** Ny `gitea-cpu-vm` (i `us-central1-b`, som per arkitekturbeslutning) * **Mål-VM:** Ny `gitea-cpu-vm` (i `us-central1-b`, som per arkitekturbeslutning)
* **Mål-data:** `/opt/gitea/data/` * **Mål-data:** `/opt/gitea/data/`
**Nøkkelsteg ved migrering:** **Nøkkelsteg ved migrering:**
1. Data fra kilde-VM må kopieres til mål-VM. 1. Data fra kilde-VM må kopieres til mål-VM.
2. `ROOT_URL` i `app.ini` på mål-VM **må** oppdateres fra `http://34.59.131.162:3000/` til `https://git.vauco.no/`. 2. `ROOT_URL` i `app.ini` på mål-VM **må** oppdateres fra `http://34.170.51.84:3000/` til `https://git.vauco.no/`.
3. Lastbalanserer-backend (`vauco-os-backend`) må pekes til den nye `gitea-cpu-vm` **etter** at migreringen er testet og verifisert. 3. Lastbalanserer-backend (`vauco-os-backend`) må pekes til den nye `gitea-cpu-vm` **etter** at migreringen er testet og verifisert.
--- ---

View File

@ -14,7 +14,7 @@
- **ALDRI** `--audiences`-flag med `gcloud auth print-identity-token` — det er for service accounts, ikke user accounts - **ALDRI** `--audiences`-flag med `gcloud auth print-identity-token` — det er for service accounts, ikke user accounts
- **IAP identity token:** hentes fra GCE metadata server, IKKE fra gcloud CLI - **IAP identity token:** hentes fra GCE metadata server, IKKE fra gcloud CLI
- **Smoke-test:** peker alltid på `/health` - **Smoke-test:** peker alltid på `/health`
- **Primær Git:** `http://34.59.131.162:3000/chris/OSVauco` — GitHub er mirror, IKKJE kilde - **Primær Git:** `http://34.170.51.84:3000/chris/OSVauco` — GitHub er mirror, IKKJE kilde
- **Emma rapporterer til:** Chris Christiansen `chris.christiansen@vauco.no` — ingen andre kan gi GO - **Emma rapporterer til:** Chris Christiansen `chris.christiansen@vauco.no` — ingen andre kan gi GO
--- ---
@ -47,7 +47,7 @@
| Perplexity Connector | [Perplexity Connectors](https://www.perplexity.ai/computer/connectors) | ⏳ Klar for test | | Perplexity Connector | [Perplexity Connectors](https://www.perplexity.ai/computer/connectors) | ⏳ Klar for test |
| opax.vauco.no IAP | https://opax.vauco.no | ✅ Live | | opax.vauco.no IAP | https://opax.vauco.no | ✅ Live |
| Jason (Vertex AI Agent) | Agent Engine, us-central1 | ✅ Live | | Jason (Vertex AI Agent) | Agent Engine, us-central1 | ✅ Live |
| Gitea (self-hosted) | http://34.59.131.162:3000 | ✅ Live (v1.22.6) | | Gitea (self-hosted) | http://34.170.51.84:3000 | ✅ Live (v1.22.6) |
| Emma på VM | `~/OSVauco/emma/` | ✅ morphic.db, 38 mønstre, 11 sesjoner | | Emma på VM | `~/OSVauco/emma/` | ✅ morphic.db, 38 mønstre, 11 sesjoner |
--- ---

View File

@ -4,7 +4,7 @@ EMMA_IDENTITY = {
"email": "emma.vauger@vauco.no", "email": "emma.vauger@vauco.no",
"role": "AI-operativ og systemagent for Vauco AS", "role": "AI-operativ og systemagent for Vauco AS",
"reports_to": "Chris Christiansen <chris.christiansen@vauco.no>", "reports_to": "Chris Christiansen <chris.christiansen@vauco.no>",
"primary_git": "http://34.59.131.162:3000/chris/OSVauco", "primary_git": "http://34.170.51.84:3000/chris/OSVauco",
"opax_url": "https://opax.vauco.no", "opax_url": "https://opax.vauco.no",
"gcp_project": "propane-will-491900-m5", "gcp_project": "propane-will-491900-m5",
"colleague": "Jason (kundevendt agent — ikke konkurrent, kollega)", "colleague": "Jason (kundevendt agent — ikke konkurrent, kollega)",

View File

@ -219,7 +219,7 @@
<svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg> <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
Cloud Build Cloud Build
</a> </a>
<a class="nav-item" href="https://ssh.cloud.google.com/v2/ssh/projects/propane-will-491900-m5/zones/europe-west4-a/instances/osvauco-dev-vm" target="_blank"> <a class="nav-item" href="https://ssh.cloud.google.com/v2/ssh/projects/propane-will-491900-m5/zones/us-central1-b/instances/osvauco-dev-from-snap" target="_blank">
<svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/></svg> <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/></svg>
VM Shell VM Shell
</a> </a>

View File

@ -510,18 +510,18 @@
<div class="vm-hd"> <div class="vm-hd">
<span style="font-size:22px">🖥️</span> <span style="font-size:22px">🖥️</span>
<div> <div>
<div class="vm-name">osvauco-dev-vm</div> <div class="vm-name">osvauco-dev-from-snap</div>
<div class="vm-type">e2-standard-2 · us-central1-b</div> <div class="vm-type">e2-standard-2 · us-central1-b</div>
</div> </div>
</div> </div>
<div class="vm-meta"> <div class="vm-meta">
<div class="vm-row"><span class="vm-k">IP ekstern</span><span class="vm-v">34.59.131.162</span></div> <div class="vm-row"><span class="vm-k">IP ekstern</span><span class="vm-v">34.170.51.84</span></div>
<div class="vm-row"><span class="vm-k">IP intern</span><span class="vm-v">10.128.0.5</span></div> <div class="vm-row"><span class="vm-k">IP intern</span><span class="vm-v">10.128.0.5</span></div>
<div class="vm-row"><span class="vm-k">Prosjekt</span><span class="vm-v">propane-will-491900-m5</span></div> <div class="vm-row"><span class="vm-k">Prosjekt</span><span class="vm-v">propane-will-491900-m5</span></div>
</div> </div>
<div class="vm-running">RUNNING</div> <div class="vm-running">RUNNING</div>
<div class="vm-actions"> <div class="vm-actions">
<a class="vm-btn" href="https://ssh.cloud.google.com/v2/ssh/projects/propane-will-491900-m5/zones/us-central1-b/instances/osvauco-dev-vm" target="_blank">🔗 SSH</a><button class="vm-btn" onclick="showSshKey('osvauco-dev-vm')">🔑 SSH-nøkkel</button</a> <a class="vm-btn" href="https://ssh.cloud.google.com/v2/ssh/projects/propane-will-491900-m5/zones/us-central1-b/instances/osvauco-dev-from-snap" target="_blank">🔗 SSH</a><button class="vm-btn" onclick="showSshKey('osvauco-dev-from-snap')">🔑 SSH-nøkkel</button</a>
<a class="vm-btn" href="https://console.cloud.google.com/compute/instancesDetail/zones/us-central1-b/instances/osvauco-dev-vm?project=propane-will-491900-m5" target="_blank">⚙ GCP</a> <a class="vm-btn" href="https://console.cloud.google.com/compute/instancesDetail/zones/us-central1-b/instances/osvauco-dev-vm?project=propane-will-491900-m5" target="_blank">⚙ GCP</a>
<button class="vm-btn stop" onclick="confirmVmStop()">⏹ Stop</button> <button class="vm-btn stop" onclick="confirmVmStop()">⏹ Stop</button>
</div> </div>
@ -1066,7 +1066,7 @@ async function termKey(e){
} }
} }
async function showSshKey(vm){ const r=await fetch('/vm/ssh-key?vm='+vm) const d=await r.json() const key=d.ssh_public_key||d.error||'Ingen nøkkel funnet' let m=document.getElementById('ssh-key-modal') if(!m){ m=document.createElement('div') m.id='ssh-key-modal' m.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:9999;display:flex;align-items:center;justify-content:center' m.innerHTML='<div style="background:var(--bg-2);border:1px solid var(--border);border-radius:12px;padding:24px;max-width:600px;width:90%;position:relative"><h3 style="margin:0 0 12px">🔑 SSH Public Key — '+vm+'</h3><textarea readonly style="width:100%;height:120px;background:var(--bg-3);border:1px solid var(--border);border-radius:6px;padding:8px;color:var(--text);font-family:var(--mono);font-size:11px;resize:none" id="ssh-key-txt"></textarea><div style="display:flex;gap:8px;margin-top:12px"><button onclick="navigator.clipboard.writeText(document.getElementById(\'ssh-key-txt\').value);this.textContent=\'✅ Kopiert!\'" style="background:var(--accent);color:#000;border:none;border-radius:6px;padding:8px 16px;cursor:pointer;font-weight:600">📋 Kopier</button><button onclick="document.getElementById(\'ssh-key-modal\').remove()" style="background:var(--bg-3);border:1px solid var(--border);border-radius:6px;padding:8px 16px;cursor:pointer">Lukk</button></div></div>' document.body.appendChild(m) } document.getElementById('ssh-key-txt').value=key m.style.display='flex' } function confirmVmStop(){ async function showSshKey(vm){ const r=await fetch('/vm/ssh-key?vm='+vm) const d=await r.json() const key=d.ssh_public_key||d.error||'Ingen nøkkel funnet' let m=document.getElementById('ssh-key-modal') if(!m){ m=document.createElement('div') m.id='ssh-key-modal' m.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:9999;display:flex;align-items:center;justify-content:center' m.innerHTML='<div style="background:var(--bg-2);border:1px solid var(--border);border-radius:12px;padding:24px;max-width:600px;width:90%;position:relative"><h3 style="margin:0 0 12px">🔑 SSH Public Key — '+vm+'</h3><textarea readonly style="width:100%;height:120px;background:var(--bg-3);border:1px solid var(--border);border-radius:6px;padding:8px;color:var(--text);font-family:var(--mono);font-size:11px;resize:none" id="ssh-key-txt"></textarea><div style="display:flex;gap:8px;margin-top:12px"><button onclick="navigator.clipboard.writeText(document.getElementById(\'ssh-key-txt\').value);this.textContent=\'✅ Kopiert!\'" style="background:var(--accent);color:#000;border:none;border-radius:6px;padding:8px 16px;cursor:pointer;font-weight:600">📋 Kopier</button><button onclick="document.getElementById(\'ssh-key-modal\').remove()" style="background:var(--bg-3);border:1px solid var(--border);border-radius:6px;padding:8px 16px;cursor:pointer">Lukk</button></div></div>' document.body.appendChild(m) } document.getElementById('ssh-key-txt').value=key m.style.display='flex' } function confirmVmStop(){
if(!confirm('⚠️ Stop osvauco-dev-vm? Du mister SSH-tilgang til den startes igjen.')) return if(!confirm('⚠️ Stop osvauco-dev-from-snap? Du mister SSH-tilgang til den startes igjen.')) return
tprint('→ Stopper VM via: bash scripts/stop-osvauco-dev-vm.sh','info') tprint('→ Stopper VM via: bash scripts/stop-osvauco-dev-vm.sh','info')
go('terminal') go('terminal')
} }

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
describe_service OK
list_service_revisions OK
get_cloud_run_logs OK
get_build_log OK
get_workspace_user OK
get_emails OK
list_calendar_events OK
get_file FAIL :: Illegal header value b'token '
get_file_content FAIL :: GITEA_URL environment variable is not set.
list_repo_files FAIL :: GITEA_URL environment variable is not set.

View File

@ -0,0 +1,11 @@
get_connector_status OK
get_billing_summary OK
get_health OK
get_build_status OK
get_state OK
list_customers OK
list_gce_instances OK
list_builds OK
list_workspace_users OK
list_emma_models FAIL ::
list_commits FAIL :: Illegal header value b'token '