CLAUDE.md · git:20260917.8aaf69d · 2026-09-17 · sha256 c8c168dd53aec365
CLAUDE.md git:20260917.8aaf69dA
Immutable. This exact content is served forever at /api/v1/blob/c8c168dd53aec365.
# Logius Standaarden Plugin - Werkinstructies ## Taal Alle content in deze repo is in het **Nederlands**: skill descriptions, body tekst, commit messages, en documentatie. Gebruik Nederlands tenzij de gebruiker expliciet in het Engels communiceert. ## Repo structuur - `.claude-plugin/plugin.json` - Plugin manifest (versie wordt automatisch gebumpt door release-please) - `skills/ls/SKILL.md` - Meta-skill (overzicht, routing) - `skills/ls-<domein>/SKILL.md` - Domein-skills (9 stuks) - `skills/ls-<domein>/reference.md` - Achtergrondinfo per domein (optioneel) - `skills/ls-<domein>/conflicts.md` - Bronconflicten en gemaakte keuzes per domein - `scripts/extract_urls.py` - Extraheert monitorbare URLs uit skill-bestanden - `scripts/monitor_content.py` - Detecteert content-wijzigingen (GitHub API + HTTP checks) - `tests/` - Pytest tests voor de scripts - `.github/workflows/ci.yml` - CI: structuurvalidatie, ruff, markdownlint, pytest - `.github/workflows/release-please.yml` - Automatische releases via conventional commits - `.github/workflows/monitoring-content.yml` - Dagelijkse content monitoring (07:00 UTC) - `.github/workflows/monitoring-links.yml` - Dagelijkse link checks met lychee (06:00 UTC) - `.github/workflows/monitoring-def-versions.yml` - Wekelijkse controle van DEF-versies tegen gitdocumentatie (maandag 07:30 UTC) - `.github/workflows/labeler.yml` - Automatische PR-labels op basis van gewijzigde bestanden ## Conventies voor skills ### SKILL.md opbouw 1. YAML frontmatter met `name`, `description`, `model: sonnet`, `allowed-tools` 2. Agent-instructie (2-3 zinnen, vetgedrukt: wanneer wordt deze skill gebruikt, wat moet de agent doen) 3. Korte intro (wat is dit domein, link naar Forum Standaardisatie) 4. Versiemodel (altijd: WV/CV/VV/DEF kanalen uitleggen + Forum Standaardisatie status) 5. Repository tabel(len) — gescheiden in Kernspecificaties en Aanvullende documenten 6. Beslisboom / keuzematrix (waar relevant) 7. Implementatievoorbeelden - realistische code in Python, JavaScript, curl, XML/JSON 8. Foutafhandeling - domein-specifieke error responses, status codes 9. Achtergrondinfo (verwijzing naar reference.md en conflicts.md) Elke skill moet genoeg bevatten zodat een agent standaard-conforme code kan genereren zonder externe bronnen op te halen. Encyclopedische uitleg hoort in `reference.md`, niet in `SKILL.md`. ### Repository tabel format ```markdown | Repository | Beschrijving | Vastgesteld (DEF) | Draft (WV) | |-----------|-------------|-----------------|-----------| | [Naam](https://github.com/logius-standaarden/REPO) | Omschrijving | [vX.Y.Z](https://gitdocumentatie.logius.nl/publicatie/domein/slug/) | [Draft](https://logius-standaarden.github.io/REPO/) | ``` - Versies altijd als link: `[vX.Y.Z](gitdocumentatie-url)` - Geen vastgestelde versie beschikbaar: gebruik `—` (em-dash) - Gearchiveerde repos in aparte tabel onderaan met markering ### Versies en bronnen van waarheid - **gitdocumentatie.logius.nl** is de bron van waarheid voor vastgestelde (DEF) versies - GitHub-tags lopen vaak achter op gepubliceerde versies — dit is een bekend beheerproces-issue - Versieformat: semantic versioning `vX.Y.Z` (uitzonderingen documenteren in conflicts.md) - Versienummers in SKILL.md moeten overeenkomen met wat er op gitdocumentatie staat - Bij een monitoring issue over een nieuwe tag/commit: controleer of de versie in SKILL.md nog klopt ### reference.md patroon Achtergrondkennis die niet direct nodig is voor code-generatie wordt verplaatst naar `reference.md` in dezelfde skill-directory. Denk aan: - Architectuurbeschrijvingen en conceptuele uitleg - Historische context en levensfasen - Praktijkvoorbeelden en case studies - Gedetailleerde protocol-uitleg - Handige commando's voor repo-exploratie De `SKILL.md` verwijst onderaan naar `reference.md` met een korte zin. ### conflicts.md patroon Elk domein heeft een `conflicts.md` met vaste structuur: 1. Header met datum: `Geconstateerd: YYYY-MM-DD` 2. Patroon-beschrijving (welk type discrepantie) 3. Discrepanties tabel: Repository | Gepubliceerde versie (DEF) | Laatste GitHub-tag | Discrepantie 4. Details per repo (alleen bij afwijkingen) 5. **"Keuze in SKILL.md"** sectie (altijd): welke bron leidend is en wanneer herbeoordeling nodig is De `SKILL.md` verwijst naar `conflicts.md` in de Achtergrondinfo-sectie. ### Description triggers Descriptions bevatten zowel Nederlandse als technische Engelse triggerwoorden zodat de skill bij relevante vragen wordt geactiveerd. Houd descriptions kort: doel **~150 chars, max 200**. Eén functionele zin met de eigennamen die mensen daadwerkelijk gebruiken (DMARC, OAuth, NEN 3610) is genoeg; voeg alleen een korte triggerstaart toe voor termen die niet uit de hoofdzin volgen. Geen "Gebruik deze skill wanneer..."-aanhef en geen quoted keyword-lijsten — die vreten skill listing budget op zonder triggerwaarde toe te voegen. ### Allowed tools Pas per skill aan. Niet elke skill heeft alle tools nodig. Standaard set: - `Bash(gh api *)`, `Bash(gh issue list *)`, `Bash(gh pr list *)`, `Bash(gh search *)` - `Bash(curl -s *)`, `WebFetch(*)` Extra tools alleen waar relevant: - `Bash(npx markdownlint *)`, `Bash(npx @axe-core/cli *)`, `Bash(npx muffet *)` alleen voor `/ls-pub` ### Maximale omvang SKILL.md bestanden mogen maximaal **500 regels** bevatten. Grotere content hoort in `reference.md`. ## Content strategie **On-demand ophalen, niet opslaan.** De GitHub repos van logius-standaarden zijn de bron van waarheid. Skills bevatten samenvattingen en structuur; actuele content wordt live opgehaald via `gh api` of `WebFetch`. ## GitHub organisatie Alle repos staan onder: `https://github.com/logius-standaarden/` Publicaties op: `https://logius-standaarden.github.io/<repo>/` Vastgestelde publicaties op: `https://gitdocumentatie.logius.nl/publicatie/` **Let op:** `gitdocumentatie.logius.nl/publicatie/<prefix>/` (directory-niveau) geeft 403 — gebruik altijd de volledige sub-pad URLs (bijv. `/publicatie/dk/architectuur/`, niet `/publicatie/dk/`). ## Development ### Vereisten - Python 3.12+ - [uv](https://docs.astral.sh/uv/) als package manager - `uv sync` om dependencies te installeren ### Linting en tests ```bash uv run ruff check scripts/ tests/ # Linting uv run ruff format --check scripts/ tests/ # Format check uv run pytest -v # Tests ``` Pre-commit hooks draaien automatisch ruff + markdownlint bij elke commit. ### CI/CD **Branch protection** is actief op `main` met verplichte status checks: `validate`, `lint-python`, `lint-markdown`, `test-python`. Directe pushes naar main zijn geblokkeerd — alle wijzigingen gaan via PRs. **Releases** worden automatisch beheerd door [release-please](https://github.com/googleapis/release-please): 1. Gebruik [Conventional Commits](https://www.conventionalcommits.org/): `feat:`, `fix:`, `chore:`, `docs:` 2. release-please maakt automatisch een Release PR aan met gebumpte versies en CHANGELOG 3. Bij merge van Release PR: GitHub Release + git tag + versie gebumpt in `plugin.json`, `pyproject.toml`, `publiccode.yml` **Belangrijk:** Release PRs van release-please hebben geen CI checks (GITHUB_TOKEN pushes triggeren geen workflows). Push een lege commit om CI te triggeren: ```bash gh pr checkout <nr> && git commit --allow-empty -m "chore: trigger CI" && git push && git checkout main ``` **Strict branch protection** vereist dat branches up-to-date zijn. Na merges van andere PRs: `gh pr update-branch <nr>` voordat je kunt mergen. ### Monitoring **Content monitoring** (`scripts/monitor_content.py`) draait dagelijks om 07:00 UTC: - Checkt GitHub repos via API (commit SHA, tags, archived status) - Checkt HTTP resources via ETag/Last-Modified + SHA256 body hash - Body hash is leidend — ETag/Last-Modified wijzigingen worden genegeerd als body hash ongewijzigd is - `normalize_html()` filtert dynamische content: timestamps, nonces, cache-busters, Drupal CMS hashes - Checksums state wordt opgeslagen in GitHub Actions cache (niet in de repo) - Maakt GitHub Issues aan bij gedetecteerde wijzigingen (na 3 opeenvolgende failures voor errors) **Link monitoring** (`monitoring-links.yml`) draait dagelijks om 06:00 UTC met lychee. **DEF-versie monitoring** (`scripts/check_def_versions.py`, wekelijks via `monitoring-def-versions.yml`) vergelijkt elke `[vX.Y.Z](gitdocumentatie-url)` in de skills met de gepubliceerde pagina, op twee dingen: - **versie**: komt de versie in de skill overeen met wat de pagina noemt (de `<title>` is leidend; `publishVersion` noemt soms de vórige versie) - **status**: heeft de gelinkte pagina `specStatus: DEF`? Een `VV` (versie ter vaststelling) of `WV` hoort niet in een "Vastgesteld"-kolom Draai lokaal met `uv run python scripts/check_def_versions.py`. Aanleiding: het OIN-Stelsel stond een half jaar als vastgesteld `v3.0.0` in de skills terwijl zowel 3.0.0 als 3.0.1 `specStatus: VV` hebben; dat viel pas op toen Logius de *latest*-verwijzing terugzette naar de laatste échte DEF (v2.2.2). Een versienummer dat "nieuwer" oogt is dus geen bewijs dat het vastgesteld is. ### Monitoring issues afhandelen Wanneer de monitoring een GitHub Issue aanmaakt, volg dit proces: **Content gewijzigd (body hash verschilt / nieuwe commit / nieuwe tag):** 1. Bekijk de wijziging: wat is er veranderd in de bron? 2. Controleer of versienummers in `SKILL.md` nog kloppen met gitdocumentatie.logius.nl 3. Update `SKILL.md` repository tabel als er een nieuwe versie is 4. Update `conflicts.md` als de discrepantie tussen tag en publicatie is veranderd 5. Sluit het issue met een verwijzing naar de PR **Bron onbereikbaar (HTTP error na 3 dagen):** 1. Controleer of de URL nog correct is (typo? verhuisd? directory-niveau 403?) 2. Als de URL is verhuisd: update in de skill-bestanden 3. Als de bron tijdelijk down is: wacht en sluit het issue als het weer werkt 4. Als de bron permanent weg is: verwijder of vervang de URL in de skill-bestanden **False positive (dynamische content, geen echte wijziging):** 1. Identificeer de oorzaak (CMS cache rebuild, nonce rotatie, timestamp, etc.) 2. Voeg een normalisatieregel toe aan `normalize_html()` in `scripts/monitor_content.py` 3. Voeg tests toe in `tests/test_monitor_content.py` 4. Als een hele URL niet gemonitord hoeft te worden: voeg een exclude-patroon toe aan `EXCLUDE_PATTERNS` in `scripts/extract_urls.py` 5. Sluit het false positive issue ## Plugin testen Verificatievragen: - "Welke Logius standaarden zijn er?" -> moet `/ls` triggeren - "Wat zijn de API Design Rules?" -> moet `/ls-api` triggeren - "Toon de laatste wijzigingen aan Digikoppeling" -> moet `/ls-dk` triggeren - "Hoe stel ik een beheermodel op?" -> moet `/ls-bomos` triggeren - "Run een WCAG check" -> moet `/ls-pub` triggeren (niet ls-dk of ls-api!)