Retningslinjen sier hvordan kode kommer fra en utviklers maskin til produksjon: versjonskontroll, kontroller, avhengigheter, hemmeligheter og personopplysninger. Den beskriver det som gjøres i dag, og det som mangler.
Sist oppdatert: 28.09.2026.
1. Versjonskontroll og utrulling
- All kode ligger i ett git-repo på GitHub.
- Vercel bygger fra git. En push til
maingir en utrulling i produksjon. Andre grener gir en forhåndsvisning (preview). - Endringer skrives som egne commits med en melding som sier hva og hvorfor.
- Arbeid som tar mer enn én commit, gjøres på en egen gren og slås inn med en pull request.
Gjennomgang av kode. Verid er et lite team. Mye går rett til main uten gjennomgang av en annen person: av de 176 siste commitene på main kom 17 via en pull request. Ingen regel i GitHub krever gjennomgang eller grønn CI før innslåing (ingen slik regel finnes i repoet).
2. Automatiske kontroller
CI kjører på hver push til main og på hver pull request (.github/workflows/ci.yml):
`` pnpm install --frozen-lockfile pnpm turbo typecheck test lint build ``
| Kontroll | Verktøy | Hvor |
|---|---|---|
| Typer | TypeScript, tsc --noEmit | Hver pakke (package.json) |
| Tester | Vitest. 67 testfiler per 28.09.2026 | apps/web, packages/* |
| Lint | ESLint | eslint.config.js i hver pakke |
| Bygg | next build | apps/web |
| Låste avhengigheter | --frozen-lockfile mot pnpm-lock.yaml | CI |
CI kjører uten databasenøkkel og uten nøkler til kildene. Ingen test i CI snakker med produksjon. Integrasjonstestene mot levende kilder kjører bare med VITEST_NETT satt, lokalt.
Vercel bygger uavhengig av CI. Et bygg som feiler hos Vercel, rulles ikke ut.
3. Avhengigheter
- Pakkebehandler: pnpm, med låsefil i repoet.
- Nye avhengigheter legges bare til når det er en klar grunn. Eksempel: Maskinporten-signeringen bruker
node:cryptoi stedet for et JWT-bibliotek (packages/sources/src/maskinporten/index.ts). - Avhengigheter oppdateres for hånd.
4. Hemmeligheter
- Ingen hemmeligheter i repoet.
.env*er utelatt i.gitignore, bortsett fra.env.example, som har navnene og ingen verdier. *.pemer utelatt i.gitignore.- I produksjon ligger hemmelighetene som miljøvariabler hos Vercel.
- Hemmeligheter logges aldri. Maskinporten-klienten gjengir bare HTTP-status og feilkode, aldri granten, tokenet eller nøkkelen (
packages/sources/src/maskinporten/index.ts). - Access tokens lagres ikke i revisjonssporet.
Kildereferansebærer bare URL, status og tidspunkt (packages/sources/src/kilde.ts).
5. Personopplysninger i utviklingen
- Fødselsnummer lagres ikke. Ingen kolonne tar imot det (
packages/db/src/skjema.ts). Nummeret valideres og fjernes før et resultat lagres (packages/pipeline/src/personvern.ts). En ny kolonne som kan ta imot fødselsnummer, er ikke tillatt. - Ingen personopplysninger i loggen. Feil logges med
loggbar()somnavn: melding, aldri som hele feilobjektet (apps/web/lib/logg.ts). Grunnen: feil fra AI SDK bærer hele ledeteksten, og feil fra Drizzle bærer parameterne. Slettejobben logger saks-id-er, ikke innhold. - Ekte saker i repoet er forbudt.
.gitignoreutelater/saker/,*.sak.json,sak-*.json,kjoring-*.jsonogproto/. - Kildefiler med personopplysninger (aksjonærregisteret) slettes fra maskinen når importen er verifisert, og skal aldri inn i repoet (
docs/personvern/behandlingsprotokoll.md, punkt 3). - En ny behandling av personopplysninger krever at behandlingsprotokollen oppdateres først.
6. Forhåndsvisninger
- Hver gren får en forhåndsvisning hos Vercel.
- Forhåndsvisninger er stengt for søkemotorer (
VERCEL_ENV === "preview", testet iapps/web/lib/metadata.test.ts). - Hvilken database forhåndsvisningene bruker, og om de er beskyttet med innlogging hos Vercel, er ikke dokumentert i repoet.
7. Sikkerhet i koden
Regler som gjelder hver endring:
- Tilgang sjekkes på serveren, i hver handling.
proxy.tssjekker bare om en informasjonskapsel finnes, og beskytter ingenting alene (apps/web/lib/sesjon.ts). - Foretaket hentes fra sesjonen, aldri fra forespørselen.
- Saksdata leses alltid via saken, med foretaket i filteret (
apps/web/lib/sak/les.ts). - Svar fra kilder valideres mot et Zod-skjema før de brukes (
packages/sources/src/kilde.ts). - Svar fra språkmodellen må passe i et fast skjema (
generateObjectiapps/web/lib/kjoring/modell.ts).
Gjenstår
| Mangel | Risiko | Plan |
|---|---|---|
Ingen regel på main som krever grønn CI eller gjennomgang | En feil kan rulles ut før CI er ferdig | Branch protection på main: krev grønn CI. Krev gjennomgang når teamet er to |
| Ingen automatisk oppdatering eller varsling om sårbare avhengigheter (ingen Dependabot eller Renovate) | En kjent sårbarhet kan bli liggende | Slå på Dependabot-varsler og sikkerhetsoppdateringer i GitHub |
Ingen pnpm audit eller annen sårbarhetsskanning i CI | Som over | Legg til i ci.yml |
| Ingen hemmelighetsskanning i CI | En hemmelighet kan bli committet ved en feil | Slå på GitHub secret scanning og push protection |
| Det er ikke dokumentert hvilken database forhåndsvisningene bruker, eller om de er beskyttet | En forhåndsvisning kan vise produksjonsdata til den som har lenken | Egen Neon-gren for preview, og Vercel-innlogging på forhåndsvisninger |
Ingen CSP med script-src (apps/web/next.config.ts) | Svakere vern mot innsprøytet skript | Egen endring med nonce |