|
| 1 | +--- |
| 2 | +authors: [anne-schuth, dimitri-van-hees] |
| 3 | +tags: |
| 4 | + - ai |
| 5 | + - llm |
| 6 | + - adr |
| 7 | + - open-source |
| 8 | + - forum-standaardisatie |
| 9 | + - developer.overheid.nl |
| 10 | +image: ./img/matrix.png |
| 11 | +description: | |
| 12 | + "I know kung fu." In The Matrix downloadt Neo een vechtkunst in zijn hoofd en is |
| 13 | + klaar om te gaan. In het echt werkt het anders. Als developer moet je allerlei |
| 14 | + standaarden en protocollen kennen, en dat kost uren lezen en uitzoeken. Maar je |
| 15 | + AI-assistant kan die kennis wel gewoon ingeladen krijgen. Op |
| 16 | + developer.overheid.nl experimenteren we met skills die overheidsstandaarden |
| 17 | + inladen in je AI-assistant. |
| 18 | +--- |
| 19 | + |
| 20 | +# Wat als je standaarden kon downloaden in je AI-assistant? |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | +"I know kung fu." In The Matrix downloadt Neo een vechtkunst in zijn hoofd en is |
| 25 | +klaar om te gaan. In het echt werkt het anders. Als developer moet je allerlei |
| 26 | +standaarden en protocollen kennen, en dat kost uren lezen en uitzoeken. Maar je |
| 27 | +AI-assistant kan die kennis wel gewoon ingeladen krijgen. Op |
| 28 | +developer.overheid.nl experimenteren we met skills die overheidsstandaarden |
| 29 | +inladen in je AI-assistant. |
| 30 | + |
| 31 | +<!-- truncate --> |
| 32 | + |
| 33 | +De Nederlandse overheid heeft tientallen standaarden voor softwareontwikkeling. |
| 34 | +API Design Rules, Digikoppeling, OAuth NL-profielen, DMARC, DNSSEC, en zo door. |
| 35 | +Ze zijn publiek beschikbaar en goed gedocumenteerd. Toch kent bijna niemand ze |
| 36 | +allemaal. Er zijn er gewoon te veel, en de afstand tussen een standaarddocument |
| 37 | +en je dagelijkse werk is groot. Skills maken die afstand kleiner. |
| 38 | + |
| 39 | +:::warning[Verantwoord experimenteren] |
| 40 | + |
| 41 | +We noemen dit bewust een experiment. Alle skills dragen een CONCEPT-label. De |
| 42 | +beschrijvingen zijn informatieve samenvattingen; de |
| 43 | +[officiële bronnen](https://www.forumstandaardisatie.nl/open-standaarden) zijn |
| 44 | +leidend. |
| 45 | + |
| 46 | +We hebben het experiment getoetst aan de |
| 47 | +[Overheidsbrede handreiking voor de verantwoorde inzet van generatieve AI](https://open.overheid.nl/documenten/9c273b71-cebb-4e11-b06f-fa20f7b4b90e/file). |
| 48 | +In het |
| 49 | +[verantwoordingsdocument](https://github.com/developer-overheid-nl/skills-marketplace/blob/main/docs/verantwoording.md) |
| 50 | +staat hoe we omgaan met risico's. Om vendor lock-in te voorkomen testen we |
| 51 | +skills met meerdere AI-assistants, waarvan minimaal een open source. |
| 52 | + |
| 53 | +::: |
| 54 | + |
| 55 | +## Wat zijn skills? |
| 56 | + |
| 57 | +Een skill is een Markdown-bestand met instructies en referentiemateriaal voor |
| 58 | +een AI-assistant. Denk aan de checklist die een piloot doorloopt voor vertrek. |
| 59 | +De piloot kan vliegen, maar de checklist zorgt dat er niets wordt overgeslagen. |
| 60 | + |
| 61 | +Er zit geen code in en je hoeft niets te finetunen. Het is gewoon een |
| 62 | +Markdown-bestand met gestructureerde kennis. |
| 63 | + |
| 64 | +Skills activeren op basis van context. Als je een REST API bouwt, laadt je |
| 65 | +assistant de API Design Rules. Configureer je een mailserver, dan komen de |
| 66 | +DMARC- en DKIM-richtlijnen erbij. Je hoeft als developer niet eens te weten dat |
| 67 | +een bepaalde standaard bestaat. |
| 68 | + |
| 69 | +Meerdere skills vormen samen een plugin, en plugins zijn vindbaar via een |
| 70 | +marketplace. Het "Agent Skills" formaat is een [open standaard](https://agentskills.io/home) |
| 71 | +die inmiddels door meer dan dertig tools wordt ondersteund, waaronder Claude |
| 72 | +Code, Opencode, Cursor, GitHub Copilot en Gemini CLI. |
| 73 | + |
| 74 | +```mermaid |
| 75 | +flowchart TD |
| 76 | + A[Overheid marketplace] --> B[Logius standaarden] |
| 77 | + A --> C[developer.overheid.nl tools] |
| 78 | + B --> D[API Design Rules] |
| 79 | + B --> E[Logboek Dataverwerking] |
| 80 | + C --> F[Publiceer blogpost] |
| 81 | + C --> G[Generate publiccode.yml] |
| 82 | +``` |
| 83 | + |
| 84 | +_Voorbeeldhiërarchie. Meerdere skills vormen samen een plugin. Plugins kunnen |
| 85 | +gevonden worden via marketplaces._ |
| 86 | + |
| 87 | +## In actie: de API Design Rules |
| 88 | + |
| 89 | +Je bouwt een REST API voor een overheidsorganisatie en vraagt je AI-assistant om |
| 90 | +een opzet. Zonder skill krijg je een generieke API die niet voldoet aan de |
| 91 | +[API Design Rules](https://gitdocumentatie.logius.nl/publicatie/api/adr/2.1.0/) |
| 92 | +van Logius. Endpoints in camelCase in plaats van kebab-case, foutmeldingen als |
| 93 | +vrije tekst in plaats van `problem+json`, geen versienummer in het pad. |
| 94 | + |
| 95 | +Met de [`/ls-api`](https://github.com/developer-overheid-nl/skills-standaarden/blob/main/skills/ls-api/SKILL.md) skill zit dat er anders uit: |
| 96 | + |
| 97 | +**Prompt:** |
| 98 | + |
| 99 | +```md |
| 100 | +Maak een OAS die voldoet aan de ADR en verifieer of deze valid is. Het betreft |
| 101 | +een CRUD API waarmee men bieren, bierstijlen en brouwerijen kan ophalen. Een |
| 102 | +brouwerij heeft een naam, en adres. Een bier heeft een alcoholpercentage, |
| 103 | +gekoppelde bierstijl en gekoppelde brouwerij. |
| 104 | +``` |
| 105 | + |
| 106 | +**Zonder skill:** |
| 107 | + |
| 108 | +```bash |
| 109 | +● Write(openapi.yaml) |
| 110 | +● Bash(npx @stoplight/spectral-cli lint /openapi.yaml \ |
| 111 | + --ruleset https://static.developer.overheid.nl/adr/ruleset.yaml 2>&1) |
| 112 | + ⎿ 16 errors, 1 warning found! |
| 113 | + ⎿ (timeout 30s) |
| 114 | + |
| 115 | +● De spec is niet ADR-compliant — 16 errors, 1 warning. |
| 116 | +``` |
| 117 | + |
| 118 | +**Met skill:** |
| 119 | + |
| 120 | +```bash |
| 121 | +● Skill(standaarden:ls-api) |
| 122 | + ⎿ Successfully loaded skill · 7 tools allowed · claude-sonnet-4-6 |
| 123 | +● Write(openapi.yaml) |
| 124 | +● Bash(npx @stoplight/spectral-cli lint /openapi.yaml \ |
| 125 | + --ruleset https://static.developer.overheid.nl/adr/ruleset.yaml 2>&1) |
| 126 | + ⎿ No results with a severity of 'error' found! |
| 127 | + ⎿ (timeout 30s) |
| 128 | + |
| 129 | +● De spec is ADR-compliant — 0 errors, 0 warnings. |
| 130 | +``` |
| 131 | + |
| 132 | +:::info |
| 133 | + |
| 134 | +Merk op dat de AI-assistant zelf valideert of de gegenereerde code voldoet aan |
| 135 | +de ADR door de linter te draaien. Ook deze validatie staat beschreven in de |
| 136 | +skill. In het voorbeeld zonder skill heeft de AI-assistant hier geen weet van, |
| 137 | +maar om de resultaten te tonen hebben we dit hierbij expliciet aangegeven. |
| 138 | + |
| 139 | +::: |
| 140 | + |
| 141 | +Dit soort details bepalen of je API voldoet aan de standaard op de |
| 142 | +['pas toe of leg uit'-lijst](https://www.forumstandaardisatie.nl/open-standaarden/rest-api-design-rules). |
| 143 | +De skill bevat verder naamconventies (kebab-case paden, camelCase parameters), |
| 144 | +de verplichte OpenAPI-specificatie op `/openapi.json`, security headers, en een |
| 145 | +implementatiechecklist van veertien punten. Of, zoals de AI-assistant zelf |
| 146 | +aangeeft op de vraag wat het verschil is tussen het uitvoeren van de prompt mét |
| 147 | +en zonder skill: |
| 148 | + |
| 149 | +```bash |
| 150 | +De skill zorgt ervoor dat ik de ADR-specifieke regels (zoals de verplichte |
| 151 | +API-Version header en de problem+json foutstructuur) direct goed toepas, |
| 152 | +in plaats van terug te vallen op gangbare REST-conventies die net niet aan |
| 153 | +de Nederlandse standaard voldoen. |
| 154 | + |
| 155 | +Wat ik zonder skill fout deed: |
| 156 | + |
| 157 | +┌────────────────────┬──────────────────────────┬──────────────────────────────────┐ |
| 158 | +│ADR-regel │Fout zonder skill │Wat de skill wist │ |
| 159 | +├────────────────────┼──────────────────────────┼──────────────────────────────────┤ |
| 160 | +│API-Version header │Vergeten op alle responses│Verplichte header op elke response│ |
| 161 | +├────────────────────┼──────────────────────────┼──────────────────────────────────┤ |
| 162 | +│Versie in server URL│/api/v1/... in paden │Linter checkt server URL │ |
| 163 | +├────────────────────┼──────────────────────────┼──────────────────────────────────┤ |
| 164 | +│Problem details │Eigen Error schema │RFC 9457 │ |
| 165 | +├────────────────────┼──────────────────────────┼──────────────────────────────────┤ |
| 166 | +│Query parameters │brewery_id (snake_case) │camelCase: brouwerijId │ |
| 167 | +└────────────────────┴──────────────────────────┴──────────────────────────────────┘ |
| 168 | + |
| 169 | +``` |
| 170 | + |
| 171 | +De API Design Rules skill is een van tien skills in de |
| 172 | +[standaarden-plugin](https://github.com/developer-overheid-nl/skills-standaarden), |
| 173 | +die samen 77 GitHub-repositories en negen domeinen afdekt. Er zijn ook plugins |
| 174 | +voor |
| 175 | +[internetstandaarden](https://github.com/developer-overheid-nl/skills-internet) |
| 176 | +(internet.nl), |
| 177 | +[geo-standaarden](https://github.com/developer-overheid-nl/skills-geo) |
| 178 | +(Geonovum) en |
| 179 | +[NeRDS-richtlijnen](https://github.com/developer-overheid-nl/developer-overheid-nl-agent-skills). |
| 180 | + |
| 181 | +## Waarom standaarden zich hier goed voor lenen |
| 182 | + |
| 183 | +Overheidsstandaarden beschrijven regels en vereisten. Dat soort gestructureerde |
| 184 | +kennis past goed in een skill. Ze zijn publiek en open, en veelal met licenties |
| 185 | +die dit toestaan. En ze veranderen niet elke week, waardoor skills actueel |
| 186 | +blijven. En als ze wel veranderen, dan weten we dat direct omdat we de bronnen |
| 187 | +monitoren. |
| 188 | + |
| 189 | +Daarnaast lossen skills een praktisch probleem op. De meeste developers kennen |
| 190 | +een handjevol standaarden, terwijl er tientallen relevant zijn voor hun werk. |
| 191 | +Met skills zit die kennis in het gereedschap zelf. |
| 192 | + |
| 193 | +## Meedoen |
| 194 | + |
| 195 | +De |
| 196 | +[skills marketplace](https://github.com/developer-overheid-nl/skills-marketplace) |
| 197 | +is openbaar en bruikbaar. Installeren kan in Claude Code of Cursor, zie de |
| 198 | +instructies in de repository. |
| 199 | + |
| 200 | +Feedback is welkom via GitHub issues, zeker als een skill een standaard verkeerd |
| 201 | +samenvat. We passen skills aan op basis van feedback. |
| 202 | + |
| 203 | +Je kunt ook zelf skills schrijven. Je hoeft geen developer te zijn; als je de |
| 204 | +kennis hebt over een standaard of richtlijn, kun je die structureren in een |
| 205 | +Markdown-bestand. De |
| 206 | +[handleiding](https://github.com/developer-overheid-nl/skills-marketplace/blob/main/docs/plugin-maken.md) |
| 207 | +beschrijft hoe. |
| 208 | + |
| 209 | +## Wat we hopen |
| 210 | + |
| 211 | +We hebben nu zes plugins en tientallen skills, en dat groeit. We willen dat |
| 212 | +standaarden beschikbaar zijn in je terminal en editor, terwijl je code schrijft. |
| 213 | + |
| 214 | +De repositories zijn open. Probeer het uit en laat weten wat je ervan vindt! |
0 commit comments