+ "content": "## Problemet\n\nTidligt læste agent-runneren tidligere rettelser fra `_data/agents/{id}/feedback.json` og injectede dem i systempromp'ten som few-shot eksempler. Idéen var at agenter ville lære af kuratorrettelser over tid. Hagen: **intet sted i kodebasen blev der nogensinde skrevet til den fil.** Kuratorer kunne rette hver kladde og afvise hver dårlig én og agenten ville glad gentage de samme fejl næste dag.\n\nFeedback-loop'en lukker det hul. Hver kuratorhandling — redigering af et felt før godkendelse, afvisning med en note — persisteres nu automatisk til agentens feedback-fil. Næste gang agenten kører, bages de seneste rettelser ind i dens systemprompt som konkrete eksempler.\n\n## Sådan registreres rettelser\n\nNår en queue item oprettes af en agent, snapshotter runneren det oprindelige `contentData` på queue item under `originalContentData`. Når en kurator godkender, diff'er kuratering-routen det aktuelle `contentData` mod det snapshot og skriver én **correction** post pr. ændret string-felt:\n\n```json\n{\n \"id\": \"fb-...-...\",\n \"type\": \"correction\",\n \"queueItemId\": \"qi-...\",\n \"field\": \"title\",\n \"original\": \"Why TypeScript Generics Matter\",\n \"corrected\": \"How TypeScript Generics Save You From Refactoring Hell\",\n \"createdAt\": \"2026-04-08T...\"\n}\n```\n\nHvis du ikke redigerer noget før godkendelse, registreres ingen rettelser — det oprindelige output var godt nok.\n\n## Sådan registreres afvisninger\n\nNår du afviser et queue item med en note, skriver afvisning-routen en **rejection**-post med kuratorens noter:\n\n```json\n{\n \"id\": \"fb-...-...\",\n \"type\": \"rejection\",\n \"queueItemId\": \"qi-...\",\n \"notes\": \"Tonen er for tør — mangler personlighed og specifikke eksempler\",\n \"createdAt\": \"2026-04-08T...\"\n}\n```\n\nAfvisningsnoter er synlige på agentens detaljeside men **injectes ikke aktuelt i næste systemprompt** (kun `correction` og `edit` poster med både `original` og `corrected` strings bruges som few-shot eksempler). De er stadig nyttige som audit trail og kan blive foldet ind i prompt-konteksten i en fremtidig revision.\n\n## Hvad bliver injectet i næste kørsel\n\nAgent-runneren kalder `loadFeedbackForPrompt(agentId, 5)` og henter de **seneste 5 correction-eksempler** i kronologisk rækkefølge. De tilføjes til systemprompt'en under en `## Learn from past corrections` sektion:\n\n```\n## Learn from past corrections\nExample 1:\nOriginal: Why TypeScript Generics Matter\nCorrected: How TypeScript Generics Save You From Refactoring Hell\n\nExample 2:\nOriginal: A serene sunrise over snow-capped mountains\nCorrected: Snow-covered alpine valley with frozen lake at golden hour\n```\n\nModellen behandler dem som konkrete redaktionelle præferencer og har tendens til at efterligne mønstrene i sin næste kørsel.\n\n## Recent feedback panelet\n\nAgentens detaljeside viser et **Recent feedback** kort med de seneste 5 poster. Hver post har et farvet type-badge (grøn for correction, blå for edit, rød for rejection), feltnavn hvor relevant, et strikethrough diff for corrections og en timestamp.\n\nFooteren noterer det maksimale antal injectede så kuratorer forstår hvad der faktisk flyder tilbage i agenten.\n\n## API\n\nEndpointet er på `POST /api/cms/agents/[id]/feedback` og accepterer:\n\n```json\n{\n \"type\": \"correction\" | \"rejection\" | \"edit\",\n \"queueItemId\": \"qi-...\",\n \"field\": \"title\",\n \"original\": \"...\",\n \"corrected\": \"...\",\n \"notes\": \"...\"\n}\n```\n\nDe fleste kuratorer kalder aldrig dette direkte — kuraterings-routes for godkendelse/afvisning håndterer det automatisk. Det findes til programmatiske submissions og til in-page-panelet.\n\n## Lagring og grænser\n\n- Fil: `_data/agents/{agentId}/feedback.json`\n- Maks poster: **200** (ældste droppes ved append)\n- Format: JSON-array af `FeedbackEntry` objekter\n- Bagudkompatibel: legacy `{ original, corrected }` shape læses som en `correction` type\n\n## Hvorfor kun 5 eksempler?\n\nFew-shot eksempler er den dyreste del af systempromp'ten — hvert er hundredevis af tokens, og prisen betales på hver kørsel. Fem er nok til at kommunikere konsistente redaktionelle præferencer uden at bloate prompten til token-spild. Hvis du vil have agenten til at lære en *ny* præference hurtigt, lander den i top 5 inden for få godkendelser.\n\n## Se også\n\n- [Per-agent budgetkontrol](/docs/agent-cost-guards) — hold en for-ivrig agent fra at ignorere dine rettelser ved at begrænse dens budget.\n- [Kurateringskøen](/docs/curation-queue) — hvor rettelser sker.",
0 commit comments