Guide til datakontrakter

| 22 min lesetidSist oppdatert
Kategori: Data Governance | Emneknagger: #podcast, #datakontrakter, #dataprodukter, #dbt

En datakontrakt er en avtale mellom de som lager data og de som bruker dem, skrevet slik at en maskin kan teste den. Guiden viser hva kontrakten inneholder, hvordan den håndheves med ODCS og dbt, og hvordan dere kommer i gang med ett team og ett dataprodukt.

Kort fortalt: En datakontrakt er en avtale mellom de som lager data og de som bruker dem, skrevet som kode slik at en maskin kan teste den hver gang dataene endres. Kontrakten gir produsenten en liten og kjent kostnad, og sparer konsumentene for feilene som kommer når dataene endres uten at noen sier fra. Verktøyene for å teste kontrakten finnes, og i prosjektene våre er det eierskapet og oppfølgingen som avgjør om den virker.

Når en utvikler endrer en kolonne i en database, kan det føre til at en rapport feiler, en maskinlæringsmodell gir feil, eller et dashboard slutter å virke. Data flyter mellom systemer og mennesker, og ofte skjer det uten tydelige avtaler.

Slike feil oppstår ikke fordi folk gjør feil med vilje, men fordi avhengighetene er skjulte. Ingen har sagt ifra hva som er lov og ikke. Og ingen fanger opp at noe har gått galt, før det går galt.

Kostnaden er vanskelig å se, fordi den havner et annet sted enn der endringen ble gjort. Andrew Jones, som skrev en av de første bøkene om datakontrakter, peker på at det nesten ikke koster produsenten noe å la være å love noe om dataene. Konsumentene må gjette strukturen, rykke ut når noe endres og fylle pipelinene sine med IFNULL og COALESCE for hver variant dataene har hatt. Den kostnaden ganges med antall konsumenter.

En datakontrakt fungerer som et API for data, en spesifikasjon av struktur, kvalitet og forventninger som både produsenter og konsumenter forholder seg til. Den flytter en liten del av kostnaden over til produsenten, som må beskrive dataene og holde beskrivelsen ved like. Til gjengjeld er kostnaden kjent, den samme som for å vedlikeholde et API, og konsumentene slipper nesten alle feilene som kommer av endringer de ikke visste om.

I takt med at plattformer blir mer desentraliserte, og flere team produserer egne dataprodukter, vokser behovet for tydelige og teknisk validerbare avtaler mellom de som eier data og de som bruker dem. I kapittelet om grensesnitt og datakontrakter i guiden om dataprodukter skriver vi om når en kontrakt lønner seg, og når det holder med mindre.

Hvilke problemer løser datakontrakter?

Datakontrakter løser tre problemer. De gjør avhengighetene mellom team synlige, slik at en endring som ødelegger for andre, stoppes før den når produksjon. De gir et felles grunnlag når data deles på tvers av virksomheter og sektorer. Og de gjør det mulig å bygge større økosystemer der flere aktører bruker de samme definisjonene.

Færre feil i dataflyten

Når avhengighetene er synlige og kan testes, kan teamene bygge løsninger som både er selvbetjente og pålitelige.

To rader. Uten datakontrakt kopieres rådata fra kildesystemet til transformasjonen, som tolker dem på egen hånd, og videre til BI, maskinlæring og produktfunksjoner. En kolonne endres i kilden, logikken dupliseres, og feilen merkes hos konsumentene. Med datakontrakt går dataene fra kildesystemet gjennom kontrakten, et grensesnitt teamet lover å holde, før transformasjonen og konsumentene. Endringen testes mot kontrakten før den publiseres.
Uten kontrakt kopieres rådata rett fra kildesystemet, og en endring der merkes først hos konsumentene. Med kontrakt testes endringen mot det teamet har lovet, før den når dem. Tegnet etter to figurer i foredraget Data Contracts: The API for data av Andrew Jones, apidays Paris, desember 2023.

Monzo, den britiske digitalbanken, har publisert tall fra arbeidet med slike avtaler. Over 100 team bidrar til et datavarehus med mer enn 12 000 dbt-modeller, og banken innførte det den kaller grensesnitt: en dbt-modell som et team har erklært som en kontrakt andre team kan bygge på. Da rundt 30 prosent av migreringen var gjort, meldte Monzo om rundt 40 prosent lavere kostnader og rundt 25 prosent raskere levering av data i noen av domenene. Gevinsten kommer av hele ombyggingen, med faste modellag og automatiske standarder i CI i tillegg til grensesnittene, og banken skriver selv at det er tidlig. Grensesnittene har også en pris. Teamet som eier et grensesnitt, må dokumentere det, teste det og holde det stabilt, og det er den kjente kostnaden produsenten tar for at de andre teamene skal slippe.

Bedre støtte til datadeling

Offentlige og sektorovergripende krav stiller også høyere forventninger til strukturert datadeling:

  • Dataforvaltningsloven fra juni 2026 følger opp NOU 2024: 14 Med lov skal data deles. Loven gjennomfører åpne data-direktivet og dataforvaltningsforordningen (Data Governance Act) i norsk rett. Den gir rett til å kreve at data gjøres tilgjengelig for viderebruk, og stiller krav til hvordan metadata publiseres. Kongen bestemmer når loven trer i kraft.
  • PSD2 krever at banker gir tredjeparter sikker tilgang til kontodata, i praksis via API-er, og det har åpnet nye markeder og gjort delingen tryggere.

Datakontrakter er et praktisk svar på slike krav, og kan sees på som en teknisk implementasjon av prinsippene bak reguleringen.

Økt verdi i større økosystemer

Datakontrakter må være forståelige og implementerbare. Her er det mye å lære av andre standardiseringsforsøk, som har bevist sin verdi over tid:

  • HL7 (helse): svært detaljert, men for komplisert i praksis
  • EHF (handel og økonomi): enkel nok til å fungere, bredt tatt i bruk

Dette er eksempler der datakontrakter gir verdi på tvers av et helt økosystem. Men vi ønsker oss en implementering av datakontrakter som ligner mer på EHF enn HL7, der minimumskravene på sikt blir standardisert for et bruksområde, en type data eller en bransje.

Hvordan henger datakontrakter sammen med distribuerte datateam og dataprodukter?

Når ansvaret for data er fordelt på flere team, eier hvert team sine egne dataprodukter, og andre team bygger videre på dem. Datakontrakten gjør dataproduktet til noe andre kan stole på. Den sier hva som leveres, med hvilken kvalitet og hvor ofte, og den testes hver gang produktet endres. Data mesh er den mest kjente modellen for å organisere data slik, og prinsippene har vi beskrevet i guiden til data mesh.

Data som et produkt

I en distribuert organisering, som i data mesh, fordeler man ansvaret for data på domene- eller produktteam. Disse teamene utvikler egne dataprodukter, ofte i form av tabeller, API-er eller datasett, som andre skal kunne bruke. Dataprodukter må derfor ha tydelige egenskaper: standardiserte, delbare, eid av et team, og forvaltet i hele sitt livsløp. Og husk: ikke alle data kvalifiserer som dataprodukter.

Team A, B og C eier hver sine dataprodukter, og flere team bygger på et sett med felles data. Hver pil mellom teamene og til de felles dataene går gjennom en merkelapp med teksten datakontrakt.
Når ansvaret for data er fordelt på flere team, blir hver avhengighet mellom dem en kontrakt. Tegnet etter nyhetsbrevet til Andrew Jones, Implementing domain ownership with data contracts, 16. mai 2025.

Dataprodukter trenger spesifikasjoner av egenskaper som kvalitet, garanti og service, på samme måte som fysiske produkter:

Når du kjøper en elsparkesykkel, forventer du spesifikasjoner på rekkevidde, garanti og hastighet. Uten disse ville produktet vært vanskelig å selge og umulig å stole på. Det samme gjelder dataprodukter. Uten tydelige spesifikasjoner mister datakonsumentene raskt tilliten, og verdien avtar.

Kontrakten gjør produkttanken til praksis

Datakontrakten blir bindeleddet som gjør «data as a product» til praksis. Den spesifiserer nøyaktig hva som leveres, kvalitet og frekvens (SLA), og brukes aktivt i CI/CD-pipelinen og kommunikasjonen mellom team. Kontrakten gjør at produsentteamet kan spesifisere hva de lover å levere, og konsumentteamene kan stole på at det de bygger videre på, ikke plutselig endrer seg.

Dataleverandørens dataprodukt har en utgang som oppfyller datakontrakten. Datakonsumentens produkt, et dataprodukt, et dashboard eller en maskinlæringsmodell, henter dataene via utgangen og sjekker at garantiene i kontrakten holder.
Dataproduktet har en utgang som oppfyller kontrakten, og konsumentens produkt sjekker at garantiene holder. Tegnet etter figuren på datacontract.com, hentet 13. juli 2025.

Hvordan ser en datakontrakt ut i praksis?

En datakontrakt sier hvem som leverer hvilke data til hvem, hvor ofte, med hvilke felter og kvalitetskrav, og hva som skjer når kravene brytes. De tre eksemplene under er tenkte, fra bank, energi og industri, og alle tre beskriver oppdatering, felter, kvalitetskrav, varsling og hva dataene betyr.

Eksempel 1: Kundedata i bank- og finanssektoren

Et team i en bank leverer kundedata som dataprodukt til risikostyringsavdelingen. Datakontrakten spesifiserer:

  • Oppdatering: hver time, fra kl. 08 til 18.
  • Felter: kunde_id, kredittrisiko, lånebeløp, status.
  • Kvalitetskrav: ingen duplikater, maks 0,5 % nullverdier.
  • Varsling: automatiske varsler ved brudd, integrert med bankens risikostyringssystemer.
  • Semantisk definisjon: kredittrisiko beregnes basert på kundens kredittscore, betalingshistorikk og eksterne data.

Risikoteamet kan dermed stole på dataene, og avdekke og håndtere risikosituasjoner raskere.

Eksempel 2: Strømforbruk og nettbalansering i energibransjen

En energileverandør leverer strømforbruksdata fra smarte målere som dataprodukt til nettoperatøren for balansering av strømnettet. Kontrakten spesifiserer:

  • Oppdatering: hvert 5. minutt.
  • Felter: måler_id, strømforbruk_kWh, tidspunkt, kunde_type.
  • Valideringsregler: kun positive verdier, og måler_id må finnes i masterdata.
  • Semantikk: strømforbruk_kWh gjelder faktisk forbruk, ikke estimater.
  • Prissetting: internfakturering basert på datavolum og oppdateringsfrekvens.
  • Varsling: automatisk melding til driftskontrollsystemer dersom verdier uteblir eller er utenfor forventede intervaller.

Dermed kan nettoperatøren balansere strømnettet presist og pålitelig i sanntid, og kostnadene deles åpent.

Eksempel 3: Vedlikehold av maskiner i industriproduksjon

Et produksjonsteam leverer sensordata for tilstandsbasert vedlikehold av maskiner til et vedlikeholdsteam. Kontrakten spesifiserer:

  • Oppdatering: hvert 15. minutt.
  • Felter: maskin_id, temperatur, vibrasjon, driftstid.
  • Datakvalitet: maks 1 % unormale verdier, 100 % dekning av kritiske maskiner.
  • Varsling: automatisk varsling direkte inn i vedlikeholdssystemer dersom kritiske verdier overstiger terskler.
  • Semantisk definisjon: vibrasjon og temperatur brukes til å forutsi maskinslitasje basert på definerte grenseverdier.

Vedlikeholdsteamet kan dermed planlegge vedlikehold før feil oppstår, redusere driftsstans og bruke ressursene bedre.

Hva inneholder en datakontrakt?

En god datakontrakt beskriver tre ting: skjemaet, forretningsreglene og tjenestenivået. I tillegg trenger den en unik ID og en versjon, navnet på datasettet den gjelder, dokumentasjon og en eier. Når grunnmuren står, kan den utvides med personvern, regler for etterlevelse, kobling til begreper og kvalitetsmål.

En datakontrakt i fire lag. Grunnmuren er ID og versjon, navn på datasettet, dokumentasjon og eier. De tre sentrale komponentene er skjema, forretningslogikk og tjenestenivå. Utvidelsene er personvern og PII, etterlevelse, begreper og taksonomier, DCAT-AP-NO og kvalitetsmål etter DQV-AP-NO. Nederst står konteksten til AI-agenter, som er ny i ODCS 3.2.0.

Datakontrakter er en praktisk anvendelse av prinsippet «governance as code». De fungerer som kontraktsfestede grensesnitt for data, og gjør det mulig å spesifisere og validere forventninger til data, helst så tidlig som mulig i utviklingsløpet. I beste fall inngår kontrakten som en integrasjonstest i CI/CD-pipelinen, slik at feil oppdages før kode og data flyttes til produksjon.

Tre sentrale komponenter

En god kontrakt beskriver alltid:

  1. Skjema: struktur, kolonner, datatyper og formater.
  2. Forretningslogikk: forventede verdier, toleranse for nullverdier, intervaller og domener.
  3. SLA-er: hvor ofte dataene oppdateres, for eksempel SLA1 for kritiske data hvert 5. minutt og SLA2 for mindre kritiske data daglig.

Kontrakten bør alltid valideres programmatisk i en CI/CD-pipeline. Hvor den håndheves avhenger av organisasjonens arkitektur og teknologistack, men som et minimum bør den overvåkes, og det bør finnes en prosess for hva som skjer når kontrakten brytes.

Kontrakten som metadataobjekt

I tillegg bør kontrakten ha tydelig:

  • ID og versjonskontroll: en unik identifikator for gjenfinning og referanse i pipeline og dokumentasjon, og grunnlaget for å håndtere endringer.
  • Ressursnavn og navnerom: hvilket datasett eller hvilken dataressurs kontrakten gjelder for. Bør være 1:1 (for eksempel vehicle_status i domenet transport).
  • Dokumentasjon: hva betyr dataene, og hvordan brukes de? Dokumentasjon bør være påkrevd.
  • Eier: produsenten har eieransvaret, og kontrakten utvikles sammen med de viktigste konsumentene.

Når grunnmuren er på plass, kan dere utvide med:

  • PII-klassifisering og personvernkrav
  • regler for etterlevelse (compliance)
  • kobling til taksonomier og ontologier
  • beskrivelse etter DCAT-AP-NO, den norske standarden for å beskrive datasett i datakataloger
  • kvalitetsmål, for eksempel etter DQV-AP-NO, som bruker dimensjoner som fullstendighet, nøyaktighet, konsistens og aktualitet

Hvor gode dataene må være, avgjøres av hva de skal brukes til. Det skriver vi mer om i Datakvalitet: hvor gode må dataene være, og hvem bestemmer det?

En datakontrakt er ikke bare en spesifikasjon. Den er et testgrunnlag, et styringsverktøy og et viktig bindeledd mellom mennesker og systemer i moderne dataorganisering. Man kan se kontrakten som en forsterket variant av et skjema, men med semantikk, validering, kontekst for bruk og styring bygget inn.

Mer om semantikk og taksonomi

Datakontrakter beskriver ofte én entitet, for eksempel «kunde». Men for at dette skal gi mening, bør det kobles til en semantisk struktur, en taksonomi eller en begrepsmodell. I ODCS kan kontrakten, tabellene og feltene peke til en definisjon utenfor kontrakten, for eksempel i en forretningsordliste eller en datakatalog.

Ved å koble kontrakter til begreper og taksonomier får teamene gjenbruk og forståelse på tvers. «Kunde» kan da være en type «personlig aktør», og kontrakten kan arve regler eller definisjoner derfra.

Hvilke standarder og verktøy finnes?

Den åpne standarden for datakontrakter er Open Data Contract Standard (ODCS), der kontrakten skrives i YAML. Data Contract CLI tester kontrakten mot dataene, og dbt kan håndheve skjemaet hver gang en modell bygges. For hendelser og API-er brukes formater som Avro, JSON Schema og Protobuf. Kontrakten bør leve som kode, sammen med koden som lager dataene.

Open Data Contract Standard

ODCS forvaltes av Bitol, et prosjekt i Linux Foundation AI & Data som i juli 2026 nådde stiftelsens høyeste modenhetsnivå (graduated), og er åpen kildekode under Apache 2.0. Da versjon 3.1.0 kom i desember 2025, faset forvalterne av Data Contract Specification ut sitt eldre format til fordel for ODCS. Versjon 3.2.0 kom i september 2026.

Slik kan bankeksemplet over se ut i ODCS, forkortet:

apiVersion: v3.2.0
kind: DataContract
id: kundedata-risiko
name: kundedata_risiko
version: 1.0.0
status: active
domain: kunde
team:
  name: kundedata
servers:
  - server: produksjon
    type: snowflake
    account: banken-prod
    database: KUNDEDATA
    schema: RISIKO
schema:
  - name: kunde_risiko
    physicalType: table
    properties:
      - name: kunde_id
        logicalType: string
        required: true
        unique: true
      - name: kredittrisiko
        logicalType: number
        description: Beregnes fra kredittscore, betalingshistorikk og eksterne data
        quality:
          - metric: nullValues
            mustBeLessOrEqualTo: 0.5
            unit: percent
slaProperties:
  - property: frequency
    value: 1
    unit: h

Data Contract CLI

Data Contract CLI er et kommandolinjeverktøy med åpen kildekode, bygd på ODCS. Det sjekker at kontrakten er gyldig, kobler seg til datakilden som står under servers i kontrakten, og kjører skjema- og kvalitetstestene mot dataene, blant annet i Snowflake, Databricks, BigQuery, Kafka og Postgres. Versjon 1.0 kom i juni 2026. Kjører dere verktøyet i CI/CD-pipelinen, blir kontrakten en test og ikke bare dokumentasjon:

datacontract test kundedata-risiko.odcs.yaml

dbt-kontrakter

dbt kan håndheve skjemaet når en modell bygges. Med contract: enforced: true må hver kolonne ha navn og datatype, og bygget stopper hvis spørringen gir andre kolonner eller typer enn kontrakten sier. Testene for innholdet ligger ved siden av, under data_tests. Skrivemåten med arguments krever dbt 1.10.5 eller nyere, og i eldre versjoner står values rett under testen:

models:
  - name: transaksjon
    config:
      contract:
        enforced: true
    columns:
      - name: transaksjon_id
        data_type: string
        constraints:
          - type: not_null
        data_tests:
          - unique
      - name: status
        data_type: string
        data_tests:
          - accepted_values:
              arguments:
                values: ["NY", "FERDIG", "ANNULLERT"]

En dbt-kontrakt dekker strukturen. Den sier ingenting om hvor ofte dataene skal oppdateres, hvilke kvalitetskrav som gjelder over tid, eller hvem som eier dem. Den er derfor en del av datakontrakten, ikke hele.

Datakontrakten har fire deler: skjema, kvalitetskrav, oppdatering og eier og oppfølging. dbt-kontrakten med contract: enforced dekker skjemaet, og dbt data_tests dekker kvalitetskravene ved siden av kontrakten. Oppdatering og eier og oppfølging står i datakontrakten, ikke i dbt-kontrakten.
En dbt-kontrakt håndhever skjemaet, og testene for innholdet ligger ved siden av. Oppdatering, eierskap og oppfølging står i datakontrakten.

Testverktøy og formater

  • Great Expectations (GX Core) brukes til deklarative datatester. Kildekoden ligger nå i Fivetrans GitHub-organisasjon, og prosjektet er fortsatt åpen kildekode under Apache 2.0.
  • Soda Core brukes til datasjekker, men har lisensen Elastic License 2.0 og er dermed ikke åpen kildekode i vanlig forstand.
  • Avro, JSON Schema og Protobuf brukes for kontrakter i API-er og meldingssystemer.

Hvordan ser arbeidsflyten for en datakontrakt ut?

Arbeidsflyten starter hos konsumenten som trenger noe, går via produsenten som bekrefter at det lar seg gjøre, og ender med en kontrakt i kode. Etter det sjekkes hver endring automatisk mot kontrakten. Bryter endringen kontrakten, varsles eieren, og endringen følger en fast feilprotokoll.

Som illustrert i figuren kan arbeidsflyten for datakontrakter bestå av følgende steg:

  1. Datakonsumenten identifiserer et behov eller en begrensning i dataene.
  2. Datakonsumenten ber om en datakontrakt for en gitt dataressurs.
  3. Dataprodusenten bekrefter at datakontrakten er gjennomførbar.
  4. Datakontrakten bekreftes og formaliseres i kode.
  5. Dataprodusenten oppretter en pull request for å endre dataressursen.
  6. Endringen sjekkes automatisk for å se om den bryter med eksisterende datakontrakter.
  7. Endringen medfører brudd eller ikke brudd: a. Dersom datakontrakten brytes, varsles eieren av dataressursen, og endringen håndteres etter en feilprotokoll. b. Dersom endringen ikke bryter kontrakten, oppdateres dataressursen for videre prosessering.
Flytdiagram i sju steg. Konsumenten finner et behov og ber om en kontrakt, produsenten bekrefter at den holder, og kontrakten formaliseres i kode. Et endringsforslag fra produsenten går gjennom en sjekk i CI/CD mot kontrakten. Består den, oppdateres dataressursen og går videre til konsumenten. Feiler den, varsles eierne, og feilprotokollen skiller hardt brudd, der endringen stoppes, fra mykt brudd, der den går videre med varsel.
Arbeidsflyten for en datakontrakt, med stegene nummerert som i lista over. Tegnet etter en tidlig utgave av Data Contracts av Chad Sanderson og Mark Freeman (O’Reilly), lest 12. juli 2025. Boka kom ut i november 2025, med B. E. Schmidt som tredje forfatter.

Hva er de vanligste fallgruvene?

Den vanligste fallgruven er en kontrakt som bare er dokumentasjon. Den testes ikke, endres uten versjonering og har ingen tydelig eier, så den slutter å stemme med dataene uten at noen merker det. Da er kostnaden tilbake hos konsumentene. En god kontrakt er maskinlesbar, testbar, versjonert og eid av produsentteamet.

En annen fallgruve er å legge kontrakten der problemene blir synlige, mellom datavarehuset og rapportene. Der må den jage etter data som alt har endret seg. Mark Freeman II, en av forfatterne bak boka Data Contracts, forteller om et prosjekt med selvbetjent analyse som han måtte stanse etter seks måneder, fordi analysedatabasen lå en dag bak produksjonen av data i kildesystemet, og dermed ikke fulgte endringene. Kontrakten bør stå så nær kilden som mulig, i koden som endrer databasen. Data fra leverandører og andre utenfor virksomheten kan dere ikke stoppe ved kilden, og der bør et brudd settes i karantene før dataene går videre.

Typiske fallgruver:

  • Kontrakten er bare dokumentasjon, og den testes ikke
  • Endringer skjer uten versjonering, og det konsumentene har bygd, brekker
  • Ingen tydelig eier
  • Ingen følger opp når kontrakten brytes, så varslene blir liggende
  • Kontrakten står der feilene blir synlige, langt fra der de oppstår
  • dbt-kontrakten blir tatt for hele datakontrakten, selv om den bare sjekker kolonner og typer

En god kontrakt:

  • er maskinlesbar
  • er testbar
  • er versjonert
  • har forankret eierskap i produsentteamet
  • er forankret hos de viktigste konsumentene
  • har en klar prosess for endringshåndtering

Eier produsenten eller konsumenten kontrakten?

Formelt eies kontrakten av produsenten. Det er teamet som forvalter dataproduktet, som publiserer grensesnittet. Men god praksis tilsier at kontrakten utarbeides i samarbeid med konsumentene, gjerne i felles møter eller pull requests. Kontrakten skal være presis og stabil, og endringer må skje gjennom versjonering, slik at gamle konsumenter fortsatt fungerer.

Eierskapet følger kostnaden. Bare den som kan endre dataene, kan love noe om dem, og derfor må produsenten skrive og vedlikeholde kontrakten. Konsumentene slipper til gjengjeld å gjette strukturen og rykke ut hver gang den endres. I artikkelen om dataeierskap skriver vi om hvem som bør eie selve dataene, og hva det koster når ingen gjør det.

En datakontrakt mellom dataprodusentene og datakonsumentene. Fra produsentene kommer ansvar for datakvalitet, endringshåndtering, grensesnitt og forventninger (SLO). Fra konsumentene kommer insentiver: krav, verdien dataene gir, samarbeid og avkastning.
Datakontrakten samler ansvaret produsentene tar og insentivene konsumentene gir. Tegnet etter nyhetsbrevet til Andrew Jones, Defining data products with data contracts, 23. mai 2025.

Hva vi i Glitni ser

Vi i Glitni bruker datakontrakter i prosjektene våre, og det er ikke det tekniske det står på. Skjemaet, testene og sjekken i CI/CD-pipelinen får vi på plass med verktøyene over. Det vanskelige er eierskapet og oppfølgingen: at noen eier kontrakten over tid, og at noen følger opp når den brytes.

Det er der kostnaden fra åpningen ligger. Å skrive kontrakten er en engangsjobb, mens å eie den er en del av driften, med brudd som skal håndteres og nye behov fra konsumentene som skal inn i neste versjon. Den maskinelle delen trengs fortsatt, for uten tester vet ingen at kontrakten er brutt. Men testene alene gjør ingen til eier.

Hva endrer seg når konsumenten er en AI-agent?

En AI-agent tar kontrakten bokstavelig. Den spør ikke om det den ikke vet, men fyller hullene med egne antakelser. Fra versjon 3.2.0 har ODCS fått en egen blokk, context, der produsenten kan skrive hvordan dataene skal brukes, hvilke spørsmål som har verifiserte svar, og hva en agent aldri må gjøre med dem.

context:
  instructions: >
    Bruk tabellen til å vurdere kredittrisiko i porteføljen.
    Kredittrisiko er bankens egen beregning, ikke en karakter fra et kredittbyrå.
  verifiedStatements:
    - question: "Hvor stor del av lånebeløpet har høy kredittrisiko?"
  constraints:
    - constraint: "Vis aldri enkeltkunder i et svar. Grupper på minst segment."

Freeman har prøvd dette i et workshop-repo til boka. Noen av oss i Glitni var på kurs med ham på Helsinki Data Week i oktober 2026, og han fortalte om en test han hadde gjort. En AI-assistent skriver SQL mot en database med gjenstander fra Metropolitan Museum of Art. Kilden har fire etiketter for møbler, og en femte som ligner, gjelder et beslag på et sverd. Uten hjelp svarte assistenten riktig på 1 av 10 spørsmål om slike kategorier. Da kontrakten fikk en profil som sier hvilke etiketter som hører til hver kategori, og prompten ble bygget fra profilen, svarte den riktig på 9 av 10. De enkle spørsmålene gikk samtidig ned fra 9 til 7 riktige, og Freeman kaller resultatet én kjøring og en demonstrasjon, ikke et bevis.

Det viktigste er at betydningen nå kan testes på samme måte som skjemaet. Fjerner noen en av møbeletikettene fra prompten, feiler sjekken i pull requesten og sier hvilken etikett som mangler, uten at modellen må kjøres. En ferdig ontologi fra fagfeltet er ikke nok alene. Første gang Freeman la inn Linked Art, en ontologi laget for museer generelt, ble svarene dårligere, fordi den manglet materialet treverk, som museet bruker. Konteksten må lages for de dataene den skal forklare.

Den samme tanken går igjen i artikkelen om metadata og ontologi, der et semantisk lag for AI blir en kontrakt mellom teamet og en mottaker som tar alt bokstavelig. Når agenter skriver deler av koden i en dataflyt, mener vi i Glitni at testene, datakontraktene, katalogen og dbt-prosjektet er kjernen agenten styres av og måles mot. Jo bedre den kjernen er, desto mindre betyr det hvilken modell som kjører.

Hvordan kommer dere i gang?

Velg et dataprodukt der en feil i dataene har kostet noe før, og teamet som eier det. Skriv ned det dere i praksis lover konsumentene i dag, legg kontrakten i kode og la den kjøres i CI/CD-pipelinen. Utvid med flere krav og flere team når den første kontrakten har vist at den fanger feil.

Implementering av datakontrakter krever organisatorisk forankring og støtte fra toppledelsen. Husk at det krever tid og prioritering å få på plass kontrakter, men det er mindre enn tiden dere bruker på å rydde opp i feilsituasjoner.

Hvordan dere selger det inn, avhenger av hvem dere snakker med. Andrew Jones forteller at han møter en CDO eller den som leder data governance med at dataeieren klassifiserer dataene i kontrakten, så plattformen kan håndheve reglene for oppbevaring, tilgang og kvalitet automatisk. En dataeier møter han med at kontrakten lar dem dele dataene uten å bli eksperter på datahåndtering. Funksjonene er de samme, men innsalget er ulikt.

Freeman mener det er en tapt kamp å få utviklerne som lager dataene til å bry seg om dem. De bryr seg om at systemet er stabilt og at de slipper å bli vekket om natta. Kontrakten må passe inn i testene og CI/CD-pipelinen de alt har. Freeman anbefaler å ikke stoppe pipelinen med en gang. Først går kontraktsbruddene bare til datateamet, og etter en måned eller to har dere en logg over konkrete brudd per datasett å legge fram. Neste trinn er en kommentar i pull requesten som ikke stopper endringen, og harde stopp brukes bare der et kontraktsbrudd har en betydelig kostnad. Da får kontrakten vist sin verdi, også før den stopper noe.

Tre trinn fra venstre mot høyre. Trinn 1, fra første dag, er varsel: bruddene går bare til datateamet, og endringen går videre. Trinn 2, etter en måned eller to, er en kommentar i pull requesten som ikke stopper endringen. Trinn 3, ved betydelig kostnad, er hard stopp: pull requesten kan ikke flettes, og endringen stoppes. Under står at loggen over brudd per datasett fra trinn 1 viser hvor et brudd har en betydelig kostnad.
Kontrakten varsler først, kommenterer så i pull requesten og stopper endringer bare der et brudd har en betydelig kostnad. Etter Mark Freeman II, masterclass på Helsinki Data Week, 26. oktober 2026.

Her er noen tips fra praksis:

  • Bestem hvem som eier kontrakten og hvem som følger opp når den brytes, før dere velger verktøy
  • Start med ett team og ett dataprodukt
  • La bruddene først gå som varsel til datateamet, og la kontrakten stoppe endringer bare når loggen viser hva bruddene koster
  • Vis frem suksesshistorier internt
  • Få støtte fra CDO eller dataansvarlig fra starten
  • Bruk verktøy og formater dere har fra før (for eksempel dbt, Terraform og Databricks), og legg til Data Contract CLI for testene

Start lite. Formaliser det du allerede gjør. Bygg så gradvis opp tekniske valideringer og kultur for deling og eierskap.

Vil dere ha hjelp til å skrive den første kontrakten? Send oss en melding.

Vanlige spørsmål om datakontrakter

Hva er en datakontrakt? En datakontrakt er en avtale mellom teamet som lager et datasett og teamene som bruker det, skrevet som kode slik at den kan testes automatisk. Den beskriver skjemaet, kvalitetskravene, hvor ofte dataene oppdateres og hvem som eier dem. Kontrakten fungerer som et API for data. Produsenten kan endre det som ligger bak, så lenge det kontrakten lover, fortsatt holder.

Er en dbt-kontrakt det samme som en datakontrakt? Nei. En kontrakt i dbt sjekker at modellen gir kolonnene med de navnene og datatypene dere har definert, hver gang modellen bygges. Den sier ingenting om kvalitetskrav over tid, hvor ofte dataene oppdateres eller hvem som eier dem. dbt-kontrakten kan være den delen av datakontrakten som håndhever skjemaet, men den er ikke hele kontrakten.

Hvem eier datakontrakten? Produsenten, altså teamet som forvalter dataproduktet og publiserer grensesnittet. Produsenten tar kostnaden ved å beskrive dataene og holde kontrakten ved like, men kontrakten bør skrives sammen med de viktigste konsumentene. Endringer skjer gjennom versjonering, slik at konsumenter som bruker en eldre versjon, fortsatt fungerer.

Hva er det vanskeligste med å innføre datakontrakter? Eierskapet og oppfølgingen. Skjemaet og testene lar seg sette opp med ODCS, Data Contract CLI eller dbt. I prosjektene våre står det på om noen eier kontrakten over tid, følger opp når den brytes, og tar nye behov fra konsumentene inn i neste versjon.

Hvilken standard bør vi bruke for datakontrakter? Open Data Contract Standard (ODCS) er den åpne standarden, forvaltet av Bitol i Linux Foundation AI & Data. Kontrakten skrives i YAML, og versjon 3.2.0 fra september 2026 har også en egen blokk med kontekst til AI-agenter. Data Contract CLI kan teste en ODCS-kontrakt mot dataene i blant annet Snowflake, Databricks, BigQuery og Postgres.

Når trenger vi en datakontrakt? Når flere team er avhengige av de samme dataene, når en feil koster mye, og når dataene endres ofte. Jo mer av dette som gjelder, desto større grunn er det til å skrive en kontrakt. I mange tilfeller holder det lenge å starte med feltene folk misforstår, nøklene og hvordan endringer varsles.

Hør episoden om datakontrakter

I episode 15 av podkasten Datautforskerne snakker Safurudin Mahic og Magne Bakkeli om datakontrakter. Episoden finnes på Spotify, Apple og Acast. Lik og abonnér!

Kilder

author image

Magne Bakkeli

Magne Bakkeli er medgründer og seniorrådgiver i Glitni. Han har over 25 års erfaring med dataplattformer, data governance og dataarkitektur, og ledet Data & Analytics-teamet i PwC Consulting i 12 år. Han har bygget og modernisert dataplattformer i kraft, FMCG, finans og media.