I denne workshoppen lager vi værmeldingstjenesten Bekkværet på agentisk vis.
Én felles oppgave, helt uten føringer
Du har fått utdelt en delt API-nøkkel fra kursholder. Sett den som miljøvariabel i terminalen før du starter Claude Code:
export ANTHROPIC_API_KEY=nøkkelen-du-fikk-utdelt
Kjør claude. Første gang spør den om du vil bruke denne miljøvariabelen for innlogging — godkjenn det.
Test at den virker: skriv /status inne i Claude Code og sjekk at nøkkelen/kontoen vises under
Login method. Prøv deretter en enkel prompt, for eksempel hei, for å bekrefte at den svarer.
Gå først ut av Claude Code-økten fra forrige steg (skriv /exit, eller trykk Ctrl+D) så du er tilbake i den vanlige terminalen. Kommandoene under er terminalkommandoer, ikke noe du skriver inn i en Claude-samtale.
Ikke bruk et eksisterende prosjekt. Lag en ny, tom mappe og åpne Claude Code i terminalen der (ikke Desktop-appen, som ikke støtter den delte nøkkelen fra forrige steg):
mkdir bekkvaeret && cd bekkvaeret
claude
Ikke legg til, fjern eller presiser noe. Alle skal kjøre nøyaktig samme prompt:
"Lag en værmeldingstjeneste som heter Bekkværet. Den skal vise:
- nåværende vær (temperatur og forhold)
- varsel for de neste 7 dagene
- nedbør den neste timen
- mulighet for å bytte mellom Oslo og Trondheim
Du tar alle valg selv: teknologi, design, datakilde, alt.
Ikke bruk skills eller andre instruksjonsfiler.
Ikke spør meg om noe som helst underveis. Bygg den helt
ferdig, og si ifra først når den er klar til å åpnes."
Ikke avbryt, styr eller gi ekstra føringer underveis. Godkjenn det den trenger for å komme videre, men la den ta alle faglige valg selv. Poenget er å se hva den lager helt uten hjelp.
Når AI-en er ferdig, åpner du siden i nettleseren. Sammenlign med dem rundt deg:
Fire vaner som hever kvaliteten
For alt som er større enn en liten endring: be om en plan før du ber om kode. La agenten lese relevant kode, forstå dagens løsning og foreslå steg før den endrer filer. Da fanger du gale antakelser tidlig, før mange filer er endret.
"Ikke skriv kode ennå. Les deg inn i hvordan X funker i dag og legg
fram en steg-for-steg plan for å gjøre Y: hvilke filer, hvilken
rekkefølge, og hva som må testes. Vent på at jeg godkjenner planen."
Mange agentverktøy har en egen planmodus. Bruk den på større oppgaver. Det gir mindre feil, bedre retning og færre bortkastede runder. I Claude Code veksler du modus med Shift+Tab.
Kontekst er alt agenten ser akkurat nå:
Kvaliteten på svaret henger ofte direkte sammen med kvaliteten på konteksten.
Gi agenten nok kontekst:
Men ikke gi for mye:
/clear).Legg fast prosjektkontekst i CLAUDE.md, for eksempel:
Da slipper du å gjenta det i hver økt.
Agenten er ikke bare en språkmodell. Den kjører i et harness som gir den verktøy. Den kan typisk få tilgang til:
Derfor må du vite hvor du starter den, og hva den har lov til å gjøre. To viktige regler:
Agenten ser som regel bare mappen du har gitt den tilgang til. Utenfor den ser den ingenting før du utvider tilgangen.
Gode svar starter med gode prompter. Vær konkret. Ikke skriv:
Fiks auth-bugen.
Skriv heller:
Brukere får "Invalid token" etter 30 minutter.
JWT-tokens er satt til å utløpe etter 1 time i auth.config.ts.
Finn hvorfor dette skjer, og foreslå en løsning før du endrer kode.
Gi gjerne eksempler på ønsket output:
formatNOK(1234.5) skal gi "1 234,50 kr"
Tenk WRAP:
Unngå vage instrukser som:
Vær konkret på filer, feil, mål og forventet resultat.
På ekte kundeprosjekter lønner det seg å jobbe mer strukturert enn én stor prompt. Med Spec-Driven Development lar du en spesifikasjon drive arbeidet, og agenten følger faste steg fra krav til ferdig kode.
Typisk flyt:
Dette gir mer sporbare beslutninger, bedre dokumentasjon og en løsning andre enklere kan ta over. Verktøyet er GitHubs spec-kit:
# Krever Python 3.11+ og Git
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git
Instruksjonsfiler og skills
Før du lager skills, bør du gi agenten fast prosjektkontekst i en instruksjonsfil. Den kan beskrive teknologivalg, kommandoer, mappestruktur, terminologi og regler for oppgaven.
For Bekkværet kan instruksjonsfilen for eksempel si at appen bruker React, TypeScript og Vite, at værdata
hentes fra met.no, og at all kildekode skal ligge under src/.
Instruksjonsfilen gjelder hele prosjektet og lastes alltid. Skills brukes til mer avgrenset kunnskap som agenten bare trenger noen ganger. Når agenten skjønner at den jobber med værdata, kan den laste en enhets-skill som beskriver nøyaktig hvordan vi viser temperatur, vind, nedbør og tid i Bekkværet. Den informasjonen er viktig for værrelaterte oppgaver, men unødvendig støy når agenten jobber med helt andre ting, for eksempel arkitekturvalg i kodebasen.
En skill er en gjenbrukbar instruksjonspakke som lærer agenten en bestemt arbeidsmåte. Den ligger i en
SKILL.md-fil og kan inneholde regler, eksempler, sjekklister eller steg agenten skal følge.
Tenk på det som teamets erfaring skrevet ned én gang. I stedet for å gjenta «slik skriver vi tester», «slik formaterer vi datoer» eller «husk å kjøre denne kommandoen» i hver økt, legger du det i en skill. Da kan agenten hente det fram selv når oppgaven passer.
Det er tre ting som er lette å blande sammen:
| Type | Brukes til | Lastes |
|---|---|---|
| Instruksjonsfil | Fast prosjektkontekst: stack, kommandoer, terminologi og regler | Alltid |
| Skill | En bestemt ferdighet eller avgrenset kunnskap agenten trenger av og til | Ved behov |
| Slash-kommando | Noe du vil starte eksplisitt med én kommando | Når du skriver kommandoen |
Tommelfingerregel:
En skill er en mappe med en SKILL.md-fil.
.claude/skills/<navn>/SKILL.md
~/.claude/skills/<navn>/SKILL.md
Bruk .claude/skills når skillen skal deles med prosjektet.
Agenten leser først bare description. Resten av skillen lastes først når oppgaven matcher. Derfor
er en presis description det viktigste du skriver.
| Skill | Hva den gjør |
|---|---|
| Domenekonvensjoner | Låser enheter, formater og terminologi |
| PR-beskrivelse | Skriver PR-tekst basert på diffen |
| Commit-melding | Lager commit-meldinger i teamets stil |
| Skriv test | Lager tester med riktig rammeverk, navngiving og struktur |
| Code review | Går gjennom diffen før menneskelig review |
| Forklar modul | Forklarer en del av kodebasen for nye utviklere |
| grill-me | Stress-tester en plan eller løsning med kritiske spørsmål |
Husk hvor sprikende «Før vi begynner» ble: ingen hadde fortalt agenten hva slags app Bekkværet skulle være.
Før vi bygger videre, fester vi valgene i en CLAUDE.md, den alltid-lastede konteksten fra tabellen
over. Da slutter agenten å finne opp stacken på nytt for hver økt.
Bestem deg for en stack, det er din beslutning, og be agenten skrive den ned:
"Lag en CLAUDE.md i rota for Bekkværet. Skriv ned hvilken stack vi
bruker, hvordan prosjektet kjøres og testes, mappestrukturen, og
et par regler du skal følge. Hold det kort."
Et eksempel på hva fila kan inneholde:
# Bekkværet
## Stack
- React + TypeScript + Vite, ren CSS (bytt til det du valgte)
- Værdata: met.no Locationforecast
## Kommandoer
- npm install · npm run dev · npm test
## Mappestruktur
- All kildekode under src/.
## Terminologi
- Oslo skal alltid kalles Skuret.
- Trondheim skal alltid kalles Torget.
## Regler
- Ikke bytt rammeverk eller legg til store avhengigheter uten å spørre.
Legg merke til at stedsnavnene Skuret og Torget hører hjemme i instruksjonsfilen, fordi de gjelder hele prosjektet uansett oppgave. Enheter som °C, m/s og mm/t legger vi i en skill i neste steg, fordi de bare er relevante når agenten jobber med værdata.
Test at den virker: start en ny økt og spør «hvilken stack bruker dette prosjektet?» og
«hva skal Oslo og Trondheim kalles?». Agenten skal svare fra
CLAUDE.md uten at du forklarer noe.
skills.sh er en markedsplass for skills.
Installer med ett kall (åpen standard: samme SKILL.md funker for Claude, Codex, Copilot og Gemini):
npx skills add <repo-url> --skill <skill-navn>
Bla i katalogen og se hva som finnes. Til oppgaven under henter vi grill-me, som vi bruker til å
stress-teste skillen vår:
npx skills add https://github.com/mattpocock/skills --skill grill-me
Noen skills er nyttige på tvers av prosjekter eller kunder, ikke bare i ett repo. Legg dem
globalt med -g, så er de tilgjengelige uansett hvilket prosjekt du jobber i:
npx skills add <repo-url> --skill <skill-navn> -g
En værtjeneste lever av konsistente enheter og formater. I stedet for å gjenta «vind i m/s, temp i Celsius, norsk dato» i hver eneste prompt, pakker du reglene i en skill agenten laster automatisk hver gang den jobber med vær i Bekkværet.
-3 °C, 14 °C)5 m/s), vindretning som kompass (N, NØ, Ø, SØ, …)1,2 mm/t) for timesvarsel, og akkumulert per
døgn (8 mm/døgn) for dagsoversikttirsdag 30. juni, kl. 14:00), med komma
som desimalskilletegn.claude/skills/bekkvaer-enheter/SKILL.md med en
presis description så den lastes automatisk når noen jobber med værdata:
---
name: bekkvaer-enheter
description: Bruk alltid når du viser eller behandler værdata i
Bekkværet, så enheter og formater blir konsistente.
---
Enheter og format for all værdata i Bekkværet:
- Temperatur: Celsius, f.eks. "-3 °C", "14 °C".
- Vind: meter per sekund, f.eks. "5 m/s". Retning som kompass:
N, NØ, Ø, SØ, S, SV, V, NV.
- Nedbør: "1,2 mm/t" for timesvarsel, "8 mm/døgn" akkumulert.
- Lufttrykk: hektopascal, f.eks. "1013 hPa".
- Tid: norsk, 24-timers, "tirsdag 30. juni, kl. 14:00".
Komma som desimalskilletegn.
bekkvaer-enheter og
norsk-formatering, enn én stor. Husk: én skill = én ferdighet./grilling (fra grill-me) mot utkastet:
«Er hver regel entydig? Mangler det enheter eller grensetilfeller, som vindstille, frost eller
manglende data?»
Se etter uklare regler:
0 m/s — tall eller «vindstille»?-3 °C eller −3 °C?0 mm/t eller «ingen nedbør»?Test også at den ikke lastes unødvendig. Start en helt annen oppgave:
"Foreslå en bedre mappestruktur for kodebasen."
Da trenger agenten fortsatt instruksjonsfilen (stack, regler, Skuret/Torget), men enhets-skillen skal ikke aktiveres — den er irrelevant for arkitekturvalg.
npx skills add feiler
Du trenger strengt tatt ikke grill-me. Lag .claude/skills/bekkvaer-enheter/SKILL.md for hånd med
reglene over, og be agenten lese gjennom og foreslå grensetilfeller du har glemt.
Instruksjonsfiler og skills løser to ulike problemer:
CLAUDE.md) sier: «dette gjelder alltid i prosjektet.»For Bekkværet betyr det:
src/ som kildekodemappe → instruksjonsfil (gjelder alltid)Samme mønster fungerer for valuta, datoformat, API-felter, feilmeldinger, domenebegreper, teststruktur og PR-format.
Koble agenten på Figma og bygg Bekkværet fra en ferdig skisse
MCP står for Model Context Protocol.
Det er en åpen standard som lar agenten koble seg til eksterne verktøy gjennom små servere. En MCP-server kan gi agenten tilgang til for eksempel:
Agenten får ikke magisk tilgang til alt. Den får tilgang til verktøyene MCP-serveren tilbyr, og handlingene går gjennom agentens vanlige godkjenninger.
Du legger til MCP-servere med disse kommandoene i Claude Code:
claude mcp add <navn> -- <kommando som starter serveren>
For en remote MCP-server:
claude mcp add --transport http <navn> <url>
Se hva som er koblet på:
claude mcp list
Inne i Claude Code kan du også bruke:
/mcp
Da ser du status og hvilke verktøy MCP-serveren tilbyr.
Det finnes mange MCP-servere. Mange verktøy du bruker i utviklerhverdagen har allerede en MCP-integrasjon.
| MCP-server | Hva den gir agenten |
|---|---|
| Playwright | En nettleser agenten kan åpne, klikke i og lese fra |
| Dokumentasjon | Oppdatert API-dokumentasjon, så agenten slipper å gjette |
| Jira / Confluence | Tilgang til saker og dokumentasjon |
| GitHub | Issues, pull requests og kodesøk |
| Slack | Meldinger og tråder |
| Postgres og andre databaser | Skjema og data agenten kan spørre mot |
| Figma | Design, komponenter, farger, layout og tekst |
I denne oppgaven bruker vi Figma.
Du skal koble agenten til Figmas remote MCP-server og be den bygge Bekkværet basert på en ferdig Figma-skisse.
Remote-serveren krever ikke Figma Desktop. Første gang logger du inn i nettleseren.
🎨 Åpne Bekkværet-skissen i Figma
Kjør:
claude mcp add --transport http figma https://mcp.figma.com/mcp
Start Claude Code og kjør:
/mcp
Fullfør innloggingen i nettleseren hvis du blir bedt om det.
Be agenten bygge Figma-designet inn i Bekkværet:
"Bygg dette Figma-designet inn i Bekkværet:
https://www.figma.com/design/4BlBYolhiHE9Zjv5pAT4QB/Bekkvaeret--Copy-?node-id=0-1
Match layout, farger og typografi så nært du kan.
Følg bekkvaer-enheter-skillen fra nivå 2 for enheter og format."
Agenten skal nå kunne hente informasjon fra Figma og bruke den når den endrer appen.
Det fungerer, men det blir vanskeligere for agenten å gjenskape skissen nøyaktig. Med MCP kan agenten lese struktur, tekst, farger og layout direkte fra Figma. Med et bilde må den tolke alt visuelt, og da mister den ofte detaljer som avstander, fargeverdier og typografi.
Når agenten er ferdig, åpner du Bekkværet i nettleseren og sammenligner med Figma-skissen.
Se spesielt på:
Spør deg selv:
Figma Desktop har også en lokal Dev Mode MCP-server. Den kjører på:
http://127.0.0.1:3845/sse
Dette krever riktig Figma-tilgang. For denne oppgaven er remote-serveren enklest.
MCP gjør agenten bedre fordi den kan hente kontekst direkte fra verktøyene du allerede bruker.
Uten MCP må du ofte forklare eller lime inn informasjon manuelt. Med MCP kan agenten selv hente relevant kontekst fra for eksempel Figma, GitHub eller dokumentasjon.
For Bekkværet betyr det:
Sammen gir dette agenten bedre retning og mindre behov for gjetting.
Tokens, sandboxing og autonomi
openclaw, basert
på oppsettet fra nivå 2 og 3.Tokens er både en kostnad og et budsjett for agentens «hukommelse». Når kontekstvinduet fylles opp, blir svarene dårligere.
/clear mellom oppgaver. Kunnskap fra forrige feilsøking
hjelper sjelden på neste oppgave, den bare fyller opp konteksten med unødvendig støy.Mye av token-bruken i utvikling kommer fra output fra kommandoer som git status,
git diff, npm test og ls.
Verktøy som rtk (Rust Token Killer) og context-mode kan komprimere denne outputen før den når konteksten, uten å miste informasjonen agenten trenger.
Forskjellen er merkbar, spesielt over tid:
# Før og etter med rtk
git status # → ca. 300 tokens
rtk git status # → ca. 30 tokens (90 % mindre)
Poenget er ikke én enkelt kommando, men summen over en hel arbeidsdag. Mindre kontekst gir bedre svar og lavere kostnad.
Godkjenning for hvert steg er trygt, men det er også tregt.
Alternativet er å gi agenten et avgrenset miljø der den ikke kan gjøre skade. Da kan du slippe den mer løs.
Tre nivåer av isolasjon:
git worktree add ../bekkvaeret-ai -b ai-eksperiment
Tenk ut en funksjon du selv kunne tenke deg å legge til i Bekkværet, for eksempel varsel ved ekstremvær, historikk over tidligere dager, eller en tredje by å velge mellom. Velg ett av de tre alternativene over (worktree, container eller isolert VM) og la agenten jobbe med ideen der, uten at du godkjenner hvert steg underveis.
Spør deg selv etterpå: turte du gi agenten friere tøyler enn du ellers ville gjort? Hvorfor, eller hvorfor ikke?
openclaw er en alltid-på agent-gateway du kan kjøre som en
tjeneste, gjerne i den isolerte VM-en fra steget over.
Når instruksjonsfilen (nivå 2), skills (nivå 2) og MCP (nivå 3) er på plass, kan openclaw bygge
Bekkværet videre helt automatisk mens du gjør noe annet.
Slik fungerer det:
openclaw i et isolert miljø (VM)."Bygg Bekkværet ferdig fra Figma-skissen. Hent designet via
Figma-MCP, følg bekkvaer-enheter-skillen for enheter og format,
koble på ekte værdata fra met.no, og kjør testene til alt er
grønt. Meld meg på Telegram når den er klar, eller hvis du må
ta en avgjørelse."
Fordi openclaw kjører i et sandboxed miljø, kan du gi den friere tøyler enn i en vanlig økt. Den
melder fra i chatten når den er ferdig, og du kan lese gjennom diffen før du merger til main.
openclaw-gatewayen slik at bare du har tilgang. Behandle alle innkommende meldinger og ekstern
tekst som upålitelig. Ta snapshot av VM-en før du starter, og bruk openclaw doctor for å sjekke
for usikker konfigurasjon.openclaw lar deg sette alt i system og delegere hele oppgaver til en agent som bruker
oppsettet du har definert.main..env eller passordhåndterer,
og ikke commit hemmeligheter.