Foto: Umberto / Unsplash

Del plattformen · kapittel 8

Faste kjøringer, drift og overvåkning

Portalen holder seg selv ved like gjennom et sett faste jobber. Her er kjøreplanen for dem, hva som fortsatt gjøres for hånd, og hvordan vi får vite når noe ryker.

Kjøreplanen

Portalen passer ikke seg selv, men den gjør det meste av arbeidet uten at noen ber om det. 35 jobber holder den i gang. 24 av dem går etter en fast plan, og resten startes av en hendelse, av en annen jobb eller for hånd. 4 av jobbene håndterer interne verktøy og er ikke listet her.

Oversikten under er ikke skrevet inn. Den leses ut av jobbene selv hver gang tallgrunnlaget oppdateres, og en ny jobb som mangler en beskrivelse stopper oppdateringen framfor å bli utelatt i stillhet. Det er hele grunnen til at siden finnes: en liste noen må huske å vedlikeholde, blir feil.

Oversikten dekker jobbene som kjører i kodelagerets egen jobbkjører. Noen faste kjøringer ligger andre steder og står ikke her: datamodellene bygges hver natt av en egen tjeneste for dem, to ukentlige innhentinger kjører inne i datalageret, oppgavene som bygges om natta startes av en planlagt økt hos språkmodell-leverandøren, og kunnskapskartet publiseres av sin egen vertstjeneste ved hver endring. Innstillingene for flere av dem ligger utenfor kodelageret, og det er nettopp der vokterne lenger ned har måttet fylle hull.

DØGNET, NORSK TIDMånedlig uttrekk fra NAVs statistikkbankOppdater teknisk dokumentasjonHendelsesloggÅrlig uttrekk fra NAVs statistikkbankDaglig datahentingRydd testområder i datalageretNAVs statistikknotater om arbeidsavklaringspengerStatistisk sentralbyrå til datalageretNAVs statistikknotater om uføretrygdNorges Bank til datalageretKodesjekkEvaluering av spørresvareneForeldelsesvaktDatamodell-dokumentasjonNyhetsbildetMålinger av spørresvareneKart-lenker til kunnskapskartetVakt for datalageretBrønnøysundregistrene til datalageretUkentlig innholdsplanIdébankNyhetsbildetUkentlig datapipeline
Jobbene som går på fast plan, plassert etter klokkeslett. Tyngdepunktet ligger tidlig om morgenen, slik at dagens tall er på plass før noen leser dem. Klokkeslettene er norsk vintertid.

Faste jobber

35

til sammen

På fast plan

24

går av seg selv

Daglig eller oftere

11

kjøringer i døgnet

Datafiler med dato

67

holdes under oppsyn

Hva jobbene gjør

Jobbene faller i fem grupper. Rekkefølgen leser som en dag i portalens liv: data inn, innhold ut, kontroll av at det stemmer, dokumentasjon av det som er gjort, og drift av det hele.

Data (9 jobber)

Faste jobber i gruppen Data
JobbGårGjør
NAVs statistikknotater om arbeidsavklaringspengermånedlig, den 1. kl. 06:00Leter opp nye kvartalsnotater, laster dem ned og lar dem gå gjennom tolkningen som gjør PDF om til tall.
Brønnøysundregistrene til datalageretdaglig kl. 08:00Daglig uttrekk av foretaksdata: nyetableringer, konkurser og endringer i næringslivet.
Norges Bank til datalageretdaglig kl. 07:00Daglig uttrekk av renter og valutakurser.
Statistisk sentralbyrå til datalageretukentlig, mandag kl. 06:00Henter SSB-tabellene uendret inn i datalageret, slik at all videre bearbeiding kan spores tilbake til rådata.
NAVs statistikknotater om uføretrygdmånedlig, den 1. kl. 06:30Samme behandling som notatene om arbeidsavklaringspenger, for uføretrygd.
Månedlig uttrekk fra NAVs statistikkbankmånedlig, den 1. kl. 05:00Henter tabellene NAV publiserer månedlig, og som ikke finnes bak et API.
Årlig uttrekk fra NAVs statistikkbankmånedlig, den 3. kl. 05:30Henter årstabellene når NAV publiserer dem i januar.
Daglig datahentingdaglig kl. 05:30Henter dagsferske tall som renter, valuta, foretaksdata og kryptopriser, og publiserer dem hvis noe har endret seg.
Ukentlig datapipelineukentlig, søndag kl. 15:00Full gjennomgang av de store kildene. Oppdaterer datafilene bak seksjonene og legger samtidig opp grunnlaget for nye artikler.

Innhold (6 jobber)

Faste jobber i gruppen Innhold
JobbGårGjør
Hent bilde til artikkelstartes for håndFinner et fritt lisensiert bilde som passer artikkelens tema, med fotografkreditering.
Idébankdaglig kl. 10:00Leter daglig etter temaer portalen burde dekket, og legger dem i en idébank et menneske plukker fra.
Publiser artikkelstartes for håndFlytter et gjennomlest utkast ut i bloggen. Startes alltid manuelt, med artikkelen navngitt.
Skriv artikkelutkaststartes for håndLager utkast fra de klargjorte oppdragene. Utkastene publiseres ikke - de venter på gjennomlesing.
Nyhetsbildetdaglig kl. 07:00 og daglig kl. 14:00Leser norske nyhetskilder to ganger daglig og finner ut hvilke av portalens temaer som er aktuelle akkurat nå.
Ukentlig innholdsplanukentlig, mandag kl. 09:00Ser etter hull i dekningen og foreslår hva som bør skrives eller oppdateres neste uke.

Kvalitet (7 jobber)

Faste jobber i gruppen Kvalitet
JobbGårGjør
Hendelsesloggdaglig kl. 05:15Leser dagboka over hva som gikk galt underveis, gjør den om til tellbare tall for kvalitetsregnskapet, og skriver oversikten over det som alt er fanget tilbake til kunnskapsbasen.
Kart-ferskhetsvaktdaglig, hver 6. timeSier fra når kunnskapskartets eget nettsted henger etter siste versjon av koden, slik at et bygg som stille ble hoppet over ikke lar kartet stå bak uten at noen merker det.
Kodesjekkdaglig kl. 07:00Kjører stilkontroll, typesjekk og de automatiske reglene - blant annet at norske tegn er riktige og at intern sporingsinformasjon ikke lekker ut i teksten.
Evaluering av spørresvareneukentlig, mandag kl. 07:00Måler ukentlig om AI-assistenten svarer riktig på et fast sett spørsmål, slik at kvaliteten kan følges over tid.
Målinger av spørresvareneukentlig, mandag kl. 07:30Samler måletallene fra evalueringen slik at utviklingen kan leses av.
Foreldelsesvaktdaglig kl. 07:00Går daglig gjennom alle datasett og sier fra om noen har blitt for gamle til at de bør stå uten forbehold, og sjekker at de faste datainnhentingene faktisk har kjørt.
Valider innholdsplanved endring i kodenSjekker at endringer i innholdsplanen henger sammen før de tas inn.

Dokumentasjon (5 jobber)

Faste jobber i gruppen Dokumentasjon
JobbGårGjør
Samle endringsloggenved endring i kodenSlår sammen de enkeltvise leveransenotatene til én samlet endringslogg.
Oppdateringshistorikkved endring i kodenFyller ut historikken over når hvert datasett faktisk ble endret.
Kart-lenker til kunnskapskartetdaglig kl. 07:30Holder registeret over hvilke noder som er publisert på kartnettstedet ferskt, slik at portalen bare lenker til sider som faktisk finnes der.
Datamodell-dokumentasjonukentlig, mandag kl. 07:00Leser datamodellene og genererer dokumentasjonen fra dem, så beskrivelsen ikke kan komme i utakt med virkeligheten.
Oppdater teknisk dokumentasjonmånedlig, den 1. kl. 05:00Teller tallene på disse sidene på nytt hver måned - også PR-flyt og ledetid bak prosesskapitlet - og ber et menneske lese gjennom prosaen. Tallene fikser seg selv; teksten gjør ikke det.

Drift (4 jobber)

Faste jobber i gruppen Drift
JobbGårGjør
Publiser nettstedet uten datajobbstartes for håndSamme utlegging, men uten å hente data først. Brukes når bare innhold eller kode er endret.
Rydd testområder i datalageretukentlig, mandag kl. 06:00Sletter ukentlig midlertidige testområder, slik at lagringen ikke vokser i det stille.
Vakt for datalageretdaglig kl. 08:00Sier fra i god tid før en tilgangsnøkkel til datalageret går ut, med en gang en slutter å virke, og når en av de faste jobbene i datalageret feiler eller ikke har kjørt på over åtte dager, så datainnhentingen ikke stopper uten forvarsel.
Publiser nettstedetstartes for håndBygger og legger ut nettstedet. Kjøres bevisst ikke ved hver kodeendring.

Klokkeslettene er norsk vintertid. Om sommeren går jobbene én time senere enn oppgitt - kadensen er poenget, ikke minuttet.

Det som fortsatt gjøres for hånd

Automatikk dekker det som kan hentes maskinelt. Noe kan ikke det, og det er ærligere å si det enn å late som om alt går av seg selv.

  • 101 datasett

    Rapporter og oversikter som bare finnes som tekst eller tabeller ment for lesing. De må hentes, leses og skrives inn. Foreldelsesvakten sier fra når de blir gamle, men den kan ikke oppdatere dem.

  • Lenkekontroll

    Eksterne adresser råtner. Dyplenker til rapporter og tabeller kontrolleres periodisk, og brutte lenker byttes ut. Ingen jobb kan avgjøre om en ny adresse peker på det samme dokumentet.

  • Publisering av artikler

    Et menneske leser og velger hva som skal ut. Se kapitlet om publiseringskjeden.

  • Å sette i gang artikkelskrivingen

    Utkastene skrives bare når noen starter skrivejobben. Oppdragene legges igjen automatisk, men uten det ene trykket blir de liggende.

  • Å få endringer i datalageret ut i drift

    Notatbøkene som kjører inne i datalageret, kommer først i drift når noen legger dem ut dit. Ingen jobb gjør det automatisk, og flere innstillinger for jobbene der ligger utenfor kodelageret, der ingenting merker om de endres. Datamodellene er unntaket: de bygges fra kodelageret av sin egen tjeneste.

  • Vurdering av nye kilder

    Om en tabell faktisk måler det den ser ut til å måle, er et faglig spørsmål. Feil valg her gir tall som ser riktige ut og er feil.

Når noe ryker

Med 24 jobber på fast plan er spørsmålet ikke om noe feiler, men når. Det som betyr noe, er at feilen blir oppdaget.

En feilet jobb blir en oppgave

Feiler en av datajobbene, innhentingene til datalageret eller utleggingen, opprettes det automatisk en sak med hvilken jobb og hvilken kjøring det gjaldt. Ingen skal måtte huske å se etter. Omtrent en tredjedel av de planlagte jobbene har ikke dette ennå, blant dem to av ferskhetsvaktene, målingen av chatsvarene og den ukentlige innholdsplanen.

En grønn jobb er ikke det samme som ferske tall

Hver datafil får sitt eget utfall etter en kjøring: nye tall, ingen ny periode hos kilden, en henting som feilet, eller en serie som med vilje står i ro. En kilde som feiler blir en egen sak selv om jobben rundt den gikk gjennom, og utfallet står på oppdateringsloggen. Da det ble oppdaget i august 2026, hadde sju datasett stått urørt i mellom to uker og tre måneder bak en grønn jobb.

En bestilling er ikke en utlegging

Utleggingen regnes som vellykket først når vertstjenesten bekrefter at den nye utgaven er publisert, og en røyktest mot fem sider og én fil sidene trenger, har gått gjennom. Feiler røyktesten, rulles nettstedet tilbake. Regelen kom etter at fire bestillinger på rad ble borte i vertstjenestens kø mens alle jobbene var grønne.

Kontroll ved hver endring

Kodestilen, typene, hele testsettet og de egne reglene kontrolleres automatisk ved hver kodeendring, og daglig i tillegg.

Til sammen finnes 218 automatiske testfiler. Flere av dem er der utelukkende for å hindre at en bestemt feil kan gjøres om igjen - de vokter en regel framfor å teste en beregning.

Vokterne

Når en maskin både henter tallene og formulerer setningene om dem, flytter spørsmålet seg. Det er ikke lenger «er koden riktig», men «ville vi merket det hvis den stille begynte å ta feil». En vokter er en test som finnes for å gjøre én bestemt feil umulig å gjenta. Den kjører ved hver endring, og i tillegg hver morgen etter den daglige datajobben, fordi de automatiske jobbene endrer data uten at noen åpner en endring.

Er datasettet fortsatt komplett?

Et kuratert datasett kan krympe uten at noe brekker. Vokteren sammenligner hva som er bestilt mot hva som faktisk kom, og feiler når en kilde er borte. I sommer mistet ett datasett halvparten av kildene sine uten at noe sa fra. Akkurat den varianten fanges nå.

Sier de to kopiene det samme?

Der samme oppsett må stå to steder, driver de fra hverandre i stillhet. Vokteren sammenligner ikke bare hvilke kilder som er med, men hvordan hver enkelt hentes. Retter man en feil ett sted og glemmer det andre, er det nettopp den halve rettingen som er farlig.

Er tallet lov å legge sammen?

En inndeling som i skjul teller noen to ganger, ser helt rimelig ut. Summen stemmer med seg selv, den er bare for høy. Derfor kontrolleres kategoriene mot kilden før en tabell slipper inn, og begrunnelsen skrives ned der valget ble tatt.

Lyver datoen om ferskhet?

Hentet en kjøring ingen nye tall, skal datoen ikke si at den gjorde det. En dato som later som, er verre enn en synlig gammel dato, fordi den fjerner grunnen til å se etter.

Er teksten vår tolkning eller kildens tall?

Tekst som er formulert av en språkmodell, eller som er vår egen sammenstilling, merkes som nettopp det. Leseren skal aldri måtte gjette om en setning er hentet fra en kilde eller skrevet her.

Lekker interne spor ut?

Saksnumre, filstier og navn på hemmeligheter hører hjemme i utviklingsarbeidet, ikke på en side noen leser. En egen kontroll skanner denne seksjonen strengere enn resten, nettopp fordi den er ment å deles.

Prosaen som beskriver tallene, skal ikke skrives fritt. Tallene regnes ut først, og språkmodellen får dem servert med en instruks om ikke å oppgi noe tall som ikke står der. Det er en instruks, ikke en kontroll: ingen vokter sammenligner i dag tallene i en ferdig tekst med tallene språkmodellen fikk. Det som fanges automatisk, er en tekst uten tall, og en tekst der språkmodellen selv skriver at tallene mangler.

Noe av dette er ferskt, og det er verdt å si høyt. Vokteren over det kuraterte datasettet ble skrevet samme dag som feilen den beskriver ble funnet, og den viste sin egen blindsone i løpet av timer: den sjekker at datasettet er komplett, men den kan ikke oppdage at datahentingen har sluttet å kjøre. Feiler jobben, blir rådataene rett og slett ikke overskrevet. Alt ser riktig ut, fordi alt er som sist. Det er samme stille form som feilen den ble laget for, bare med en annen utløser. Den blindsonen er nå tettet fra to kanter: en jobb-vakt spør datalageret hver morgen om jobbene faktisk har kjørt og lyktes, og melder en jobb som feilet, som ikke har lyktes på over åtte dager, eller som aldri har kjørt, som en egen sak. Foreldelsesvakten sjekker i tillegg at selve hentingene har hatt en vellykket kjøring nylig. Det som fortsatt ikke varsler, er ferskhetsmålingen i verktøyet som bygger datamodellene: den står som en innstilling på et skjermbilde, og et resultat der stopper ingenting, uansett om det er gult eller rødt.

Den vanskeligste lærdommen er likevel en annen: en vokter er verdt nøyaktig så mye som reaksjonen på den. En kontroll som melder fra et sted ingen ser, er pynt. Nettopp det skjedde her: kontrollen meldte «alt i orden» mens et datasett i nesten tre måneder manglet halvparten av tabellene sine, fordi den leste oppskriften og ikke resultatet. Vokterne er derfor flyttet dit de stopper arbeidet, framfor dit de kan overses.

Når tallene blir gamle

Den vanligste feilen i en statistikkportal er ikke et galt tall. Det er et riktig tall som har blitt gammelt uten at noen sa fra.

Hvert datasett har derfor en forventet takt og en tålegrense. Passeres grensen, åpner en daglig vakt en sak for datafilen. For noen av de manuelt vedlikeholdte datasettene dukker det i tillegg opp et synlig varsel på siden selv, og det blir strengere når grensen er passert med god margin. Det er ubehagelig, og det er meningen: et ubehagelig varsel blir rettet. Datasettene som hentes automatisk, har ikke et slikt varsel. Der blir en feilet henting en sak, og datoen står ved hver graf.

67 datafiler følges på denne måten. Du kan se status for hver enkelt på oppdateringsloggen, og hele endringshistorikken på oppdateringssiden.

Når innholdet blir gammelt

Et tall blir gammelt fordi kilden har publisert noe nyere. En tekst blir gammel av en annen grunn: verden har flyttet seg forbi det den påstår. De to krever hver sin sjekk, og bare den første kan avgjøres ved å se på en dato.

En egen gjennomgang leter derfor etter seks ting i sider, artikler og datasett.

Hva innholdsgjennomgangen ser etter, og hva hvert funn betyr
Det den finnerHva det betyr
Et løfte uten sideEn planlagt artikkel peker på en side som aldri ble bygget.
Et tema som holder seg i nyhetene uten å ha en sideFem dager eller mer i nyhetsbildet, uten at portalen har en egen side for det.
To temaer som følger hverandreDe trender samtidig over tid, og er kandidat for en analyse på tvers.
Data som har passert sin egen tålegrenseSamme signal som den daglige vakten melder per datafil.
En artikkel som har passert et årKandidat for arkivering framfor å bli stående som om den var fersk.
En tekst som lover et nyere år enn den harEnten er datoen feil, eller så er teksten det. Begge deler må avgjøres for hånd.

Data som har passert tålegrensen, blir en sak per datafil, hver dag. Løfter uten side og temaer som holder seg i nyhetene eller følger hverandre, blir til noen få forslag i uka, lagt fram som en endring et menneske må godta. Alle funnene, også gamle artikler og tekster som lover et nyere år, går i tillegg daglig inn i idébanken som mulige ideer. Utover saken om gamle data blir ingen av dem en sak av seg selv.

Og så det som er selve poenget: gjennomgangen retter ingenting. Den kan finne at en artikkel viser til et år som har passert, men ikke avgjøre om svaret er å oppdatere teksten, endre datoen eller arkivere hele saken. Deteksjonen er automatisk, avgjørelsen er ikke.

01 GJENNOMGANGENGår gjennom sider, artikler ogdatasett.02 SIGNALETFunnet blir en idé, et forslageller en varsling, aldri enrettelse.03 VALGETSkal dette gjøres noe med? Etmenneske avgjør.MENNESKEVALG04 OPPGAVENFørst da blir det arbeid.Ingen oppgave oppretter segselv.
Deteksjonen er automatisk, avgjørelsen er ikke. Det er samme grense som køen for nattkjøringen har, satt to steder av samme grunn.

Det er samme grense som køen for automatiske kjøringer har, satt to steder av samme grunn: en liste som fyller seg selv med arbeid, er ikke lenger en liste noen eier.

Se det i portalen

Se hvordan denne siden henger sammen med restenNabolagskartet viser sidene, begrepene og kildene den er koblet til