| name | parse-organogram |
| description | Vision- of HTML-tekstanalyse op een organogram, extract organisatiehierarchie en bemenste posten. Gebruik wanneer de gebruiker een organogram-afbeelding of inline organogram-tekst aanlevert of zegt 'parse organogram', 'extract organisatiestructuur', 'lees organogram', 'organogram naar JSON', or in English 'parse org chart', 'extract organisation structure', 'read organogram'. |
| version | 0.3.0 |
| triggers | ["parse organogram","extract organisatiestructuur","lees organogram","organogram naar JSON","parse org chart","extract organisation structure","read organogram"] |
parse-organogram
Doel
Lever proposals voor de organisatiehierarchie (parent naar child) plus de personen op de zichtbare posten van een ministerieel organogram. Twee inputmodi: vision-analyse op een PDF of PNG, of tekstanalyse op de inline_text uit het ABD-manifest. Personen-extracties krijgen een confidence-cap omdat zowel vision als afgeknipte HTML-tekst foutgevoelig zijn op initialen.
Input
Eén van:
- Pad naar een PNG, JPG of PDF van een organogram (vision-modus).
- Een entry uit
data/_staging/abd-manifest-<datum>.json waarvan inline_text is gevuld (tekstmodus). Sommige ministeries (AZ, DEF, OCW) publiceren geen organogram-PDF maar wel een HTML-pagina met directie-namen en personen.
Optioneel: ministerie-slug en peildatum, indien niet uit metadata afleidbaar.
Output
ALLEEN JSON-array als laatste output, geen andere tekst. Geen introductie, geen samenvatting, geen markdown-fences, geen "Next step:". De runner vangt jouw stdout op en schrijft die naar het juiste pad. Schrijf zelf geen bestanden met Write en noem geen output-pad in je antwoord. Tools zijn alleen voor Read (PDF) en polder search (slug-lookup).
JSON-array met proposals. Twee soorten, beide met bron_pagina_nummer, bron_url en evidence:
Orgaanstructuur:
{
"type": "org_structure",
"parent_id": "org:min-bzk",
"child_name": "DG Bestuur en Wonen",
"bron_pagina_nummer": 1,
"bron_url": "https://www.rijksoverheid.nl/.../organogram-bzk-2026.pdf",
"confidence": 0.92,
"evidence": "blok rechts boven, eerste rij onder SG"
}
Persoon-op-post:
{
"type": "person_post",
"person_name": "drs. M. de Boer",
"post_id": "post:sg-min-bzk",
"classification": "abd-tmg",
"bron_pagina_nummer": 1,
"bron_url": "https://www.rijksoverheid.nl/.../organogram-bzk-2026.pdf",
"confidence": 0.78,
"evidence": "bovenste box, pagina 1"
}
Het child_id veld komt later via een aparte entity-resolution-skill of handmatige review. De parser stelt alleen child_name voor.
Casing: begin child_name met een hoofdletter op het eerste woord (organisatie-prefix Afdeling, Directie, Directoraat-generaal, Cluster, Bureau, ...), ook als het organogram klein schrijft. Inhoudswoorden in een organisatienaam krijgen een hoofdletter ("Directie Ruimtelijke Ontwikkeling", niet "Directie Ruimtelijke ontwikkeling"). Uitzondering: gevestigde afkortingsvormen (pSG, plv.) en eigennamen die in de bron bewust met een kleine letter beginnen. De afgeleide child_name wordt gecanonicaliseerd; de letterlijke evidence behoudt de bron-casing.
Stappen voor de LLM
Vision-modus (PDF of PNG)
- Roep Claude vision aan via
anthropic.messages.create met de afbeelding als image-content. Voor PDF: render eerst per pagina naar PNG (bijvoorbeeld via pdf2image), dan vision per pagina.
- Loop alle gedetecteerde boxen langs. Ga zo diep als de afbeelding gaat: niveaus ministerie -> DG -> directie -> afdeling -> team zijn ALLE relevant. Een organogram toont vaak meer dan alleen DG/directie; sla afdelingen niet over. Voor elke box:
- Lees de titel-regel ("Directie X", "DG Bestuur", "Afdeling Beleid", "Cluster Y", "Team Z").
- Lees de eventuele persoonsnaam onder de titel.
- Volg de verbindingslijn omhoog naar de parent-box; de parent geeft
parent_id.
- Map de titel naar
classification (zie mapping hieronder).
- Cap
confidence voor elk person_post proposal op 0.85. Org-structuur mag hoger als de lijnen helder zijn.
- Afdeling-niveau verplicht waar het bestaat in de bron. Als de bron afdelingen toont onder een directie (zelfs zonder eigen persoon-naam), produceer dan toch een
org_structure-record voor elke afdeling met de directie als parent_id. Liever 50 afdeling-records met confidence: 0.85 dan een platte boom met alleen 17 directies.
Tekstmodus (inline_text uit manifest)
- Lees
inline_text van de manifest-entry. Parse koppen en sub-koppen (h1/h2/h3 zijn al weg, maar woorden als "DG", "Directie", "Afdeling" markeren niveaus).
- Voor elk herkend kopje: maak een
org_structure-proposal met parent_id op het bovenliggende niveau (root = org:<ministerie-slug>).
- Voor elke persoonsnaam direct na een kopje: maak een
person_post-proposal. evidence MOET een letterlijke substring van inline_text zijn die de naam plus omringende context bevat (minimaal de zin waar de naam in staat). Geen substring, geen proposal.
- Map de titel naar
classification (zie mapping hieronder).
- Cap
confidence voor person_post op 0.85, voor org_structure op 0.90 als de hiërarchie eenduidig is.
Classification-mapping
- "Secretaris-Generaal", "SG", "plv. SG", "Directeur-Generaal", "DG", "Inspecteur-Generaal", "IG" naar
abd-tmg.
- "Directeur", "plv. directeur", "Programmadirecteur" naar
abd-directeur.
- "Afdelingshoofd", "Hoofd Afdeling X", "MT-lid", "clusterhoofd" naar
abd-afdelingshoofd.
- "Projectleider", "Kwartiermaker" naar
abd-projectleider.
- Onbekende titel: laat
classification weg en flag voor handmatige review.
Hiërarchie-patroon ministeries
Een Nederlands ministerie heeft een vaste top-laag die in elk organogram terugkomt. Volg dit patroon strict, niet de visuele layout. Audit-check (ministerie_direct_onderdeel, ministerie_direct_post) handhaaft deze regels.
Direct onder org:min-<x> mag:
- Bewindspersonen-posten (
post:minister-min-<x>, post:staatssecretaris-min-<x>, MZP-posten met classification: bewindspersoon).
- De SG-cluster (
org:onderdeel-sg-min-<x>, type organisatieonderdeel).
- ZBO's, agentschappen, RWT's, adviescolleges, inspecties, hoge-colleges, met hun eigen
type-veld (niet organisatieonderdeel). Dus DJI hoort als type: agentschap te zijn, niet organisatieonderdeel.
Direct onder org:min-<x> mag NIET:
- Andere posten dan
classification: bewindspersoon. Geen SG-posten, geen DG-posten, geen directeur- of afdelingshoofd-posten. Die horen onder hun organisatieonderdeel.
- Andere
organisatieonderdeel-records dan de SG-cluster. DG's, directies, programma-DG's, clusters Bestuursondersteuning/Mensen-en-Middelen hangen ALLEMAAL onder de SG-cluster.
Hiërarchie onder SG-cluster:
post:sg-min-<x> en post:plv-sg-min-<x> hebben organization_id: org:onderdeel-sg-min-<x>.
- DG's (
org:onderdeel-dg-<naam>-min-<x>), Bureau ABD, AIVD, programma-DG's, clusters Bestuursondersteuning/Mensen-en-Middelen hebben parent_id: org:onderdeel-sg-min-<x>.
- Onder elke DG hangen directies (
org:onderdeel-directie-<naam>-min-<x>); onder directies eventueel afdelingen.
Concreet voor BZK (zie _cache/organogrammen/bzk-2026-organogram.pdf): SG Vincent Roozen en plv-SG Mark de Boer staan tussen de bewindspersonen-strook en de DG-rij. DGDOO, DGKR, DG VHB, DG RO, DG VBR, DG OBDR, DG AIVD, DG ABD hebben SG-cluster als parent. Geen enkel ander record dan deze hangt direct onder org:min-bzk.
In tekstmodus is dit niet altijd visueel zichtbaar. Default-aanname:
- Nieuwe
org_structure-records met classification: abd-tmg (DG/IG/SG) en parent niet expliciet aangegeven → parent_id: org:onderdeel-sg-min-<x> (DG/IG) of parent_id: org:min-<x> (alleen de SG-cluster zelf).
- Nieuwe
person_post-records met classification: abd-tmg voor een SG of plv-SG → organization_id: org:onderdeel-sg-min-<x>.
- Nieuwe
person_post-records met classification: abd-directeur of abd-afdelingshoofd → organization_id van het directie- of afdeling-onderdeel, NIET van het ministerie zelf.
Output schrijven
Skip rood-AVG-niveau posten (beleidsmedewerker, communicatiemedewerker, jurist, secretariaat). Niet extracten, ook niet als ze in de bron staan. De runner schrijft de proposals automatisch naar data/_staging/organogram-{ministerie}-{datum}.json; jij produceert alleen de JSON-array op stdout.
Harde regels
- Staging-only. Output ALTIJD onder
data/_staging/. Nooit direct in data/.
- Confidence-cap. Personen: maximaal 0.85, ook bij heldere bron. Vision en HTML-tekst blijven foutgevoelig op initialen.
- Quote-or-die voor evidence. Vision-modus:
evidence beschrijft de locatie in de afbeelding (bijvoorbeeld "blok rechts boven, pagina 2"). Tekstmodus: evidence is een letterlijke substring van inline_text. Geen evidence, geen proposal.
- Two-source rule. Een organogram-extractie merget alleen met expliciete bevestiging uit een tweede bron (bijvoorbeeld een KB in de Staatscourant) of expliciete human review.
- Geen rood-AVG. Beleidsmedewerkers en juridisch ondersteunend personeel komen niet in proposals, ook niet als ze in de bron zichtbaar zijn.
- Bron verplicht. Elke proposal heeft
bron_pagina_nummer en bron_url. Onleesbare regio: log een waarschuwing met paginanummer, geen gokken.
Voorbeeld
Zie example_image_description.md voor een tekstuele beschrijving van een fictief BZK-organogram (echte PNG of PDF zit niet in de repo wegens omvang) en example_output.json voor de bijbehorende proposals.
Aanroep
Vision werkt het best met opus, niet haiku. Vanuit Claude Code CLI:
claude "Gebruik parse-organogram op _cache/abd-organogrammen/bzk-2026-04.pdf en schrijf naar data/_staging/organogram-bzk-2026-04.json"