* chore(docs): konsolider MASTERPLAN/ROADMAP/HANDOFF til én sannhet
Bakgrunn: revisjon 2026-05-31 avdekket at vi hadde to MASTERPLAN-er som
ikke matchet, en deprecated VAUCO_OS_ROADMAP som fortsatt ble brukt, tre
parallelle HANDOFF-filer, AGENT_RULEBOOK med feil region (us-central1)
og feil MCP_SERVICE (opax-mcp-core), og committed Git merge-konflikt-
markører i selve session-loggen.
Endringer:
- Ny docs/MASTERPLAN.md (autoritativ, erstatter både rot-MASTERPLAN.md og
forrige docs-versjon). Tydeligere hierarki:
Vauco AS → Vauco OS (plattform) → OPAX (engine) → Moduler
- Ny docs/ROADMAP.md (erstatter docs/VAUCO_OS_ROADMAP.md som var deprecated)
- Ny docs/HANDOFF.md — én fil, overskrives per sesjon (per planregelen)
- Oppdatert docs/AGENT_RULEBOOK.md:
Region: us-central1 → europe-west1
AI-modell: gemini-2.5-pro (midlertidig, venter på Claude EU-kvote)
Vertex AI loc: europe-west1
MCP_SERVICE: opax-mcp-core → osvauco-agent
- Fjernet Git merge-konfliktmarkører i docs/OSVAUCO_OPAX_SESSION_LOG.md
- Flyttet HANDOFF_20260526/20260531/20260531_claude47 → docs/archive/handoffs/
- Slettet duplikat-filer i docs/archive/ (Cost_Management_Rules,
GCPBestPractices, OSVAUCO_OPAX_SESSION_LOG — alle dekket av live-filer)
- Slettet rot-MASTERPLAN.md (erstattet av peker-fil), VAUCO_OS_ROADMAP.md,
Procfile (legacy fra POC, ikke brukt av Cloud Run)
- docs/TODO.md → peker-fil mot ROADMAP
Repo-strategi (fra MASTERPLAN §3):
- 4 aktive repos: OSVauco (mono), vauco-bootstrap, threadstone-landing,
vauco-saas.github.io
- 3 arkiverte: vauco-os, vauco-gemini-tui-bridge, command-hub
- 2 parkerte (lever videre, ikke aktivt jobb): threadstone-instructions,
deep-dream — venter på hver sin trigger (Threadstone-app pilot / første
betalende kunde på CostGuard)
Etter merge: neste oppgave er F8 (browser-end-to-end på opax.vauco.no).
Co-authored-by: Perplexity <noreply@perplexity.ai>
* docs: inkorporer vauco.no salgsportal (apex) i planen
Hovedhull avdekket: vauco.no viser fortsatt Proisp 'Under construction'
placeholder. Planen manglet helt et spor for apex-siden — bedriftens
ansikt utad og portalen som leder besøkende til riktig modul.
MASTERPLAN endringer:
- §1 Plattformhierarki: utvidet fra 3 til 4 nivåer; vauco.no apex
lagt til som egen kunde-flate (over Vauco OS i hierarkiet)
- §2 Domener: vauco.no/www.vauco.no markert som placeholder (skal
erstattes), reserverte subdomener (status./docs./careers.)
dokumentert, email-infra-status notert
- §3 Repos: vauco-site lagt til som 5. aktive repo (public,
GitHub Pages — eget repo fordi sidens kildekode skal være public
mens mono-repoet må forbli privat)
- §4b NY: vauco.no salgsportal — full spec for formål, IA,
visuell retning, salgs-flow, teknisk stack, versjons-evolusjon
V1 → V4
- §11 Kjente hull: OQ-23..OQ-26 lagt til (apex-placeholder,
SPF/DKIM/DMARC, personvern/vilkår, statuspage)
ROADMAP endringer:
- NEXT-seksjon utvidet med V-spor: V1a–V1e (vauco.no MVP)
kan kjøres parallelt med CG3
- KJENTE HULL-seksjon lagt til
HANDOFF oppdatert med oppsummering av nye tillegg.
NY FIL: docs/vauco-site/DESIGN.md
- Klar-til-plukk-opp build-spec for V1 MVP
- Sidekart, copy-utkast, farger, typografi, layout, performance-mål
- DNS-tabell for å flytte vauco.no fra Proisp-parking til GitHub Pages
- SPF/DKIM/DMARC oppskrift
- Bygg-rekkefølge med konkrete gh/git-kommandoer
- Akseptkriterier for V1 APPROVED
Etter merge har vi to parallelle spor:
- Spor A: F8 (OPAX end-to-end) + CG3 (CostGuard frontend)
- Spor B: V1 (vauco.no MVP)
Begge har egne HITL gates.
* chore(scripts): konsolider boot/opax/opax2 + hotkeys + README
- boot.sh: ny daglig VM-starter (rename fra osvauco-opax-boot.sh)
* auto-fornyer gcloud auth + ADC (>8t)
* git pull current branch
* spør: opax (Gemini 2.5 Pro) / opax2 (Claude) / hopp over
* setter aliaser: pf hc st at ca cl cg costs ms logg mp rl ho rb sl osv sol
* printer NESTE OPPGAVE fra docs/HANDOFF.md
- opax.sh: region europe-west1, model gemini-2.5-pro, peker på docs/HANDOFF.md
- opax2.sh: peker på docs/HANDOFF.md (ikke arkivert handoff), advarer om kvote
- scripts/README.md: hotkey-tabell + bashrc-snippet + lock-tabell
- Slettet: scripts/archived/ (7 filer i git-historikk), osvauco-health-check.sh
* fix(scripts): OS VAUCO-header, github-status, auto-context, exit-hook
boot.sh:
- Ny header: OS VAUCO (stort) + Vauco OS subtitle
- [ REPO + GITHUB ] viser: fetch, pull, ahead/behind, uncommitted, last commit,
gh CLI auth-status, åpne PRs på branchen
- 'ghs' alias = gh pr list + gh issue list
- NESTE OPPGAVE regex case-insensitive (matcher 'NESTE OPPGAVE' og 'Neste oppgave')
opax.sh / opax2.sh:
- Ny header: OS VAUCO / OPAX (cyan) og OS VAUCO / OPAX2 (Claude) (magenta)
- Sjekker MASTERPLAN + ROADMAP + RULEBOOK + HANDOFF + gh auth i preflight
- Auto-laster RULEBOOK + MASTERPLAN + ROADMAP + HANDOFF inn i CLI som kontekst
ved oppstart (gemini -p / claude -p, fallback til stdin)
- Exit-hook: spør 'Vil du logge sesjonen nå?' når TUI avsluttes, kjører sol()
- ABSOLUTT REGEL (ingen handling uten PLAN APPROVED) injiseres i kontekst
* fix(scripts): NESTE OPPGAVE-parsing + gemini sandbox workaround
- Bytt awk(IGNORECASE) → sed-pipeline som funker på både gawk og mawk
(HANDOFF.md har '## 🔄 Neste oppgave: ...' — emoji + capitalized)
- Flytt auto-context fra /tmp/ → $OSVAUCO_DIR/.gemini/context/ og .claude/context/
Gemini CLI sandboxer alt utenfor workspace; /tmp er blokkert.
- Send relativ sti (.gemini/context/session-PID.md) til 'gemini -p @...'
- Rydd context-filer eldre enn 1 dag ved oppstart
- .gitignore: ekskluder .gemini/context/ + .claude/context/
* fix(scripts): flytt context til tmp-context/ (Gemini respekterer .gitignore)
Gemini CLI nekter å lese filer som er git-ignored. .gemini/context/ var
ignored, så context-fil ble blokkert.
- Ny mappe: tmp-context/ (innenfor workspace, ikke gitignored som dir)
- Kun session-*.md er gitignored (selve filene), ikke mappen
- tmp-context/README.md beholder mappen i git
- Ny .geminiignore: lar Gemini lese tmp-context/ men ignorerer
node_modules, .terraform, dist osv.
* fix(scripts): bytt context-filnavn til ctx-*.md (Gemini respekterer .gitignore)
Gemini CLI blokkerer enhver fil som matcher et .gitignore-mønster, selv
om den ikke er i .geminiignore. Vi hadde 'tmp-context/session-*.md' i
.gitignore som blokkerte session-PID.md.
Løsning:
- Fjern session-pattern fra .gitignore helt
- Bytt filnavn: session-$$.md → ctx-$$.md
- Mappen ryddes uansett av find -mtime +1 -delete ved hver opax-oppstart
- Kommentar i .gitignore forklarer hvorfor og hvordan skippe lokalt
* fix(scripts): start gemini/claude TUI uten -p (TUI bombet pga non-interactive mode)
Problem: 'gemini -p "..."' kjører non-interactive (svarer + avslutter) —
det er derfor TUI ikke kom opp etter at vi la til auto-context.
Løsning: Gemini CLI auto-laster .gemini/GEMINI.md ved hver TUI-start.
- Oppdaterte .gemini/GEMINI.md: model=gemini-2.5-pro (var Claude 4.6),
boot-prompt peker på MASTERPLAN/ROADMAP/HANDOFF (var slettet ROADMAP)
- opax.sh og opax2.sh: fjernet -p flag, kjører bare 'gemini'/'claude' = full TUI
- Slettet tmp-context/ (ikke nødvendig — GEMINI.md gjør jobben)
- Modellen får LOCKED DEFS automatisk fra GEMINI.md
- For full kontekst-load, skriv 'BOOT' i TUI
* chore(session): logg 20260531-153243 — git pull origin chore/consolidate-2026-05-31
* feat(opax): auto-kjør BOOT-prompt ved hver TUI-start
---------
Co-authored-by: Perplexity <noreply@perplexity.ai>
Co-authored-by: Chris Christiansen <chris.christian...@>
13 KiB
GEMINI.md — OSVauco / OPAX
Claude Opus 4.6 · Vertex AI EU endpoint · Nemotron session protocol · HITL-safe
Locked Definitions
MCP_NAME: OPAX-MCP
MCP_PROTOCOL: OPAX Protocol
ROOT_DOMAIN: vauco.no
HUB_URL: https://opax.vauco.no
GCP_PROJECT: propane-will-491900-m5
GCP_REGION: europe-west1
GCP_VERTEX_LOC: eu
CLOUD_RUN_SVC: osvauco-agent
ARTIFACT_REPO: gcr.io/propane-will-491900-m5
MODEL: gemini-2.5-pro
MODEL_PROVIDER: Vertex AI (Google) — europe-west1
MODEL_COST: Vertex pris (Gemini 2.5 Pro)
MODEL_NOTE: Midlertidig på Gemini inntil Claude-kvote er innvilget. Claude-variant: opax2 (claude-opus-4-7@20260301)
BUDGET_CAP: 2500 NOK intern grense — spør Chris om +1000 NOK ved behov
OPERATOR: Chris Christiansen (chris.christiansen@vauco.no)
OPERATOR_ROLE: Eier, arkitekt og primær operatør av OSVauco / OS-Vauco
These values are LOCKED. Do NOT change without explicit human instruction.
Modell: Claude Opus 4.6 via Vertex AI
Denne agenten kjøres med Claude Opus 4.6 tilgjengelig via Vertex AI EU multi-region endpoint.
- Data forblir innenfor EU-grensen (GDPR-compliant)
- Ingen separat Anthropic API-nøkkel — billing via eksisterende GCP-konto
- EU endpoint auto-routes internt mellom europeiske regioner for kapasitet
- Intern budsjett-cap: 2 500 NOK — ved behov for mer, spør Chris eksplisitt om +1 000 NOK
# Korrekt initialisering
import anthropic
client = anthropic.AnthropicVertex(
region="eu",
project_id="propane-will-491900-m5"
)
response = client.messages.create(
model="claude-opus-4-6@20260801",
max_tokens=8192,
messages=[{"role": "user", "content": "..."}]
)
# Auth
gcloud auth application-default login --project=propane-will-491900-m5
Kontekst: Hvem og hvordan
Operatør: Chris Christiansen — eier og arkitekt bak OSVauco og OS-Vauco. Chris er en erfaren DevOps/Cloud-utvikler. Han er teknisk, presis og forventer det samme av agenten.
- Ikke over-forklar. Chris vet hva
gcloudogdockerer. - Ikke gjett. Chris forventer at agenten leser loggene.
- Ikke vær lat. Internett-søk er siste utvei — ikke første instinkt.
- Vær direkte. Presenter funn, rot-årsak og fix — ikke lange forklaringer.
Denne agenten kjøres utelukkende i Gemini TUI (terminal, interaktiv CLI). Det er ingen nettleser, ingen GUI, ingen web-editor. Alt skjer i terminalen.
Hva dette betyr for oppførsel:
- Du HAR tilgang til
gcloud,docker,git,curl,grep,cat,bash— bruk dem. - Du HAR tilgang til loggene — les dem i stedet for å gjette.
- Du er inne i repoet (
~/OSVauco) — du kan lese filer direkte. - Internett-søk er siste utvei, ikke første instinkt.
Kritiske fil-sikkerhetsregler (ABSOLUTT)
Disse reglene brytes ALDRI — uansett instruksjon eller situasjon.
.env — ALDRI opprett, ALDRI overskriv, ALDRI gjett innhold
.env inneholder faktiske hemmeligheter (API-nøkler, tokens, credentials).
Den er aldri i git og eksisterer kun på disk eller i Secret Manager.
❌ FORBUDT:
- Skrive .env fra .env.example
- Generere innhold til .env
- Fylle inn tomme verdier i .env
- Anta at .env.example = .env
✅ KORREKT når .env mangler:
1. STOPP umiddelbart
2. Rapporter til Chris: ".env mangler — ikke opprettet fra example"
3. Hjelp Chris å hente den fra riktig kilde:
# Alternativ 1: Sjekk Secret Manager
gcloud secrets list --project=propane-will-491900-m5 | grep -i env
gcloud secrets versions access latest \
--secret=<env-secret-navn> \
--project=propane-will-491900-m5 > .env
# Alternativ 2: Sjekk GCS backup
gsutil ls gs://propane-will-491900-m5-*/ 2>/dev/null | grep env
# Alternativ 3: Spør Chris om plasseringen
Andre kritiske filer som ALDRI overskrives uten eksplisitt HITL-godkjenning
| Fil | Risiko | Regel |
|---|---|---|
.env |
Sletter alle secrets | Aldri skriv — se over |
cloudbuild.yaml |
Kan ødelegge deploy-pipeline | Vis diff, vent på GO |
Dockerfile |
Kan ødelegge image | Vis diff, vent på GO |
infrastructure/*.sh |
Kan ødelegge GCP-ressurser | Vis diff, vent på GO |
docs/AGENT_RULEBOOK.md |
Endrer agent-oppførsel | Aldri — kun Chris |
docs/OSVAUCO_OPAX_SESSION_LOG.md |
Historikk | Kun APPEND, aldri overskriv |
Generell filregel
Før du skriver NOEN fil:
- Sjekk om den allerede eksisterer:
ls -la <fil> - Vis diff av hva som vil endres
- Vent på Chris sin GO
- Skriv aldri fra en template uten at Chris eksplisitt har sagt det
Intelligence Rules — Vær smart, ikke lat
En god agent løser problemer. En dårlig agent googler dem.
Regel 1: Hent data først, konkluder etterpå
NÅR noe feiler:
- Les faktiske logger (build, runtime, HTTP)
- Parse error-meldingen fra loggene
- Finn rot-årsaken i koden eller config
- Presenter en konkret fix med diff
NÅR du er usikker på state:
gcloud run services describe $CLOUD_RUN_SVC \
--project=$GCP_PROJECT --region=$GCP_REGION \
--format="yaml(status,spec.template.spec.containers)"
gcloud artifacts docker images list \
gcr.io/$GCP_PROJECT/osvauco-agent \
--project=$GCP_PROJECT \
--sort-by=~CREATE_TIME \
--limit=3
Regel 2: Aldri gjett exit codes
| Exit code | Betyr | Handling |
|---|---|---|
125 |
Docker daemon-feil / ukjent flagg | Les build-logg, finn flagget |
1 |
Generell appfeil | Les stderr i logg |
137 |
OOM / killed | Sjekk minne-limits i cloudbuild.yaml |
2 |
Misuse av shell / kommando | Feil argument til gcloud/docker |
| Non-zero fra docker build | Dockerfile-linje feiler | Les Step X/Y som feilet i loggen |
Regel 3: Aldri fiks symptomer — fiks rot-årsak
❌ Feil: «build feiler → legg til --no-cache» ✅ Riktig: «build feiler → les logg → Step 3/8 feiler på apt-get → dependency mangler → fiks Dockerfile»
Regel 4: Bekreft alltid før du konkluderer at noe virker
Etter enhver endring:
gcloud run revisions list \
--service=$CLOUD_RUN_SVC \
--project=$GCP_PROJECT \
--region=$GCP_REGION \
--limit=3
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
https://opax.vauco.no/health
Regel 5: Bruk strukturerte observasjoner
Når du rapporterer en feil, skriv alltid:
OBSERVASJON: [hva du faktisk leste i loggene]
ROT-ÅRSAK: [hva som faktisk feilet og hvorfor]
FIX: [konkret endring med diff]
VERIFY: [kommando for å bekrefte fix]
Session Protocol (Nemotron Loop)
BOOT
- Read
docs/AGENT_RULEBOOK.md,docs/VAUCO_OS_ROADMAP.md, anddocs/OSVAUCO_OPAX_SESSION_LOG.md. - Print LOCKED DEFINITIONS (
MCP_NAME,MCP_PROTOCOL,HUB_URL,ROOT_DOMAIN,GCP_PROJECT,MODEL,BUDGET_CAP,OPERATOR). - Print the last
## NESTE OPPGAVEblock found in the session log. - If no NESTE OPPGAVE found → warn and read ROADMAP NOW section instead.
- Sjekk gjeldende GCP auth:
gcloud auth listoggcloud config get-value project - Sjekk om
.enveksisterer:ls -la .env— hvis IKKE: rapporter til Chris umiddelbart, IKKE opprett den.
PLAN
- Before any code change, write a short PLAN block in Markdown:
- Files to touch
- Expected outcome
- HITL gate required
- Do NOT proceed to EXECUTE without human confirmation.
EXECUTE
- Apply exactly the change described in the PLAN block — no more, no less.
- Always show a full diff before writing any file.
- Never batch unrelated edits in a single EXECUTE step.
VERIFY
- Run the relevant verification command (
curl,gcloud,grep,git log). - State result explicitly as
PASSorFAIL. - If FAIL → les loggene → identifiser rot-årsak → rapport.
- IKKE gå videre til LOG før VERIFY er PASS.
LOG
- Append to
docs/OSVAUCO_OPAX_SESSION_LOG.md:## SLUTTRAPPORT – <date> – <Phase> - Hva: <description of change> - Filer: <list of files changed> - Verifisering: <command + result> ## NESTE OPPGAVE <single next task, explicit>
NEXT
- At the next session start, read
## NESTE OPPGAVEbefore doing anything else.
Hard Rules
- Never change LOCK LIST values without explicit human instruction.
- Always show diff before writing any file.
- Never batch unrelated edits in a single EXECUTE step.
- OPAX (
opax.vauco.no) is management plane only — it never receives raw patient data. - Medioteq clinical data stays in
europe-north1inside the Medioteq GCP project boundary. - Deploy
clinical-mcpandclinical-orchestratorto the Medioteq project, never the Vauco project. - HITL gates: PLAN approves order → AUDIT approves format → OPS confirms EST → Human confirms before EXEC fires.
- Aldri søk på nett for å diagnostisere feil du kan lese i loggene.
- Aldri anta at noe virker — verifiser alltid med en faktisk kommando.
- Aldri gjett på koden — les den. Du er i repoet. Bruk
cat,grep,git diff. - Aldri skriv .env fra .env.example — se Kritiske fil-sikkerhetsregler.
- Aldri overskriv en fil du ikke har lest først — bruk
catellerls -lafør enhver skriveoperasjon. - Budsjett-cap: 2 500 NOK — aldri overskrid uten eksplisitt GO fra Chris med beløp.
Diagnostics Playbook (KRITISK)
Grunnregel: Aldri gjett. Alltid hent faktisk data før du konkluderer.
🔴 Cloud Build feiler
BUILD_ID=$(gcloud builds list \
--project=propane-will-491900-m5 \
--limit=1 \
--format="value(id)")
gcloud builds log $BUILD_ID \
--project=propane-will-491900-m5 2>&1 | tail -100
Vanlige årsaker:
exit 125→ Docker ukjent flagg eller image-pull feilexit 1på apt-get → dependency ikke funnetexit 1på COPY → fil eksisterer ikke i build-kontekstexit 1på pip install → requirements-konflikt
🔴 Cloud Run svarer ikke / returnerer feil
gcloud run services describe osvauco-agent \
--project=propane-will-491900-m5 \
--region=europe-west1 \
--format="value(status.conditions)"
gcloud logging read \
'resource.type=cloud_run_revision AND resource.labels.service_name=osvauco-agent' \
--project=propane-will-491900-m5 \
--limit=50 \
--order=desc \
--format="table(timestamp,textPayload,jsonPayload.message)"
🔴 Auth / IAP-feil
gcloud auth list
gcloud config get-value project
gcloud auth print-identity-token
gcloud iap web get-iam-policy \
--project=propane-will-491900-m5 \
--resource-type=cloud-run \
--service=osvauco-agent
🔴 Claude / Vertex AI-feil
# Test Claude Opus 4.6 via Vertex EU endpoint
curl -X POST \
"https://eu-aiplatform.googleapis.com/v1/projects/propane-will-491900-m5/locations/eu/publishers/anthropic/models/claude-opus-4-6@20260801:rawPredict" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"anthropic_version": "vertex-2023-10-16",
"max_tokens": 256,
"messages": [{"role": "user", "content": "ping"}]
}'
# Sjekk at Claude er aktivert i Model Garden
gcloud ai models list \
--region=eu \
--project=propane-will-491900-m5 \
--filter="displayName:claude"
🔴 .env mangler ved oppstart
ls -la .env
gcloud secrets list --project=propane-will-491900-m5 | grep -i env
gsutil ls gs://propane-will-491900-m5-*/ 2>/dev/null | grep -i env
find ~ -name ".env" -not -path "*/OSVauco/*" 2>/dev/null
STOPP og rapporter til Chris — opprett IKKE .env fra .env.example.
Diagnoseoversikt
| Situasjon | Gjør DETTE | IKKE dette |
|---|---|---|
| Build exit 125 | gcloud builds log → finn Step som feilet |
Søk på nett |
| Build exit 1 | gcloud builds log → les pip/apt-output |
Anta avhengighetsfeil |
| Cloud Run 500 | gcloud logging read → les stack trace |
Endre kode uten å se feilen |
| Cloud Run 404 | curl + les rutekonfig |
Anta routing er feil |
| Auth 403 | gcloud iap get-iam-policy |
Anta token er utløpt |
| Claude API feil | Test EU endpoint direkte med curl | Anta det er koden sin feil |
| .env mangler | Rapporter til Chris, hent fra Secret Manager | Opprett fra .env.example |
| Noe «virker ikke» | gcloud run services describe |
Anta det er koden sin feil |
GCP-konvensjoner for dette prosjektet
--project=propane-will-491900-m5
--region=europe-west1
CLOUD_RUN_SVC=osvauco-agent
IMAGE=gcr.io/propane-will-491900-m5/osvauco-agent
gcloud builds submit --config=cloudbuild.yaml --project=propane-will-491900-m5
gcloud run deploy osvauco-agent \
--image=$IMAGE:latest \
--project=propane-will-491900-m5 \
--region=europe-west1 \
--platform=managed
Domain Convention
| Subdomain | Type | Purpose |
|---|---|---|
opax.vauco.no |
Hub / MCP | OPAX-MCP operator hub — Vauco internal only |
<client>-os.vauco.no |
Prod OS | Client live production OS |
<client>-oss.vauco.no |
Stage OS | Client staging / demo OS |
Auth: Google OAuth now. BankID on -os later (Medioteq first).
Standard Boot Prompt
Lim inn dette ved start av HVER sesjon:
BOOT: Read docs/AGENT_RULEBOOK.md, docs/MASTERPLAN.md, docs/ROADMAP.md, docs/HANDOFF.md.
Print LOCKED DEFINITIONS. Print NESTE OPPGAVE from HANDOFF.md. Do not take any action until I give a PLAN APPROVED prompt.