Den komplette guide til at skrive Agent System Prompts — Erfaringer fra reverse-engineering af Claude Code

Jeg dekompilerede Claude Codes system prompt, studerede DeepAgents' kildekode og byggede min egen AI-agent fra bunden. De fleste prompt-guides er ren varm luft.

Feng Liu
Feng Liu
20. mar. 2026¡24 min lÌsning
Den komplette guide til at skrive Agent System Prompts — Erfaringer fra reverse-engineering af Claude Code

Title: Der foregĂĽr en kollektiv vrangforestilling i AI-verdenen lige nu

Content: Der foregĂĽr en kollektiv vrangforestilling i AI-verdenen lige nu.

Hver eneste tutorial fortæller dig, at du skal skrive system-prompts, som om du kaster en trylleformular — du skal bare finde den rigtige besværgelse, så adlyder modellen. "You are an EXTREMELY TALENTED senior engineer with 20 years of experience..." Lyder det bekendt?

Jeg har brugt de sidste par müneder pü at bygge VibeCom, en AI-startup-rüdgiver, der kører dybdegüende markedsundersøgelser og genererer analyser pü VC-niveau. Undervejs har jeg reverse-engineeret Claude Codes system-prompt, lÌst DeepAgents' middleware-kildekode igennem og brÌndt flere API-credits af, end jeg har lyst til at indrømme. Den største lektie? Det meste af det, folk tror er vigtigt ved system-prompts, betyder ingenting. Og de ting, der rent faktisk betyder noget, er der nÌsten ingen, der taler om.

Dette indlæg er den komplette drejebog — ikke et 5-minutters overblik, men alt det, jeg ville ønske, nogen havde fortalt mig, før jeg startede. Hent en kop kaffe.


1. Designfilosofi: Stol pĂĽ modellen

"An agent is a model. Not a framework. Not a prompt chain." — shareAI-lab/learn-claude-code

Denne idé ændrede alt for mig. LLM'en ved allerede, hvordan den skal ræsonnere, planlægge og eksekvere. Din system-prompt lærer den ikke at tænke — den sætter miljøet op, som den skal arbejde i.

TĂŚnk pĂĽ det som at ansĂŚtte en seniorudvikler. Du giver dem ikke en tjekliste pĂĽ 20 trin til hver eneste opgave. Du fortĂŚller dem: Her er hvem vi er, her er grĂŚnserne, og her er, hvordan succes ser ud. Derefter trĂŚder du til side.

Din system-prompt har prĂŚcis fire opgaver:

  • FortĂŚl den, hvem den er — rolle og identitet
  • FortĂŚl den, hvor grĂŚnserne gĂĽr — sikkerhedsbegrĂŚnsninger
  • FortĂŚl den, hvordan succes ser ud — kvalitetsstandarder
  • Giv den vĂŚrktøjer — evner og viden

Det er det. Alt andet er støj.

Harness-tankegangen

Harness = Tools + Knowledge + Observation + Action Interfaces + Permissions

Din system-prompt er brugermanualen til dette "harness" (arbejdsramme). Du designer ikke en rigid pipeline — du designer et miljø, hvor modellen kan udføre sit bedste arbejde autonomt.

Skriv ikke din system-prompt som et rutediagram. Modellen vil selv beslutte eksekveringsrÌkkefølgen.


2. Prompt-struktur og rÌkkefølge af sektioner

Det anbefalede layout (Reverse-engineeret fra Claude Code v2.0.14)

┌─────────────────────────────────────────────┐
│ 1. Identity                                  │  ← Read first, anchors behavior
│ 2. Security & Safety                         │  ← IMPORTANT markers, non-negotiable
│ 3. Tone & Style                              │  ← Controls output format
│ 4. Core Workflow                             │  ← How to do the work
│ 5. Tool Usage Policy                         │  ← Tool selection priorities
│ 6. Domain Knowledge                          │  ← On-demand, not pre-loaded
│ 7. Environment Info                          │  ← Runtime context, dynamically injected
│ 8. Reminders                                 │  ← Re-state critical rules
├─────────────────────────────────────────────┤
│ [Tool Definitions — system-injected]         │  ← Not editable, usually very long
├─────────────────────────────────────────────┤
│ [User Message]                               │
└─────────────────────────────────────────────┘

Hvorfor denne rÌkkefølge er vigtig

LLM'er har en U-formet opmærksomhedskurve — de er mest opmærksomme på starten og slutningen af din prompt, og mister fokus i midten. Dette er den veldokumenterede "Lost in the Middle"-effekt.

  • Identitet + Sikkerhed i toppen: Modellen etablerer rolle og grĂŚnser først (primacy-effekten)
  • Kerne-workflow i den øvre midte: Din vigtigste sektion — hvordan agenten udfører sit arbejde
  • VĂŚrktøjsdefinitioner injiceres af systemet efter din prompt: Claude Codes vĂŚrktøjsdefinitioner ĂŚder ~11.438 tokens. Det betyder, at dit tilpassede indhold faktisk ender tĂŚttere pĂĽ begyndelsen, end du mĂĽske forventer — hvilket hjĂŚlper pĂĽ overholdelsen af reglerne
  • PĂĽmindelser i bunden: Udnyt recency-bias til at forstĂŚrke kritiske regler

3. SĂĽdan skriver du hver sektion

3.1 Identitet — Hvem er denne agent?

MĂĽl: Forankr modellens rolle pĂĽ 1-3 sĂŚtninger.

You are Claude Code, Anthropic's official CLI for Claude.
You are an interactive agent that helps users with software engineering tasks.

Retningslinjer:

  • Hold det kort — maks. 1-3 sĂŚtninger
  • Navngiv rollen eksplicit (hjĂŚlper modellen med at skelne mellem kontekster)
  • Angiv kerneansvaret ("hjĂŚlper med X"), ikke et vagt "du er en hjĂŚlpsom assistent"
  • NĂŚvn SDK/platform, hvis det er relevant ("bygget pĂĽ Anthropics Claude Agent SDK")

Anti-patterns:

  • "You are a helpful, harmless, and honest AI assistant" — for generisk, ingen forankring af rollen
  • Et helt afsnit med baggrundshistorie og "lore" — spilder tokens, modellen har ikke brug for karakterudvikling

3.2 Sikkerhed & Beskyttelse — De hårde grænser

MĂĽl: SĂŚt ubrydelige adfĂŚrdsmĂŚssige begrĂŚnsninger.

IMPORTANT: Assist with defensive security tasks only.
Refuse to create, modify, or improve code that may be used maliciously.
IMPORTANT: You must NEVER generate or guess URLs for the user.

Retningslinjer:

  • Brug IMPORTANT:-prĂŚfikset — Claudes trĂŚning i instruktionshierarki giver dette ekstra vĂŚgt
  • Brug absolut sprog: NEVER, MUST NOT, Refuse to
  • Angiv bĂĽde hvad der er tilladt OG hvad der er forbudt (tosidede begrĂŚnsninger er tydeligere)
  • Placer det helt i toppen, ikke begravet i midten
  • Gentag kritiske sikkerhedsregler til sidst — Claude Code gør prĂŚcis dette

Hvorfor gentage? Primacy-effekt (begyndelsen) + Recency-effekt (slutningen) = dobbelt forstærkning. Claude Codes sikkerhedserklæring optræder både i starten og slutningen af prompten. Ikke fordi ingeniørerne var glemsomme — men fordi de forstår den U-formede opmærksomhedskurve.

3.3 Tone & Stil — Kontrol af output

MĂĽl: Kontroller output-format og stemme.

## Tone and style

- Your responses should be short and concise.
- Only use emojis if the user explicitly requests it.
- Use Github-flavored markdown for formatting.
- NEVER create files unless absolutely necessary.

Retningslinjer:

  • Oplist specifikke adfĂŚrdsmønstre, ikke et vagt "vĂŚr professionel"
  • Hver regel skal kunne testes som sand/falsk ("short and concise" vs. "try to be brief")
  • Inkluder krav til output-format (markdown? JSON? ren tekst?)
  • Inkluder hvad den IKKE skal gøre — mange stilproblemer handler om at forbyde en bestemt adfĂŚrd

Claude Codes genistreg — Professionel objektivitet:

Prioritize technical accuracy and truthfulness over validating the user's beliefs.
Focus on facts and problem-solving, providing direct, objective technical info
without any unnecessary superlatives, praise, or emotional validation.

Dette afsnit er afgørende: Det blokerer modellens tendens til at snakke brugeren efter munden (sycophancy). Hvis din agent skal give objektive vurderinger (code review, evaluering af idÊer, arkitekturbeslutninger), har du absolut brug for en lignende klausul.

3.4 Kerne-workflow — Den vigtigste sektion

Mål: Lær modellen hvordan den skal arbejde — metodologi, ikke rigide procedurer.

Dette er den svÌreste sektion at skrive godt, og den der har størst effekt, nür du rammer rigtigt.

Kerneprincippet: giv principper, ikke procedurer.

Fortæl LLM'en, hvordan et godt output ser ud, og hvorfor det er godt — lad den selv finde ud af, hvordan den når dertil. Undgå at diktere præcise antal felter, sekvenser af trin eller formater, medmindre outputtet skal forbruges af maskiner længere nede i systemet.

Claude Codes tilgang:

## Doing tasks

The user will primarily request software engineering tasks.
For these tasks the following steps are recommended:

- Use the TodoWrite tool to plan the task if required

Læg mærke til ordet "recommended" — ikke "du skal følge disse præcise trin". Det ene ordvalg giver modellen plads til at tilpasse sig.

En god workflow-definition:

1. Understand first — read existing code before modifying it
2. Plan first — break complex tasks into steps before executing
3. Minimal changes — only change what's necessary, don't "refactor while you're in there"
4. Verify — confirm your changes work (run tests, lint, etc.)

Hver regel har et implicit "hvorfor" — modellen kan forstå hensigten og generalisere til nye scenarier.

Anti-patterns:

  • En rigid procedure pĂĽ 20 trin — modellen vil eksekvere mekanisk og fryse ved uventede inputs
  • "Gør først A, gør derefter B, gør derefter C" — det er en prompt-chain, ikke en agent-prompt
  • At over-guide ting, som LLM'en allerede er god til — det spilder tokens

Jeg lÌrte dette pü den hürde müde med VibeCom. Tidlige versioner havde et research-workflow pü 10 trin. Modellen eksekverede pligtopfyldende alle 10 trin, selv nür trin 3 allerede havde besvaret brugerens spørgsmül. Da jeg skiftede til principper ("research indtil du har tilstrÌkkelig evidens, og syntetiser derefter"), steg kvaliteten, og token-omkostningerne faldt.

Undtagelsen: Nür outputtet skal forbruges af maskiner (inter-agent kommunikation, API-responsformater), bør du definere strikse formater. Principper er til adfÌrd; skemaer er til grÌnseflader.

3.5 Politik for brug af værktøjer — Løsning af tvetydighed

Mül: Nür flere vÌrktøjer kan gøre det samme, skal du fortÌlle modellen, hvilket den skal foretrÌkke.

## Tool usage policy

- Use specialized tools instead of bash commands:
  - Read for reading files instead of cat/head/tail
  - Edit for editing instead of sed/awk
  - Grep for searching instead of grep/rg
- You can call multiple tools in a single response. If independent, call in parallel.
- Use the Task tool for file search to reduce context usage.

Retningslinjer:

  • Brug "instead of" for at udtrykke prioritet (A i stedet for B)
  • Forklar hvorfor den skal foretrĂŚkke bestemte vĂŚrktøjer ("giver en bedre brugeroplevelse", "reducerer kontekstforbrug")
  • Definer strategi for parallelisme (uafhĂŚngige → parallel, afhĂŚngige → sekventiel)
  • Oplist sikkerhedsbegrĂŚnsninger for brug af vĂŚrktøjer (validering af stier, rettighedstjek)

Det afgørende forhold mellem vÌrktøjer og prompts:

VÌrktøjsdefinitioner injiceres typisk af systemet, og du kan ikke redigere dem direkte. Claude Codes vÌrktøjsdefinitioner er pü ~11.438 tokens. Det betyder:

  • Gentag ikke information, der allerede findes i vĂŚrktøjsdefinitionerne
  • Brug system-prompten til strategisk vejledning: hvornĂĽr hvert vĂŚrktøj skal bruges, hvorfor man skal foretrĂŚkke ĂŠt frem for et andet, og prioriteringsrĂŚkkefølge
  • Kvaliteten af vĂŚrktøjsdefinitioner pĂĽvirker agentens effektivitet direkte — hvis du bygger din egen agent, sĂĽ invester tid i at skrive fremragende vĂŚrktøjsbeskrivelser

3.6 Domæneviden — Indlæs on-demand, ikke på forhånd

MĂĽl: Giv specialiseret viden, som modellens trĂŚningsdata mĂĽske mangler.

Kerneprincippet: progressiv afsløring, ikke videns-dumps.

❌ Paste all 200 API endpoints into the system prompt → token explosion
✅ Give the model a tool to look things up → "Load knowledge when you need it"

Denne strategi deles af Claude Codes Skills-system og DeepAgents' Progressive Disclosure-middleware. Begge indlÌser viden on-demand via vÌrktøjskald i stedet for at pre-loade alt.

Implementeringstilgange:

  1. LĂŚg pointers i system-prompten: "Use the get_api_docs tool to retrieve documentation when needed"
  2. Brug CLAUDE.md / AGENTS.md til projektkontekst — indlæses ved runtime, hardcodes ikke
  3. Brug Skills / SKILL.md til opdagelse af evner — modellen ser en menu af tilgængelige skills og henter fulde specifikationer on-demand

3.7 Miljø-info — Runtime-kontekst

Mül: Giv modellen bevidsthed om sit eksekveringsmiljø.

<env>
Working directory: /Users/fengliu/Desktop/tfm/vibecom
Is directory a git repo: true
Platform: darwin
Today's date: 2026-03-21
</env>
You are powered by the model named Claude Opus 4.6.

Retningslinjer:

  • Generer dynamisk, hardcode aldrig
  • Inkluder: working directory, platform, dato, modelnavn, git-status
  • Brug struktureret format (XML-tags eller kodeblokke) for nem parsing
  • Dato er vigtig — modellen har brug for at kende "nu" for at vurdere, hvor frisk informationen er

3.8 Påmindelser — Den sidste forstærkning

MĂĽl: Gentag de mest kritiske regler i slutningen af prompten.

Claude Code gentager sin sikkerhedsbegrĂŚnsning og TodoWrite-krav i bunden:

IMPORTANT: Assist with defensive security tasks only. [repeated]
IMPORTANT: Always use the TodoWrite tool to plan and track tasks. [repeated]

Retningslinjer:

  • Gentag kun 2-3 af de mest kritiske regler — dupliker ikke alt
  • Udnyt recency-bias — modellen husker nyligt indhold stĂŚrkere
  • Bedste kandidater: sikkerhedsbegrĂŚnsninger, regler der oftest overtrĂŚdes, pĂĽmindelser om kerne-workflow

4. Token-budget og hĂĽndtering af kontekst

Reference for budgetallokering

SektionAnbefalede TokensNoter
Identitet + Sikkerhed200-500Kortfattet, men ufravigelig
Tone & Stil300-800Regler skal vĂŚre specifikke, men undgĂĽ at ĂŚvle
Kerne-workflow500-2.000Vigtigste sektion, investeringen vĂŚrd
Politik for vÌrktøjer300-1.000AfhÌnger af antallet af vÌrktøjer
DomĂŚneviden0-1.000On-demand indlĂŚsning foretrĂŚkkes
Miljø-info100-300Genereres dynamisk
Pümindelser100-300Gentag kun det absolut nødvendige
Din total1.500-6.000
VÌrktøjsdefinitioner (system)5.000-15.000Ikke under din kontrol

Kurve for kontekst-forfald

Community-tests (Reddit u/CodeMonke_) har kortlagt, hvordan overholdelsen af regler forfalder i den virkelige verden:

  • < 80K tokens: Prompt-overholdelse forbliver stabil
  • 80K - 120K tokens: Evnen til at følge instruktioner begynder at forfalde
  • > 120K tokens: Betydeligt forfald — modellen "glemmer" tidlige instruktioner
  • > 180K tokens: Alvorligt forfald

Dit 200K kontekstvindue ≠ 200K effektiv kontekst. Planlæg derefter.

Strategier til afbødning:

  • Hold din system-prompt slank (< 6.000 tokens for din del)
  • Brug opsummering til at komprimere samtalehistorikken (DeepAgents trigger ved ~80K tegn)
  • Placer kritiske regler i begge ender af prompten (U-formet opmĂŚrksomhed)
  • Injicer <system-reminder>-tags midt i samtalen (mere om dette i sektion 8)

5. Skriveprincipper

5.1 Giv principper, ikke procedurer

❌ "Step 1: Read the file. Step 2: Find the bug. Step 3: Fix it. Step 4: Run tests."
✅ "Always understand existing code before modifying it. Verify your changes work."

Principper generaliserer. Procedurer kan kun følges mekanisk. Nür modellen støder pü en situation, du ikke havde forudset, guider principper den til den rigtige beslutning. Det gør procedurer ikke.

Undtagelse: NĂĽr outputtet forbruges af maskiner (inter-agent kommunikation, API-formater), skal du definere strikse skemaer.

5.2 Brug absolut sprog til hĂĽrde begrĂŚnsninger

StyrkeSprogBrug til
Absolut forbudNEVER, MUST NOTSikkerhed, irreversible operationer
StĂŚrkt kravALWAYS, MUSTRegler for kerne-workflow
Anbefalingrecommended, preferBest practices med undtagelser
Forslagconsider, you mayValgfrie optimeringer

Claude Code eksempler:

  • NEVER update the git config — absolut forbud
  • ALWAYS prefer editing an existing file — stĂŚrkt, men der findes undtagelser
  • The following steps are recommended — foreslĂĽet workflow

5.3 Brug eksempler i stedet for forklaringer

## Code References

When referencing specific functions or pieces of code include
the pattern `file_path:line_number`.

<example>
user: Where are errors from the client handled?
assistant: Clients are marked as failed in the `connectToServer`
function in src/services/process.ts:712.
</example>

Ét eksempel underviser bedre end 100 ords forklaring:

  • Modeller lĂŚrer mønstre fra eksempler mere pĂĽlideligt end fra abstrakte beskrivelser
  • Pak dem ind i <example>-tags for at adskille dem fra reglerne
  • Giv bĂĽde positive ("gør dette") og negative ("gør ikke dette") eksempler
  • Brug rigtige, specifikke eksempler — ikke "foo/bar"-placeholders

5.4 Tosidede begrĂŚnsninger

✅ "Use dedicated tools: Read for reading files, Edit for editing files."
✅ "Do NOT use bash for file operations (cat, head, tail, sed, awk)."

At sige kun "gør dette" → modellen ved ikke, hvornår den IKKE skal gøre det. At sige kun "gør ikke dette" → modellen kender ikke alternativet. Tosidet → klart og utvetydigt.

5.5 Forklar hvorfor, ikke kun hvad

❌ "Don't use git commit --amend."
✅ "Avoid git commit --amend. ONLY use --amend when either
   (1) user explicitly requested amend OR
   (2) adding edits from pre-commit hook.
   Reason: amending may overwrite others' commits."

At forklare hvorfor lader modellen træffe korrekte vurderinger i edge-cases. Claude Codes git-sikkerhedsprotokol er en masterclass — hver regel antyder sin egen begrundelse.

5.6 Struktur frem for prosa

  • Markdown-overskrifter (##, ###) — modeller genkender hierarki
  • Punktopstillinger frem for afsnit — hver regel kan testes uafhĂŚngigt
  • XML-tags til specielt indhold: <example>, <env>, <system-reminder>
  • Tabeller til sammenligninger og mapninger
  • Dump aldrig ustruktureret tekst — strukturerede prompts udkonkurrerer konsekvent naturlig sprogprosa i tests af regeloverholdelse

6. Anti-patterns der spilder dine tokens

Prompt-chains forklĂŚdt som agenter

"First call tool A to get data.
Then call tool B with the result.
Then format the output as JSON.
Then save to file."

Dette er ikke en agent-prompt — det er et pipeline-script. Modellen vil eksekvere mekanisk og miste sin autonome planlægningsevne.

Løsningen: FortÌl modellen mület og begrÌnsningerne. Lad den selv beslutte trinnene.

Smiger-engineering

"You are an EXTREMELY TALENTED and INCREDIBLY EXPERIENCED
senior software engineer with 20 years of experience..."

Komplimenter og superlativer forbedrer ikke output-kvaliteten. Modellen har ikke et ego, der skal boostes. Gem de 15 tokens til en rigtig regel.

Videns-dumps

"Here is the complete API documentation for our 200 endpoints..."

Dette ĂŚder dit kontekstvindue og fremskynder kontekst-forfald. Erstat med on-demand indlĂŚsning:

"Use the get_api_docs tool to retrieve API documentation when needed."

Gentagelse af vÌrktøjsbeskrivelser

Hvis værktøjsdefinitionen allerede siger "Read tool reads a file from the filesystem", så sig det ikke igen i din system-prompt. Tilføj kun strategisk vejledning, som værktøjsdefinitionen ikke dækker — hvornår det skal bruges, hvorfor det skal foretrækkes, prioriteringsrækkefølge.

Manglende hĂĽndtering af fejl

Uden eksplicit vejledning vil modeller forsøge at genkalde fejlede vÌrktøjskald i et uendeligt loop. Inkluder altid:

"If a tool call is denied, do not re-attempt the exact same call.
Think about why it was denied and adjust your approach."

Ignorering af kontekstvinduets forfald

200K kontekstvindue ≠ 200K effektiv kontekst. Tests i den virkelige verden viser, at forfaldet starter ved 80K. Du har brug for en strategi for opsummering.


7. Injektionspunkter og prioritet

Claude Codes tre metoder til tilpasning

MetodeErstatterPlaceringBedst til
Output Styles"Tone and style" + "Doing tasks" sektionerneLige før værktøjsdefinitionerÆndring af interaktionsstil
--append-system-promptIngenting (additiv)Efter output style, før vÌrktøjsdefinitionerTilføjelse af specifik adfÌrd
--system-promptHele system-promptenBeholder vÌrktøjsdefinitioner + Ên identitetslinjeFuld tilpasning (den drastiske løsning)

Hvis du bruger flere: Output Style → Append Prompt → Tool Definitions

Instruktionshierarki

Claude er specifikt trĂŚnet med et instruktionshierarki:

1. User's explicit instructions (CLAUDE.md, direct requests)  ← Highest priority
2. Custom system prompt additions                               ← High
3. Default system prompt                                        ← Medium
4. Tool definitions                                             ← Reference level

Det betyder:

  • CLAUDE.md-regler overskriver standard system-prompt-adfĂŚrd
  • Brugerens direkte anmodninger overskriver alt
  • Din tilpassede prompt overskriver standard-prompten

Dynamiske injektionsmekanismer

  • <system-reminder> — injicer i enhver besked midt i samtalen for at minde modellen om kritiske regler
  • CLAUDE.md / AGENTS.md — indlĂŚses ved runtime fra filer, tilføjes til system-prompten
  • Skills / SKILL.md — indlĂŚses on-demand via vĂŚrktøjskald, nul fodaftryk i system-prompten

8. Injektion midt i samtalen — Det hemmelige våben

System-prompten optrÌder kun Ên gang, helt i starten af besked-arrayet. Men LLM'er accepterer hele besked-arrayet (skiftevis bruger / assistent / vÌrktøjsbeskeder) som input, og du kan ogsü injicere prompts i brugermeddelelser og vÌrktøjsresultater. Claude Code bruger denne teknik flittigt i produktion.

Hvorfor det er nødvendigt

Kampen mod kontekst-forfald. EfterhĂĽnden som samtaler bliver lĂŚngere, forfalder modellens overholdelse af system-promptens instruktioner (mĂŚrkbart ved 80K+ tokens). At injicere pĂĽmindelser midt i samtalen = opfriskning af reglerne via recency-bias.

Den mentale model:

  • System-prompt = grundloven (etableres ĂŠn gang, langsigtet autoritet)
  • Brugermeddelelses-pĂĽmindelser = memos (sendes periodisk, opretholder hĂĽndhĂŚvelsen)

Tre injektionspunkter i besked-arrayet

Messages Array:
┌─────────────────────────────────────┐
│ System Prompt                       │ ← Appears once, primacy effect
│   (identity, safety, workflow...)   │
├─────────────────────────────────────┤
│ User Message 1                      │
│ Assistant Message 1                 │
│ User Message 2 + <system-reminder>  │ ← Mid-conversation injection
│ Assistant Message 2                 │
│ Tool Result + <system-reminder>     │ ← Can inject into tool results too
│ ...                                 │
│ User Message N + <system-reminder>  │ ← Latest message, strongest recency
└─────────────────────────────────────┘
PlaceringFordelUlempe
System-promptPrimacy-effekt, lÌses førstOptrÌder Ên gang, "glemmes" i lange samtaler
Brugermeddelelses-injektionRecency-bias, periodisk opfriskningHver injektion koster tokens
VÌrktøjsresultat-injektionMest naturlige injektionspunktVirker kun, nür vÌrktøjer kaldes

Hvordan Claude Code rent faktisk bruger det

Forudsætning — deklarer tags i system-prompten:

Tool results and user messages may include <system-reminder> tags.
<system-reminder> tags contain useful information and reminders.
They are automatically added by the system, and bear no direct
relation to the specific tool results or user messages in which they appear.

Dette trin er kritisk: Det fortĂŚller modellen, at disse tags er system-injicerede, ikke brugerens tale.

Brug 1: AdfĂŚrdsmĂŚssige pĂĽmindelser (periodisk opfriskning af regler)

<system-reminder>
The task tools haven't been used recently. If you're working on tasks
that would benefit from tracking progress, consider using TaskCreate...
</system-reminder>

Claude Code bruger dette til at minde modellen om at planlægge med TodoWrite — fordi modeller har en tendens til at "glemme" planlægning og bare begynde at kode.

Brug 2: Skift af tilstand (Plan Mode)

<system-reminder>
Plan mode is active. The user indicated that they do not want you to
execute yet -- you MUST NOT make any edits, run any non-readonly tools,
or otherwise make any changes to the system.
</system-reminder>

Plan mode er ikke implementeret i system-prompten. Det er et tag, der injiceres i den nĂŚste brugermeddelelse. Dette lader dig skifte tilstande dynamisk uden at ĂŚndre system-prompten. Genialt.

Brug 3: Notifikationer om filĂŚndringer

<system-reminder>
Note: /path/to/file.ts was modified, either by the user or by a linter.
This change was intentional, so make sure to take it into account.
</system-reminder>

Når en ekstern proces (linter, formatter, manuel redigering) ændrer en fil, giver systemet modellen besked via en påmindelse — hvilket forhindrer beslutninger baseret på forældet filindhold.

Brug 4: Dynamisk kontekst (datoer, projektregler)

<system-reminder>
Today's date is 2026-03-21.
Current branch: dev
claudeMd: [CLAUDE.md content injected here]
</system-reminder>

Runtime-kontekst (dato, git-status, projektregler) injiceres via brugermeddelelser, ikke hardcodet i system-prompten.

Retningslinjer for at skrive pĂĽmindelser

  • Pak ind i XML-tags (<system-reminder>) — modellen kan skelne systeminjektion fra brugertale
  • ForhĂĽndsdeklarer tags i system-prompten — ellers kan modellen forsøge at svare pĂĽ pĂĽmindelsen
  • Injicer ikke i hver besked — hver injektion koster tokens, injicer kun nĂĽr det er nødvendigt
  • Hold det kort — en pĂĽmindelse er ikke en system-prompt nummer to, bare 1-2 kritiske regler
  • Modsig ikke system-prompten — pĂĽmindelser supplerer og forstĂŚrker, de overskriver ikke
  • Brug til dynamisk skift — plan mode, readonly mode, feature flags

HvornĂĽr skal man bruge System-prompt vs. Brugermeddelelses-pĂĽmindelse

ScenarieSystem-promptBrugermeddelelses-pĂĽmindelse
Rolledefinition✅❌
Sikkerhedsbegrænsninger✅ Første deklaration✅ Periodisk gentagelse
Workflow-metodologi✅❌
Skift af tilstand (plan mode)❌✅
Notifikationer om filændringer❌✅
Dato / miljø-info✅ Startværdi✅ Opdateret værdi
Adfærdskorrektion❌✅
Påmindelser om brug af værktøjer✅ Regeldefinition✅ Eksekverings-nudges

9. Prompt Cache — Spar 90% på gentagne tokens

Anthropics prompt-caching lader dig cache det statiske præfiks af dit besked-array. Når efterfølgende anmodninger deler det samme præfiks, rammer de cachen — hvilket sparer penge og reducerer latency.

For agenter betyder dette utrolig meget: Du gensender system-prompten + vÌrktøjsdefinitionerne ved hvert eneste LLM-kald inden for en samtale.

Nøgletal

MetrikVĂŚrdi
Pris for cache hit10% af normal pris (90% besparelse)
Pris for cache write125% af normal pris (25% premium pü første skrivning)
Cache TTL5 minutter (udløber hvis ingen anmodninger)
Minimum cachebar lĂŚngde1.024 tokens (Claude 3.5+)
Cache-granularitetPræfiks-matching — fra starten til et markeret breakpoint
Maksimum breakpoints4

Hvordan dette ĂŚndrer prompt-design

Kerneprincip: statisk indhold først, dynamisk indhold sidst.

✅ Cache-friendly layout:
  System prompt (static)      ← Cache breakpoint 1
  Tool definitions (static)   ← Cache breakpoint 2
  CLAUDE.md / project rules   ← Cache breakpoint 3 (changes occasionally)
  Conversation history         ← Breakpoint 4 for rolling window

❌ Cache-destroying layout:
  System prompt
  DYNAMIC TIMESTAMP            ← Changes every request, everything after = cache miss
  Tool definitions
  Conversation history

Fælden, ingen advarer dig imod: Hvis du placerer et dynamisk tidsstempel midt i din system-prompt, bliver alt efter det til et cache miss. Hver. Eneste. Anmodning. Ét tidsstempel på det forkerte sted, og du betaler fuld pris for tusindvis af tokens.

API-brug

const response = await anthropic.messages.create({
  model: "claude-sonnet-4-6",
  system: [
    {
      type: "text",
      text: "You are a startup advisor...",
      cache_control: { type: "ephemeral" }  // ← marks a cache breakpoint
    }
  ],
  messages: [...]
});

Multi-Breakpoint Strategi

Breakpoint 1: System prompt           ← Almost never changes
Breakpoint 2: Tool definitions         ← Almost never changes
Breakpoint 3: Project rules / CLAUDE.md ← Changes occasionally
Breakpoint 4: First N history messages  ← Rolling window cache

Selv nür samtalehistorikken Ìndrer sig, rammer de første 3 breakpoints stadig. En samtale pü 10 ture sparer groft sagt 40-60% pü input-token-omkostninger.

Designanbefalinger

  • Ingen højfrekvente dynamiske vĂŚrdier i system-prompten — dato er fint (ĂŚndres dagligt), prĂŚcise tidsstempler er ikke
  • LĂŚg dynamisk kontekst (git-status osv.) i brugermeddelelses-injektioner — ikke i system-prompten, ellers ødelĂŚgger du cachen
  • Hold vĂŚrktøjsdefinitioner stabile — tilføj/fjern ikke vĂŚrktøjer dynamisk ved runtime
  • Brug rullende vindue til samtalehistorik — cache de første N beskeder, kun den nyeste besked er et cache miss

10. Tjeklisten

NĂĽr du har skrevet din system-prompt, sĂĽ gennemgĂĽ den med denne tjekliste:

Struktur

  • Er identiteten helt i toppen?
  • Er sikkerhedsbegrĂŚnsninger markeret med IMPORTANT og gentaget til sidst?
  • Er der klar adskillelse af sektioner med overskrifter?
  • Er eksempler pakket ind i <example>-tags?

Token-budget

  • Er din del < 6.000 tokens?
  • UndgĂĽr du at gentage information, der allerede findes i vĂŚrktøjsdefinitionerne?
  • IndlĂŚses domĂŚneviden on-demand i stedet for at vĂŚre pre-loaded?
  • Er der ingen overflødig "lore" eller baggrundshistorie for karakteren?

Regelkvalitet

  • Kan hver regel testes som sand/falsk?
  • Bruger hĂĽrde begrĂŚnsninger absolut sprog (NEVER/MUST)?
  • Bruger bløde forslag anbefalingssprog (recommended/prefer)?
  • Forklarer kritiske regler hvorfor, ikke kun hvad?
  • Er der tosidede begrĂŚnsninger (gør dette + gør ikke det der)?

Agent-adfĂŚrd

  • Er der givet principper, ikke rigide trin-for-trin procedurer?
  • Er scenariet "vĂŚrktøjskald afvist" hĂĽndteret?
  • Er strategien for "stødt pĂĽ forhindring" hĂĽndteret (undgĂĽ brute-force retries)?
  • Er der en strategi for hĂĽndtering af kontekst pĂĽ plads (tĂŚrskel for opsummering)?

Hvad du IKKE skal gøre

  • Ingen smiger eller superlative adjektiver?
  • Ingen overflødige "du er en hjĂŚlpsom AI"-deklarationer?
  • Ikke skrevet som en prompt-chain?
  • Ingen over-engineering (features ingen har bedt om)?

Hvis jeg startede forfra i dag

Her er prÌcis, hvad jeg ville gøre:

  1. Start med identitet + sikkerhed i de første 3 linjer. To sÌtninger om, hvem agenten er. Hürde begrÌnsninger med NEVER/MUST. Gentag sikkerhedsreglerne til sidst.

  2. Skriv dit kerne-workflow som principper, ikke trin. Maks. 4-5 punkter. Brug "recommended" og "prefer" til bløde regler, "NEVER" og "MUST" til hürde.

  3. Budgetter 1.500-6.000 tokens til din del. VÌrktøjsdefinitioner vil tilføje 5.000-15.000 mere. Hvis du er over 6K, dumper du sandsynligvis viden, der burde indlÌses on-demand.

  4. Strukturer alt. Markdown-overskrifter, punktopstillinger, XML-tags til eksempler. En struktureret prompt udkonkurrerer naturlig sprogprosa hver gang.

  5. Indbyg pĂĽmindelser midt i samtalen fra dag ĂŠt. Deklarer <system-reminder> i din system-prompt. Injicer pĂĽmindelser for kritiske regler, tilstandsskift og kontekstopdateringer.

  6. Design til cache. Statisk indhold først, dynamisk indhold sidst. Placer aldrig skiftende vÌrdier i selve din system-prompt.


Det ironiske ved alt dette arbejde? De bedste system-prompts er korte. Claude Codes tilpassede instruktioner (eksklusive vÌrktøjsdefinitioner) er overraskende kortfattede. Hver linje gør sig fortjent til sin plads.

Jeg troede engang, at prompt-engineering handlede om at finde smarte tricks. Nu tror jeg, det handler om disciplin — at sige mindre, sige det præcist, og stole på, at modellen finder ud af resten. Modellen er klogere end din prompt. Design miljøet, ikke adfærden.


Referencer

KildeNøgleindsigt
Claude Code v2.0.14 System PromptFuld reference til struktur af en produktions-agent-prompt
Reddit: Understanding Claude Code's 3 System Prompt MethodsDybdegĂĽende kig pĂĽ Output Styles / --append / --system-prompt, data fra den virkelige verden om kontekst-forfald
shareAI-lab/learn-claude-code"Modellen er agenten"-filosofien, metodologi for harness-engineering
Anthropic Prompt Engineering DocsOfficielle best practices for prompts
DeepAgents FrameworkMiddleware til opsummering, progressiv afsløring af skills
ai agent system promptsprompt engineering guideclaude code system promptbuilding ai agentsllm prompt optimization

Del dette

Feng Liu

Skrevet af Feng Liu

shenjian8628@gmail.com

Den komplette guide til at skrive Agent System Prompts — Erfaringer fra reverse-engineering af Claude Code | Feng Liu