Agentisk AI og harnesses: to formiddage

Mandag 31. august og tirsdag 1. september 2026 · kl. 8 til 12 begge dage · dansk tekst, engelske fagbegreber

Forløbets to mål: (1) du kan forklare præcist hvad en harness er, hvad den indeholder, og hvorfor den i 2026 driver mere af agenters ydelse end selve modellen. (2) Du har selv bygget og kørt en agentisk pipeline end-to-end: opgave ind, agentløkke med værktøjer, verifikation, artefakt ud, plus en lille evaluering ovenpå. Snittet mellem dagene er lagt så hver formiddag står på egne ben: mandag er begreb og selvbyg, tirsdag er produktionsharness, evaluering og konsolidering.

Planen bygger videre på din agentic-ai-wiki. Wikiens lagmodel i syntheses/agentisk-vaerktoejslandskab dækker allerede orkestrering (LangGraph, Claude Agent SDK), adgang (MCP, A2A), viden (RAG), kontrol og måling (guardrails, tracing, evaluering) samt kørsel (vLLM). Det wikien endnu ikke har en side om, er selve harness-begrebet, som binder lagene sammen. Forløbet slutter derfor tirsdag med at du skriver den side selv.

Den centrale idé: Agent = Model + Harness

En sprogmodel er tilstandsløs og producerer kun tekst. Alt der gør den til en agent, dvs. i stand til at handle over mange skridt, ligger i softwaren omkring den: løkken, værktøjerne, konteksthåndteringen, rettighederne, verifikationen og sporbarheden. Den samlede infrastruktur kaldes en harness, og formlen Agent = Model + Harness er i 2026 blevet feltets standarddefinition. Pointen med hele forløbet: to agenter på samme model kan opføre sig vidt forskelligt, alene på grund af harnessen.

HARNESS MODEL ræsonnerer, vælger næste skridt Agentløkken foreslå, udfør, observér Værktøjer & MCP filer, shell, API'er Kontekst & hukommelse compaction, noter, subagents Guardrails & rettigheder sandbox, godkendelser Verifikation & feedback Tracing & evaluering
Figur 1. Harnessen er alt uden om modellen. Modellen leverer ræsonnementet; harnessen leverer handling, tilstand, grænser og måling.

Hvorfor lige nu

Begrebet krystalliserede i februar 2026: Mitchell Hashimoto beskrev vanen med at ombygge agentens miljø hver gang den fejler, så samme fejl ikke kan gentages, og få dage senere fulgte OpenAI, Anthropic og Martin Fowler-siden med hver deres udlægning. Effekten er målbar: Vercel fjernede 80 % af agentens værktøjer og så succesraten stige fra 80 til 100 % med halveret tokenforbrug; LangChains coding agent gik fra bund til top 5 på Terminal-Bench 2.0 alene på harness-ændringer; og CORE-Bench målte samme model til 42 % med ét scaffold og 78 % med et andet. Prompt engineering optimerer én tur, context engineering styrer hvad modellen ser, og harness engineering designer det miljø agenten opererer i. Det er tredje lag der er forløbets emne.

HARNESS ENGINEERING (2026) miljøet: værktøjer, grænser, verifikation, feedbackløkker CONTEXT ENGINEERING (2025) hvad modellen ser: retrieval, compaction, hukommelse PROMPT ENGINEERING (2023) hvad du siger: én tur, ét svar
Figur 2. Tre lag af agent-engineering. De konkurrerer ikke; de er en progression, og de to inderste lag er delmængder af harnessen.

De to formiddage

Mandag 31. august: begreb og selvbyg

TidBlokMateriale
08.001. Fundament: hvad er en agent, og hvornår er den det rigtige valgVideo 1 (15 min) + artikel [1]
08.452. Harness-begrebet: læsning og video[3], [5], [6], [7] + video 2 (22 min)
10.00Pause
10.153. Lab 1: byg en minimal harness i ren PythonKode nedenfor + [9] som følgetekst
11.45Opsamling: notér harness-komponenter og observationerBruges tirsdag i blok 6

Tirsdag 1. september: pipeline, evaluering og konsolidering

TidBlokMateriale
08.004. Lab 2: end-to-end pipeline med Claude Agent SDKQuickstart [10] + skitse nedenfor + video 4 som opslagsværk
10.00Pause
10.155. Lab 3: evaluering og tracing af pipelinenWiki: methods/agent-evaluering + mini-eval nedenfor
11.156. Konsolidering: skriv wikiens harness-sideDin agentic-ai-wiki + Narayanan [21]

Mellem de to formiddage, valgfrit: Lopopolo-talken [16] som aftenvideo mandag, og perspektivboksen om Narayanans konfigurationer nedenfor som fem minutters læsning inden tirsdag.

Forudsætninger (10 min aftenen før eller først mandag morgen): Python 3.11+, en ANTHROPIC_API_KEY i miljøet, en tom projektmappe, pip install anthropic claude-agent-sdk. Regn med et par dollars i API-forbrug for begge formiddage tilsammen. Kør labs i en mappe (eller container) du ikke er øm over; Lab 1 giver bevidst agenten shell-adgang uden sikkerhedsnet, fordi netop det problem er en af øvelserne.

Blok 1 (mandag, 45 min): Fundament

Se Barry Zhangs talk fra AI Engineer Summit [2] og skim Anthropics Building Effective Agents [1]. Det vigtigste at tage med: skellet mellem workflows (foruddefinerede kodeveje med LLM-kald i) og agents (modellen styrer selv sin proces og værktøjsbrug ud fra feedback fra miljøet), og rådet om at bruge agenter dér hvor opgaven er for åben til et workflow, ikke som default. Det matcher din wikis pointe om at LangGraph tegner forløbet eksplicit, mens agent-tilgangen giver modellen en computer.

Blok 2 (mandag, 75 min): Harness-begrebet

Læs i denne rækkefølge: Hashimotos oprindelsestekst [3] (kort, personlig, giver princippet), Böckelers analyse på martinfowler.com [5] (den mest strukturerede: indre vs. ydre harness, guides vs. sensorer), og LangChains anatomi af en harness [6] (komponentlisten set fra et frameworkhold). Slut med Wikipedia-artiklen [7] som opsummering. Se derefter videoen Harness Engineering Explained in 22 Minutes [17]. Notér undervejs, med figur 1 som skabelon, hvilke komponenter hver kilde nævner; du skal bruge noterne tirsdag i blok 6.

Blok 3 (mandag, 90 min): Lab 1, en minimal harness i ren Python

Thorsten Balls klassiker [9] viste at en fungerende kodeagent er "an LLM, a loop, and enough tokens", under 400 linjer. Her er en dansk minimudgave (ca. 70 linjer) mod Anthropics Messages API. Skriv den selv af, linje for linje; det er dér forståelsen sætter sig.

# minimal_harness.py        pip install anthropic
import subprocess, pathlib, json
import anthropic

client = anthropic.Anthropic()          # ANTHROPIC_API_KEY i miljøet
MODEL = "claude-sonnet-5"               # udskift evt. med nyeste model
WORKDIR = pathlib.Path("workspace").resolve()

TOOLS = [
  {"name": "list_files", "description": "List alle filer i arbejdsmappen.",
   "input_schema": {"type": "object", "properties": {}, "required": []}},
  {"name": "read_file", "description": "Læs en tekstfil.",
   "input_schema": {"type": "object",
     "properties": {"path": {"type": "string"}}, "required": ["path"]}},
  {"name": "write_file", "description": "Skriv tekst til en fil (overskriver).",
   "input_schema": {"type": "object",
     "properties": {"path": {"type": "string"}, "content": {"type": "string"}},
     "required": ["path", "content"]}},
  {"name": "run_bash", "description": "Kør en bash-kommando i arbejdsmappen.",
   "input_schema": {"type": "object",
     "properties": {"command": {"type": "string"}}, "required": ["command"]}},
]

def execute(name, args):
    try:
        if name == "list_files":
            return "\n".join(str(p.relative_to(WORKDIR))
                             for p in WORKDIR.rglob("*") if p.is_file()) or "(tom)"
        if name == "read_file":
            return (WORKDIR / args["path"]).read_text()
        if name == "write_file":
            p = WORKDIR / args["path"]
            p.parent.mkdir(parents=True, exist_ok=True)
            p.write_text(args["content"])
            return f"skrev {args['path']}"
        if name == "run_bash":
            r = subprocess.run(args["command"], shell=True, cwd=WORKDIR,
                               capture_output=True, text=True, timeout=60)
            return (r.stdout + r.stderr)[-4000:] or "(intet output)"
        return f"ukendt værktøj: {name}"
    except Exception as e:
        return f"FEJL: {e}"    # fejlen sendes tilbage til modellen, intet crash

def agent(task):
    messages = [{"role": "user", "content": task}]
    while True:                              # selve agentløkken
        resp = client.messages.create(
            model=MODEL, max_tokens=4096,
            system="Du er en agent i mappen ./workspace. "
                   "Løs opgaven med værktøjerne, og stop når den er løst.",
            tools=TOOLS, messages=messages)
        messages.append({"role": "assistant", "content": resp.content})
        if resp.stop_reason != "tool_use":   # modellen er færdig
            return "".join(b.text for b in resp.content if b.type == "text")
        results = []
        for block in resp.content:
            if block.type == "tool_use":
                print("->", block.name,
                      json.dumps(block.input, ensure_ascii=False)[:120])
                results.append({"type": "tool_result", "tool_use_id": block.id,
                                "content": execute(block.name, block.input)})
        messages.append({"role": "user", "content": results})

if __name__ == "__main__":
    WORKDIR.mkdir(exist_ok=True)
    print(agent("Undersøg workspace og skriv en kort README.md om indholdet."))

Udvidelsesøvelser (vælg mindst to; hver enkelt er et harness-greb du netop har læst om):

  1. Guardrail: afvis stier uden for WORKDIR (path traversal) og kræv tastet godkendelse før run_bash. Det er en computational guide i Böckelers terminologi.
  2. Trajektorielog: skriv hvert værktøjskald og resultat som JSONL. Det er din tracing, og råstoffet til Lab 3.
  3. Context management: når samtalen runder fx 50 beskeder, så komprimér de ældste til et resumé med et ekstra modelkald (compaction).
  4. Ydre harness: læg en AGENTS.md med regler i workspace og injicér den i systemprompten. Mærk forskellen på agentens adfærd.

Blok 4 (tirsdag, 120 min): Lab 2, end-to-end pipeline med Claude Agent SDK

Nu skifter du fra selvbygget harness til en produktionsharness: Claude Agent SDK er samme harness som driver Claude Code, jf. din wikiside frameworks/claude-agent-sdk. Følg quickstart i dokumentationen [10]; brug workshoppen [11] som opslagsvideo hvis du sidder fast. Målet er en pipeline: rå data ind, agent med både indbyggede og egne værktøjer, verifikation, rapport ud.

  1. Læg 2-3 CSV-filer med lidt rodede data i ./workspace/data/ (generér dem evt. med Lab 1-agenten).
  2. Kør en query() med indbyggede fil- og bashværktøjer, der skal analysere data og skrive rapport.md.
  3. Tilføj et eget værktøj via en in-process MCP-server, fx et opslag mod et "internt system". Skitse (tjek quickstart hvis signaturen har flyttet sig siden):
# pipeline.py               pip install claude-agent-sdk
import anyio
from claude_agent_sdk import (query, ClaudeAgentOptions,
                              tool, create_sdk_mcp_server)

@tool("hent_kpi", "Henter en KPI fra det interne system", {"navn": str})
async def hent_kpi(args):
    return {"content": [{"type": "text",
                         "text": f"{args['navn']}: 42,3 (uge 35)"}]}

server = create_sdk_mcp_server(name="internt", version="1.0.0",
                               tools=[hent_kpi])

options = ClaudeAgentOptions(
    cwd="./workspace",
    mcp_servers={"internt": server},
    allowed_tools=["Read", "Write", "Glob", "Bash",
                   "mcp__internt__hent_kpi"],
    permission_mode="acceptEdits",
)

async def main():
    async for msg in query(
        prompt="Analysér data/*.csv, hent KPI'en 'churn', og skriv "
               "rapport.md med fund, tal og anbefalinger.",
        options=options):
        print(msg)

anyio.run(main)
  1. Tilføj en hook der logger (eller blokerer) værktøjskald, og prøv en subagent til et af deltrinnene: bemærk hvordan subagenten isolerer kontekst, præcis som wikisiden beskriver.
  2. Hjemmebane-varianten: du driver allerede rigtige MCP-servere (LLM-WIKI, Slowcommand, Planner). Kobl én af dem på som ekstern MCP-server i mcp_servers, og lad pipelinen arbejde mod et rigtigt system i stedet for dummy-KPI'en.
  3. Vil du se det leverandørneutrale modstykke, så genbesøg wikisiden frameworks/langgraph og LangGraph-oversigten [20]: samme løkke, men tegnet som graf med checkpoints og interrupts.
Opgave + data Harness løkke · model · kontekst værktøjer & MCP · guardrails subagents · hooks Verifikation tests, judge Artefakt Tracing (JSONL, spans) hvert model- og værktøjskald Eval-suite fejl bliver testtilfælde retry ved fejl
Figur 3. Tirsdagens leverance: pipelinen end-to-end. De stiplede pile er feedbackløkkerne: verifikation kan udløse retry, og traces bliver til nye eval-tilfælde.

Blok 5 (tirsdag, 60 min): Lab 3, evaluering og tracing

Genlæs din wikiside methods/agent-evaluering og dens fire niveauer: komponent, trajektorie, resultat, drift. Byg så den mindste eval der overhovedet giver mening for pipelinen fra Lab 2: kør samme opgave 5 gange (husk wikiens pointe om at temperatur 0 kun skjuler variansen), og tjek deterministiske kriterier plus simple trajektoriemål fra din JSONL-log:

​# mini_eval.py: kør pipelinen N gange og saml resultater
import pathlib
W = pathlib.Path("workspace")
CHECKS = [
    ("rapport.md findes",  lambda: (W/"rapport.md").exists()),
    ("nævner churn",       lambda: "churn" in
                                   (W/"rapport.md").read_text().lower()),
    ("har et talafsnit",   lambda: any(c.isdigit() for c in
                                   (W/"rapport.md").read_text())),
]
# trajektorie: antal værktøjskald, vægtid og fejl pr. kørsel fra JSONL-loggen

Notér spredningen mellem kørslerne. Det er den asymmetri wikiens syntese kalder feltets svageste punkt: modne værktøjer til at bygge, umodne til at afgøre om det blev bedre. Til produktion peger materialet på regressionssuiter der køres ved hver prompt- eller harnessændring, og på at fejl vægtes efter alvor frem for tælles.

Perspektiv til blok 6 (læs evt. allerede mandag aften): konfigurationen bestemmer harnessen. Næsten alt forløbets materiale (Hashimoto, OpenAI, Claude Code, dine labs) antager stiltiende én situation: en person eller et firma delegerer arbejde til en agent og tjekker resultatet. Arvind Narayanan argumenterer i et opslag fra august 2026 [21] for at det kun er en af mindst 11 konfigurationer af firma, medarbejder(e) og agent, som hver kræver sit eget agent- og harnessdesign: delegation, automation af eksisterende og af nyt arbejde, augmentation af eksisterende og ind i nyt arbejde, agenten som teammate med egen linje til ledelsen, ambient agent der observerer hele arbejdspladsen, algorithmic management hvor agenten står mellem firma og medarbejder, portable human capital (medarbejderens egen opkvalificeringsagent uden arbejdsgiver i billedet), mediation/kollektiv intelligens, og exception handling hvor agenten eskalerer det den ikke kan. Hans kritik: industrien overindekserer på automation og delegation, måler på autonomimetrikker som time horizon, ignorerer collaboration skill som egenskab, og behandler mennesket som flaskehalsen. Harnessdesign bør i stedet behandles som åbne forskningsproblemer der kræver HCI og organisationsadfærd, ikke kun maskinlæring [21][22]. Tag det med ind i blok 6: notér for hver af forløbets kilder hvilken konfiguration dens harness egentlig antager.

Blok 6 (tirsdag, 45 min): Konsolidering, skriv harness-siden

Afslut med Feynman-metoden: skriv concepts/harness.md i agentic-ai-wikien med egne ord, ud fra begge dages noter. Forslag til disposition: definition og formlen; anatomien (figur 1-komponenterne); indre vs. ydre harness; forholdet til prompt- og context engineering; hvilken firm/worker/agent-konfiguration harnessen antager [21]; hvorfor det flytter mere end modelvalg (tallene fra [8]); kilder. Overvej samtidig om syntesens lagdiagram skal have harnessen tegnet ind som det bindende lag. Når siden er skrevet, har forløbet sat sig.

Selvtest ved forløbets slutning

Nøglebegreber

Agent vs. workflow
Workflows er foruddefinerede kodeveje med LLM-kald indlejret; agents er systemer hvor modellen selv dirigerer sin proces og værktøjsbrug ud fra feedback fra miljøet. Byg det simpleste der løser opgaven, og grib kun til agenter hvor opgaven er for åben til et workflow. Kilde: Anthropic, Building Effective Agents [1]. Wiki: syntheses/agentisk-vaerktoejslandskab.
Harness
Softwareinfrastrukturen omkring modellen, der forvalter værktøjsbrug, hukommelse, tilstand, kørselsmiljø og feedbackløkker, alt undtagen selve ræsonnementet. Sammenfattes som Agent = Model + Harness. Kilde: Wikipedia, Agent harness [7].
Harness engineering
Disciplinen: hver gang agenten fejler, ændres miljøet så netop den fejl bliver strukturelt sværere at gentage. Navngivet af Mitchell Hashimoto i februar 2026 og straks fulgt op af OpenAI's praksisrapport om agent-first udvikling. Kilder: Hashimoto [3], OpenAI [4].
Indre og ydre harness; guides og sensorer
Böckeler skelner mellem den indre harness (leverandørens agentprodukt eller SDK) og den ydre (det du selv lægger ovenpå: instruktionsfiler, MCP-servere, skills), og mellem guides (styrer agenten før handling) og sensorer (observerer resultatet så den kan selvkorrigere), hver i en computational og en inferentiel variant. Kilde: martinfowler.com [5].
Agentløkken (ReAct-mønstret)
Modellen foreslår næste handling, harnessen udfører den, resultatet lægges tilbage i konteksten, og løkken gentages til et stopkriterium. Hele Lab 1 er denne løkke; din wikiside frameworks/langgraph viser samme løkke tegnet som eksplicit graf. Kilde: Ball, How to Build an Agent [9].
Tool use og værktøjsdesign
Værktøjers navne, skemaer og svar er en del af modellens kontekst og skal designes derefter: utvetydige parametre, tokenøkonomiske svar, fejlmeddelelser der anviser næste skridt. Færre, bedre værktøjer slår mange; det var kernen i Vercel-casen. Kilder: Anthropic, Writing effective tools [13], MongoDB [8].
Context engineering
Kuratering af det begrænsede kontekstvindue over mange ture: just-in-time indlæsning via referencer frem for alt på forhånd, compaction af historik, notatfiler, og subagents som kontekstisolering. Kilde: Anthropic, Effective context engineering [14].
Model Context Protocol (MCP)
Åben standard for hvordan modeller når værktøjer og data; branchestandard siden 2025 og må ikke forveksles med A2A, der handler om delegering mellem agenter. I Lab 2 bruger du både en in-process server og dine egne kørende servere. Kilde: modelcontextprotocol.io [15]. Wiki: frameworks/model-context-protocol.
Guardrails og human-in-the-loop
Grænser for hvad agenten må (rettigheder, sandbox, tilladelseslister) og definerede punkter hvor et menneske godkender. I moderne harnesses er det sprogtræk: hooks i Claude Agent SDK, interrupts i LangGraph. Nødvendigt fordi giv agenten en computer ellers er et åbent privilegie. Kilde: Anthropic, Effective harnesses for long-running agents [12]. Wiki: concepts/guardrails-og-human-in-the-loop.
Firm/worker/agent-konfigurationer
Narayanans taksonomi over mindst 11 måder firma, medarbejder(e) og agent kan være koblet på, fra delegation og automation over teammate, ambient agent og algorithmic management til mediation og exception handling. Pointen er at automation- og collaboration-agenter skal designes forskelligt, og at hver konfiguration stiller sine egne krav til harnessen: hvem der styrer, hvem der verificerer, og hvilke evner (fx collaboration skill frem for time horizon) der overhovedet skal måles. Kilder: Narayanan, LinkedIn [21], CITP-foredraget om augmentation-dagsordenen [22].
Agent-evaluering
Måling på fire niveauer: komponent, trajektorie, resultat og drift; forveksling af dem er den hyppigste metodefejl, og et system kan vinde på resultat men være heldigt på trajektorien. LLM-as-a-judge skalerer, men dommeren skal kalibreres mod menneskeligt bedømte eksempler. Kilde: MongoDB (eval-afsnittet) [8]. Wiki: methods/agent-evaluering.
Observability og tracing
Et trace er hele forløbet, hvert modelkald og hvert værktøjskald med input og output; det er både fejlsøgningsgrundlag, revisionsspor og kilden til nye testtilfælde når noget går galt i produktion. Kilde: LangChain, The Anatomy of an Agent Harness [6]. Wiki: concepts/agent-observability-og-tracing.

Videre læring

Forløbets videoer (i den rækkefølge de indgår):

  1. How We Build Effective Agents, Barry Zhang, Anthropic (15 min, mandag blok 1) [2]
  2. Harness Engineering Explained in 22 Minutes (mandag blok 2) [17]
  3. Harness Engineering: Humans Steer, Agents Execute, Ryan Lopopolo, OpenAI (konferencetalk, valgfri aftenvideo mandag) [16]
  4. Claude Agent SDK, Full Workshop, Thariq Shihipar, Anthropic (opslagsvideo i Lab 2, tirsdag) [11]

Hvis du vil videre bagefter:

Øvelser til de kommende uger:

  1. Genbyg Lab 2-pipelinen i LangGraph med checkpointing og en interrupt, og skriv tre linjer i wikien om hvad de to harnesses hver især gjorde nemt og svært.
  2. Kobl din LLM-WIKI- eller Slowcommand-server på pipelinen og lad den løse en rigtig opgave (fx en kildeopsummering eller et servertjek) fra ende til anden.
  3. Udbyg mini-evalen til en regressionssuite (promptfoo, DeepEval eller Inspect) og kør den ved hver harnessændring.
  4. Tilføj compaction og en hukommelsesfil til Lab 1-harnessen, og mål effekten på tokenforbruget.
  5. Relevant for din APM-forskning: formulér hvor harnessen slutter og forretningsprocessen begynder, og placér dine APM-cases i Narayanans 11 konfigurationer [21]; LangGraph-sidens pointe om tilstandsmaskiner og soundness er et godt afsæt.

Kilder

  1. Anthropic (2024): Building Effective Agents
  2. Zhang, B. (2025): How We Build Effective Agents, AI Engineer Summit (video)
  3. Hashimoto, M. (2026): My AI Adoption Journey
  4. OpenAI (2026): Harness engineering: leveraging Codex in an agent-first world
  5. Böckeler, B. (2026): Harness engineering for coding agent users, martinfowler.com
  6. LangChain (2026): The Anatomy of an Agent Harness
  7. Wikipedia: Agent harness
  8. MongoDB (2026): The Agent Harness: Why the LLM Is the Smallest Part of Your Agent System
  9. Ball, T. (2025): How to Build an Agent, Amp
  10. Anthropic: Claude Agent SDK, overview og quickstart
  11. Shihipar, T. (2026): Claude Agent SDK, Full Workshop (video)
  12. Anthropic: Effective harnesses for long-running agents
  13. Anthropic (2025): Writing effective tools for AI agents, using AI agents
  14. Anthropic (2025): Effective context engineering for AI agents
  15. Model Context Protocol: modelcontextprotocol.io
  16. Lopopolo, R. (2026): Harness Engineering: How to Build Software When Humans Steer, Agents Execute (video)
  17. AI Builder (2026): Harness Engineering Explained in 22 Minutes (video)
  18. Zhang, B. & Murag, M. (2025): Don't Build Agents, Build Skills Instead (video)
  19. (2026): Rethinking AI Agents: The Rise of Harness Engineering (video)
  20. LangChain: LangGraph
  21. Narayanan, A. (august 2026): Configurations of firm, worker(s), and agent, LinkedIn-opslag, tilgængeligt via hans LinkedIn-profil
  22. Narayanan, A. (2026): AI Agents and the Augmentation Agenda, CITP, Princeton (foredrag i samarbejde med Gabriel Unger)