بنقرة واحدة
nav-plan
Arkitekturplanlegging med beslutningstrær for auth, kommunikasjon, database og Nais-konfigurasjon
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Arkitekturplanlegging med beslutningstrær for auth, kommunikasjon, database og Nais-konfigurasjon
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Lag responsive layouts med Aksel Design System (v8+) - spacing tokens, layout primitives (Box, HStack, VStack, HGrid, Page, Bleed) og ResponsiveProp
Generer conventional commit-meldinger med Nav-relevante scopes og breaking change-format
Generer og kjør Playwright E2E-tester for webapplikasjoner med page objects, auth fixtures og tilgjengelighetstester
Strukturell gjennomgang og generering av README-er tilpasset prosjekttype — tjeneste, bibliotek, monorepo eller naisjob
OWASP Top 10:2025 kodenivå-mønstre for Kotlin, Go, Java og Node.js — tilgangskontroll, forsyningskjede, injeksjon og feilhåndtering
Kompakt output-stil som kutter fyllord og beholder teknisk substans — spar output-tokens uten å miste nøyaktighet.
| name | nav-plan |
| description | Arkitekturplanlegging med beslutningstrær for auth, kommunikasjon, database og Nais-konfigurasjon |
| license | MIT |
| metadata | {"domain":"general","tags":"planning architecture scaffold nais modernization migration"} |
Gå fra en vag idé til en konkret, Nav-kompatibel arkitekturplan. Bruker beslutningstrær for å velge riktig auth, kommunikasjon, database og Nais-oppsett.
| Arketype | Stack | Nais-type |
|---|---|---|
| Backend API | Kotlin/Ktor eller Spring Boot | Application |
| Hendelsekonsument | Kotlin + Kafka + Rapids & Rivers | Application |
| Frontend (innbygger) | Next.js + ID-porten + Wonderwall | Application |
| Frontend (saksbehandler) | Next.js + Azure AD + Wonderwall | Application |
| Batchjobb | Kotlin + scheduled | Naisjob |
| BFF (Backend-for-Frontend) | Next.js API routes | Application |
I tillegg til arketype, avklar om dette er nytt eller en endring:
| Endringstype | Ekstra beslutninger |
|---|---|
| Nybygg | Standard beslutningstrær (auth, data, kommunikasjon) |
| Modernisering | Migreringsstrategi, bakoverkompatibilitet, utrulling, dekommisjonering |
| Refaktorering | Karakteriseringstester, rollback-plan, parallellkjøring |
For modernisering og refaktorering — se modernization-patterns.md for konkrete mønstre og decision-trees.md for migreringsbeslutningstrær.
Se decision-trees.md for alle beslutningstrær.
Hvem kaller tjenesten?
├── Innbygger via nettleser
│ └── ID-porten + Wonderwall
│ idporten.enabled: true
│ Nais-sidecar: Wonderwall
│ Node.js: @navikt/oasis
│ JVM: token-support
│
├── Saksbehandler via nettleser
│ └── Azure AD + Wonderwall
│ azure.application.enabled: true
│ Nais-sidecar: Wonderwall
│ Node.js: @navikt/oasis
│ JVM: token-support
│
├── Annen Nav-tjeneste (med brukerkontext)
│ └── TokenX (token exchange)
│ tokenx.enabled: true
│ Kaller: exchangeToken(subjectToken, targetAudience)
│ Mottaker: valider TokenX-token
│
├── Annen Nav-tjeneste (uten brukerkontext / batch)
│ └── Azure AD client_credentials
│ azure.application.enabled: true
│ Kaller: getClientCredentialsToken(scope)
│ ⚠️ Kun når brukerkontext ikke er tilgjengelig!
│
└── Ekstern partner
└── Maskinporten
maskinporten.enabled: true
Definerer scopes for ekstern tilgang
Hva slags kommunikasjon?
├── Synkron (kaller og venter på svar)
│ ├── REST API (standard)
│ │ Kotlin: Ktor routing eller Spring @RestController
│ │ OpenAPI: Swagger/SpringDoc
│ │
│ └── GraphQL (komplekse, fleksible queries)
│ Sjelden brukt i Nav, foretrekk REST
│
├── Asynkron (fire-and-forget, hendelsedrevet)
│ ├── Kafka (standard for Nav)
│ │ Topic: {team}.{domene}.v1
│ │ Dev: 1 partisjon, Prod: 6+
│ │ Rapids & Rivers for hendelseskoreografi
│ │
│ └── Pub/Sub (GCP-native, sjelden)
│ Bare hvis Kafka ikke passer
│
└── Sanntid (push til klient)
└── Server-Sent Events
Ktor: respondSse {}
Next.js: ReadableStream
Trenger du persistent lagring?
├── Ja, relasjonell data
│ └── PostgreSQL via Nais (Cloud SQL)
│ gcp.sqlInstances[].type: POSTGRES_15
│ Flyway for migrasjoner
│ HikariCP pool: 3-5 (containere!)
│
│ Primærnøkkel?
│ ├── Domene-ID (fnr, saksnummer) → VARCHAR
│ └── Systemgenerert → BIGSERIAL eller UUID
│
├── Ja, analytisk / read-heavy
│ └── BigQuery
│ Separat Nais-konfigurasjon
│ Bruk @google-cloud/bigquery
│
├── Ja, cache / sesjon
│ └── Redis via Nais
│ gcp.redis[].tier: BASIC
│
└── Nei
└── Stateless tjeneste (bra! enklere drift)
Basert på beslutningene, generer disse artefaktene:
Se nais-templates.md for komplette maler per arketype.
# Generert manifest basert på beslutningstrær
apiVersion: nais.io/v1alpha1
kind: Application
metadata:
name: { app-name }
namespace: { team }
labels:
team: { team }
spec:
image: "{{ image }}"
port: 8080
# Auth — fra beslutningstre
# [genereres basert på valgt mekanisme]
# Database — fra beslutningstre
# [genereres hvis PostgreSQL valgt]
# Kafka — fra beslutningstre
# [genereres hvis Kafka valgt]
# Alltid inkluder:
liveness:
path: /isalive
readiness:
path: /isready
prometheus:
enabled: true
path: /metrics
resources:
requests:
cpu: 15m
memory: 256Mi
limits:
memory: 512Mi
replicas:
min: 2
max: 4
# accessPolicy — ALLTID eksplisitt
accessPolicy:
inbound:
rules: [] # Fyll inn basert på hvem som kaller
outbound:
rules: [] # Fyll inn basert på avhengigheter
Kotlin/Ktor:
{app-name}/
├── .nais/
│ ├── nais.yaml
│ └── nais-dev.yaml
├── .github/workflows/
│ └── build-deploy.yml
├── src/main/kotlin/no/nav/{team}/{app}/
│ ├── Application.kt
│ ├── Config.kt # Sealed class config
│ ├── api/
│ │ └── Routes.kt
│ ├── db/
│ │ └── Repository.kt # Kotliquery
│ └── kafka/
│ └── Consumer.kt # Rapids & Rivers
├── src/main/resources/
│ └── db/migration/
│ └── V1__initial_schema.sql
├── src/test/kotlin/
├── build.gradle.kts
└── Dockerfile
Next.js:
{app-name}/
├── .nais/
│ ├── nais.yaml
│ └── nais-dev.yaml
├── .github/workflows/
│ └── build-deploy.yml
├── src/
│ ├── app/
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── api/ # BFF proxy routes
│ ├── components/
│ └── lib/
│ ├── auth.ts # @navikt/oasis
│ └── api-client.ts
├── next.config.ts
├── package.json
└── Dockerfile
name: Build and deploy
on:
push:
branches: [main]
permissions:
contents: read
id-token: write
jobs:
build:
runs-on: ubuntu-latest
outputs:
image: ${{ steps.docker-build-push.outputs.image }}
steps:
- uses: actions/checkout@v4
- uses: nais/docker-build-push@v0
id: docker-build-push
with:
team: { team }
identity_provider: ${{ secrets.NAIS_WORKLOAD_IDENTITY_PROVIDER }}
project_id: ${{ vars.NAIS_MANAGEMENT_PROJECT_ID }}
deploy-dev:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: nais/deploy/actions/deploy@v2
env:
CLUSTER: dev-gcp
RESOURCE: .nais/nais-dev.yaml
VAR: image=${{ needs.build.outputs.image }}
deploy-prod:
needs: [build, deploy-dev]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: nais/deploy/actions/deploy@v2
env:
CLUSTER: prod-gcp
RESOURCE: .nais/nais.yaml
VAR: image=${{ needs.build.outputs.image }}
Velg riktig testnivå basert på arketype og endringstype. Se Teststrategi-beslutningstre for detaljerte trær.
Minimum for alle arketyper:
| Arketype | Unit | Integrasjon | E2E |
|---|---|---|---|
| Backend API | Forretningslogikk | DB + auth | — |
| Hendelsekonsument | Meldingsbehandling | TestRapid | — |
| Frontend | Komponenter | — | Kritiske reiser |
| BFF | Transformasjoner | Auth-proxy | — |
| Batchjobb | Beregninger | DB | — |
Tillegg for modernisering:
Se Endringskonsekvensanalyse-tre for kartlegging av påvirkning.
Generer relevante dokumenter basert på endringstype og risiko. Se dokumentasjon og leveransemaler for fullstendige maler.
| Dokument | Når | Formål |
|---|---|---|
| Endringsdokument | Alltid for ikke-trivielle endringer | Beslutning, påvirkning, utrulling, rollback |
| Runbook-oppdatering | Ny tjeneste eller endret driftsadferd | Feilsøking, eskalering, helsesjekk |
| API-endringsdokument | Breaking changes eller nye API-er | Migrasjonsveiledning for konsumenter |
| Observerbarhet | Alle endringer i produksjonsadferd | Suksesskriterier, dashboards, alarmer |
Minimum output for enhver plan:
Verifiser at valgene henger sammen:
accessPolicy.inbound lister alle kallereaccessPolicy.outbound lister alle avhengigheter