Claude Code i produktion: Lärdomar från 6 månaders AI-assisterad utveckling
Verkliga mönster för att använda Claude-agenter i företagsarbetsflöden - vad som fungerar, vad som går sönder, och vad vi slutade göra
Simon Axelsson
IT-konsult & teknisk rådgivare
För sex månader sedan började jag använda Claude Code som dagligt utvecklingsverktyg. Inte för att generera leksaksexempel eller skriva dokumentation, utan för produktionsinfrastrukturarbete - Terraform-moduler, BigQuery-pipelines, Next.js-applikationer och CI/CD-konfigurationer. Den här artikeln dokumenterar varje mönster, misslyckande och hårt vunnen lärdom från den erfarenheten.
Installation och integration
Den initiala installationen av Claude Code är bedrägligt enkel. Du installerar det, autentiserar och börjar chatta i din terminal. Men att göra det genuint produktivt i en företagsmiljö kräver genomtänkt konfiguration. Vår installation utvecklades avsevärt över sex månader, och den nuvarande konfigurationen speglar lärdomar från dussintals misslyckanden.
Det första vi gjorde var att skapa en omfattande CLAUDE.md-fil i varje projektrepo. Den här filen fungerar som persistent kontext som Claude läser vid starten av varje session. Den innehåller projektets arkitektur, namnkonventioner, deploymentprocess och kritiska "gör inte"-regler. Utan den här filen producerar Claude kod som är tekniskt korrekt men stilmässigt inkonsekvent med resten av kodbasen.
| 1 | # Project: Enterprise Data Platform |
| 2 | |
| 3 | ## Architecture |
| 4 | - Monorepo: Next.js frontend + Cloud Functions backend |
| 5 | - Database: BigQuery (enterprise GCP-projekt) |
| 6 | - Deployment: Vercel (frontend) + GCP (backend) |
| 7 | - IaC: Terraform in /infrastructure |
| 8 | |
| 9 | ## Critical Rules |
| 10 | - NEVER modify migration files after they have been deployed |
| 11 | - NEVER use SELECT * in BigQuery queries (cost!) |
| 12 | - All BigQuery tables MUST be partitioned |
| 13 | - Use Swedish locale for date formatting in UI |
| 14 | - All Cloud Functions must include error reporting to Sentry |
| 15 | |
| 16 | ## Naming Conventions |
| 17 | - BigQuery tables: snake_case, prefixed by layer (stg_, int_, core_) |
| 18 | - Cloud Functions: kebab-case, prefixed by action (ingest-, transform-, serve-) |
| 19 | - React components: PascalCase |
| 20 | - API routes: kebab-case |
| 21 | |
| 22 | ## Testing Requirements |
| 23 | - All dbt models need at minimum: unique + not_null on PK |
| 24 | - Cloud Functions need integration tests against BQ sandbox |
| 25 | - Frontend: Playwright for critical user flows |
| 26 | |
| 27 | ## Deployment |
| 28 | - Frontend: Push to main -> Vercel auto-deploy |
| 29 | - Cloud Functions: `gcloud functions deploy <name> --gen2` |
| 30 | - dbt: `dbt run --target prod` via Cloud Build trigger |
CLAUDE.md-filen läses automatiskt vid sessionsstart. Vi underhåller också projektspecifika minnesfiler i .claude/ som bevarar inlärda preferenser mellan sessioner. Till exempel, efter att ha korrigerat Claude tre gånger om vår namnkonvention för BigQuery-dataset, mindes den permanent. Dessa minnesfiler ackumuleras över tid och reducerar upprepade korrigeringar till nära noll.
Vi kör Claude Code på tre utvecklararbetsstationer och två CI-miljöer. Varje miljö har samma baskonfiguration men olika behörighetsnivåer. Utvecklarmaskiner har full läs-/skrivåtkomst. CI-miljöer körs i ett begränsat läge där Claude kan föreslå ändringar men inte utföra destruktiva operationer (inget git push --force, inga databas-drops, inga produktionsdeployments).
Mönster som fungerar
Under sex månader framträdde flera användningsmönster som konsekvent högvärdiga. Det är inte de uppenbara som "generera en React-komponent" - de fungerar bra men det är inte där den verkliga hävstången finns. Mönstren nedan representerar de mest lönsamma användningsfallen vi upptäckte.
Mönster 1: Utforska kodbasen före implementation
Innan vi skriver ny kod ber vi Claude utforska den befintliga kodbasen och sammanfatta nuvarande implementationsmönster. Det är särskilt värdefullt när man arbetar i okända delar av monorepon. Claude läser flera filer, identifierar konventioner och föreslår en implementationsplan som är konsekvent med befintlig kod. Enbart detta eliminerar 80% av kodgranskningskommentarer om stilinkonsistens.
Mönster 2: Test-först-utveckling med Claude
Vi beskriver önskat beteende i klartext, ber Claude skriva testerna först, sedan implementera koden för att klara dem. Det fungerar anmärkningsvärt bra för Cloud Functions och dbt-modeller. Claudes tester fångar ofta edge cases vi hade missat - null-hantering, tidzonsproblem med svenska datum och Unicode-normalisering för företagsnamn med svenska tecken.
Mönster 3: Migrering & refaktorisering över flera filer
Claude excellerar på konsekventa ändringar över många filer. När vi migrerade från det gamla proxytjänst-API:et till proxytjänst uppdaterade Claude 14 konfigurationsfiler, 6 Cloud Functions och proxy-abstraktionslagret i en enda session. Den bibehöll konsekvens över alla filer och fångade två ställen där vi använde utfasade parametrar som vi missat i vår manuella granskning.
Mönster 4: Felsökning av produktionsincidenter
När ett produktionslarm utlöses klistrar vi in felkontexten och relevanta loggar i Claude Code. Den läser relaterade källfiler, identifierar potentiella rotorsaker och föreslår fixar rankade efter sannolikhet. För vår datapipeline har Claude korrekt diagnostiserat rotorsaken vid första försöket ungefär 70% av gångerna. De återstående 30% kräver vanligtvis ytterligare kontext som vi tillhandahåller iterativt.
MCP-konfiguration
Model Context Protocol (MCP)-servrar är det som förvandlar Claude Code från en smart autokomplettering till en genuin utvecklingspartner. MCP-servrar ger Claude åtkomst till externa verktyg och datakällor - databaser, API:er, webbläsare och specialiserade tjänster. Vi kör sju MCP-servrar i vår standardutvecklingsmiljö.
| 1 | { |
| 2 | "mcpServers": { |
| 3 | "bigquery-mcp": { |
| 4 | "command": "npx", |
| 5 | "args": ["-y", "@anthropic/bigquery-mcp"], |
| 6 | "env": { |
| 7 | "GOOGLE_PROJECT_ID": "enterprise-data", |
| 8 | "GOOGLE_APPLICATION_CREDENTIALS": "/path/to/service-account.json" |
| 9 | } |
| 10 | }, |
| 11 | "perplexity-mcp": { |
| 12 | "command": "npx", |
| 13 | "args": ["-y", "@anthropic/perplexity-mcp"], |
| 14 | "env": { "PERPLEXITY_API_KEY": "${PERPLEXITY_KEY}" } |
| 15 | }, |
| 16 | "vercel-mcp": { |
| 17 | "command": "npx", |
| 18 | "args": ["-y", "@vercel/mcp"], |
| 19 | "env": { "VERCEL_TOKEN": "${VERCEL_TOKEN}" } |
| 20 | }, |
| 21 | "comet-bridge": { |
| 22 | "command": "npx", |
| 23 | "args": ["-y", "comet-mcp-bridge"], |
| 24 | "env": { "COMET_API_KEY": "${COMET_KEY}" } |
| 25 | }, |
| 26 | "scraping-plattform-mcp": { |
| 27 | "command": "node", |
| 28 | "args": ["./tools/scraping-plattform-mcp/index.js"], |
| 29 | "env": { "SEQ_WORKSPACE": "/opt/scraping-plattform-workspace" } |
| 30 | } |
| 31 | } |
| 32 | } |
BigQuery MCP-servern är den mest effektfulla. Den låter Claude köra frågor direkt mot vårt datalager, inspektera tabellscheman och förstå datamönster innan den skriver transformationskod. När en ny dbt-modell byggs frågar Claude staging-tabellerna för att förstå den faktiska datadistributionen, null-frekvenser och edge cases. Detta producerar modeller som hanterar verklig data korrekt vid första försöket istället för att kräva iterativ felsökning.
Perplexity MCP-servern möjliggör webbaserad research under utvecklingssessioner. När Claude stöter på ett okänt API eller bibliotek kan den slå upp aktuell dokumentation istället för att förlita sig på träningsdata som kan vara föråldrad. Det är särskilt värdefullt för snabbrörliga ekosystem som Vercel, Next.js och Google Cloud-klientbibliotek där API:er ändras ofta.
Vi byggde en egen scraping-plattform MCP-server som wrappar vår lokala en scraping-plattform-installation. Det låter Claude inspektera scraping-agentkonfigurationer, trigga testkörningar och visa extraktionsresultat utan att lämna utvecklingssessionen. Det reducerade feedback-loopen för scraper-utveckling från minuter till sekunder och gjorde Claude förvånansvärt effektiv på att felsöka HTML-selektorproblem.
Agentarbetsflöden
Utöver interaktiv utveckling använder vi Claude Code som autonom agent för flera återkommande arbetsflöden. Det är uppgifter där vi definierar målet, tillhandahåller kontext och låter Claude utföra en flerstegsplan med minimal mänsklig inblandning. Nyckeln till att få det att fungera pålitligt är strikta skyddsräcken och tydliga framgångskriterier.
| 1 | #!/bin/bash |
| 2 | # Automated scraper recovery agent |
| 3 | # Triggered by PagerDuty when a source fails 3x consecutively |
| 4 | |
| 5 | SOURCE_NAME=$1 |
| 6 | ERROR_LOG=$2 |
| 7 | |
| 8 | claude-code --print --allowedTools "Read,Write,Bash,Grep" \ |
| 9 | --model claude-sonnet-4-20250514 \ |
| 10 | --system-prompt "You are a scraper maintenance agent. \ |
| 11 | Diagnose why the $SOURCE_NAME scraper is failing. \ |
| 12 | Read the error log, inspect the scraping config, \ |
| 13 | check if the target website changed its structure, \ |
| 14 | and propose or apply a fix. \ |
| 15 | Do NOT modify rate limits or proxy config without approval." \ |
| 16 | --prompt "The $SOURCE_NAME scraper has failed 3 consecutive runs. \ |
| 17 | Error log: $ERROR_LOG \ |
| 18 | 1. Read the scraping-plattform config at configs/$SOURCE_NAME.json \ |
| 19 | 2. Check if the target URL returns expected HTML structure \ |
| 20 | 3. Identify the root cause \ |
| 21 | 4. If it's a selector change, update the config and test \ |
| 22 | 5. If it's a rate limit or block, report but do not change config" |
Scraper-återställningsagenten har varit vårt mest framgångsrika autonoma arbetsflöde. När en scraping-källa misslyckas läser agenten felloggarna, inspekterar scraping-konfigurationen, hämtar mål-URL:en för att kontrollera HTML-strukturändringar, och antingen tillämpar en fix eller eskalerar med en detaljerad diagnos. Den löser automatiskt cirka 40% av scraper-fel, mestadels CSS-selektorändringar och mindre HTML-omstruktureringar.
Vi kör också en veckovis kodkvalitetsagent som granskar senaste commits, kontrollerar konsekvens med projektkonventioner, identifierar potentiella prestandaproblem i BigQuery-frågor och öppnar pull requests med förbättringsförslag. Agenten körs varje måndag morgon och producerar typiskt 3-5 åtgärdbara PR:er per vecka. Teamet granskar och mergar ungefär 80% av dem utan modifiering.
Den kritiska lärdomen med agentarbetsflöden: begränsa verktygssetet. En agent med åtkomst till Bash och Git kan orsaka enorm skada om den inte begränsas noggrant. Vi använder allowedTools för att vitlista exakt vilka verktyg varje agent får använda, och vi kör alltid agenter i en sandlådemiljö först innan vi befordrar till produktion. Ge aldrig en autonom agent push-åtkomst till main.
Fallgropar och misslyckanden
För varje framgångsrikt mönster fanns det flera misslyckanden. Här är de mest lärorika, inklusive misstagen som kostade oss verklig tid och pengar.
SELECT *-incidenten
Claude genererade en BigQuery-fråga med SELECT * på vår största tabell (2,1M rader, 47 kolumner) i en Cloud Function som kördes varje timme. Vi missade det i granskningen. Månadsfakturan hoppade från 420 EUR till 2 800 EUR enbart i frågekostnader. Nu förbjuder vår CLAUDE.md explicit SELECT * och vår CI-pipeline har en linter som avvisar det.
Hallucinerade API-parametrar
Claude använde säkert en BigQuery-klientbiblioteksparameter som inte existerar. Koden kompilerade (TypeScript any-typer) men kraschade vid körning. Det hände tre gånger innan vi skärpte vårt TypeScript strict mode och lade till Perplexity MCP-servern för realtidsuppslag av dokumentation.
Förstörd Git-historik
Tidigt i vår användning körde ett agentarbetsflöde git reset --hard följt av en force push till en feature branch. Den försökte 'städa upp' en rörig commit-historik men förstörde pågående arbete. Vi förbjuder nu explicit destruktiva git-operationer i alla agentkonfigurationer.
Oändlig loop i agentarbetsflöde
En scraper-återställningsagent hamnade i en loop där den fortsatte modifiera en CSS-selektor, köra scrapern, se den misslyckas (av en orelaterad anledning) och modifiera selektorn igen. Den körde i 45 minuter och förbrukade betydande API-krediter innan vi märkte det. Vi har nu maxgränser för iterationer och timeout-gränser på alla agentarbetsflöden.
Självsäkert felaktiga arkitekturråd
Claude föreslår ibland arkitekturmönster som är tekniskt korrekta men fel för vår specifika kontext. Den föreslog att vi skulle byta från BigQuery till ClickHouse av kostnadsskäl, vilket hade varit en katastrof givet vår GCP-nativa infrastruktur. Lärdomen: validera alltid arkitekturförslag mot dina faktiska begränsningar.
Bästa praxis
Destillerat från sex månaders daglig användning - det här är metoderna som gör Claude Code genuint produktivt istället för en fancy leksak.
Investera i CLAUDE.md
En omfattande projektkontextfil eliminerar 80% av stilinkonsistens och konventionsbrott. Uppdatera den efter varje betydande kodgranskningskorrigering.
Använd MCP-servrar aggressivt
Claude med databasåtkomst är 5x mer produktiv än Claude som gissar på dataformer. Enbart BigQuery MCP motiverade hela installationskostnaden.
Begränsa agenters verktygstillgång
Ge aldrig autonoma agenter fler verktyg än de behöver. En scraper-fix-agent behöver inte git push-åtkomst. En kodgranskningsagent behöver inte Bash.
Granska allt, lita på inget
Claude producerar korrekt kod ~85% av tiden. De återstående 15% inkluderar subtila buggar som ser korrekta ut vid ytlig inspektion. Behandla AI-output som PR:er från juniora utvecklare.
Spåra API-kostnad per arbetsflöde
Vissa användningsmönster bränner igenom krediter snabbare än de sparar tid. Spåra kostnad per arbetsflöde och avsluta de med låg ROI. Vår veckovisa kodgranskningsagent kostar ~$12/vecka men sparar ~4 timmar.
Minnesfiler ger ackumulerat värde
.claude/memory-filerna ackumulerar projektspecifik kunskap över tid. Efter 3 månader gör Claude sällan ett misstag den har korrigerats för tidigare.
Testa i sandlåda först
Nya agentarbetsflöden körs mot staging-miljöer i minst en vecka innan de rör produktion. Det fångade varje kritiskt fel innan det spelade roll.
Håll människor i loopen för arkitektur
Claude är utmärkt på implementation men bör inte betros med arkitekturbeslut utan mänsklig validering. Använd den för att utforska alternativ, inte för att välja dem.
Resultat och mätvärden
Efter sex månaders produktionsanvändning, här är de konkreta mätvärdena. Dessa spåras via vårt interna verktyg och representerar verkliga projektresultat, inte uppskattningar.
+38%
Ökning utvecklingshastighet
mergade PR:er per sprint
-12%
Förändring buggfrekvens
produktionsincidenter
-45%
Kodgranskningstid
snitt timmar per PR
$340
Månatlig AI-kostnad
alla arbetsflöden
Hastighetsökningen på 38% mäts genom mergade PR:er per tvåveckors-sprint, jämfört med tre månader före Claude Code-antagandet mot tre månader efter. Minskningen av produktionsbuggar på 12% är betydande men svårare att helt tillskriva Claude - vi förbättrade också vår testinfrastruktur under samma period. Minskningen i kodgranskningstid är det mest direkt tillskrivbara mätvärdet: Claude hanterar rutinmässiga stil- och konventionskontroller innan mänskliga granskare ser koden.
“Det verkliga värdet av Claude Code är inte att det skriver kod snabbare. Det är att det eliminerar kostnaden för kontextväxling mellan utforskning och implementation. Du tänker, Claude utforskar, du bestämmer, Claude implementerar. Loopen stramas åt från timmar till minuter.”
- Simon Axelsson
Skulle jag rekommendera Claude Code för produktionsanvändning i företag? Ja, med förbehåll. Det kräver investering i konfiguration (CLAUDE.md, MCP-servrar, minnesfiler), organisatorisk disciplin (kodgranskningsstandarder, agentskyddsräcken) och ärlig redovisning av kostnader kontra nytta. För vårt tremannaingenjörsteam som hanterar infrastruktur för 50+ användare har det varit transformativt. För större team med etablerade processer kan kalkylen se annorlunda ut. Börja smått, mät allt, och skala det som fungerar.
Simon Axelsson
IT-konsult & teknisk rådgivare
Simon Axelsson är senior IT-konsult och grundare av SIAX Technology AB i Stockholm. Han hjälper nordiska företag med molninfrastruktur, dataplattformar och AI-automation. Han har använt Claude Code dagligen sedan oktober 2025 och behandlar AI-assisterad utveckling som en kärnpraxis inom ingenjörskonst, inte ett experiment.