From 3e0e2dd57d59b32405d85eff42f23e618c3765b5 Mon Sep 17 00:00:00 2001 From: Ravi Meijer Date: Fri, 18 Apr 2025 13:03:11 +0200 Subject: [PATCH 1/4] Add validation scripts for URN and lifecycle --- .github/ISSUE_TEMPLATE/fout-of-bug-melden.md | 5 +- .github/ISSUE_TEMPLATE/suggestie.md | 1 - .github/pull_request_template.md | 4 +- .github/scripts/README.md | 48 +++ .github/scripts/run_all_validations.py | 64 ++++ .github/scripts/validate_all_labels.py | 257 +++++++++++++++ .github/scripts/validate_file_prefix_urn.py | 149 +++++++++ .github/scripts/validate_urn_uniqueness.py | 105 +++++++ .github/workflows/linkchecker.yaml | 4 +- .github/workflows/preview.yaml | 16 +- .github/workflows/run-python-script.yaml | 2 +- .github/workflows/validation.yaml | 39 +++ .pre-commit-config.yaml | 34 ++ CONTRIBUTING.md | 47 ++- LICENSE.md | 2 +- README.md | 31 ++ docs/html/ai-verordening-popup.html | 6 +- docs/html/beslishulp.html | 2 +- docs/index.md | 14 +- docs/javascripts/extra.js | 2 +- docs/javascripts/filtering.js | 2 +- docs/javascripts/mermaid.min.js | 14 +- docs/javascripts/modal.js | 24 +- docs/javascripts/tablesort.js | 2 +- docs/javascripts/tablesort.min.js | 2 +- .../dataverkenning-en-datapreparatie.md | 30 +- docs/levenscyclus/implementatie.md | 24 +- docs/levenscyclus/index.md | 4 +- docs/levenscyclus/monitoring-en-beheer.md | 20 +- docs/levenscyclus/ontwerp.md | 26 +- docs/levenscyclus/ontwikkelen.md | 20 +- .../organisatieverantwoordelijkheden.md | 6 +- docs/levenscyclus/over-de-levenscyclus.md | 4 +- docs/levenscyclus/probleemanalyse.md | 18 +- docs/levenscyclus/uitfaseren.md | 34 +- docs/levenscyclus/verificatie-en-validatie.md | 36 +-- docs/onderwerpen/bias-en-non-discriminatie.md | 40 +-- docs/onderwerpen/data.md | 20 +- docs/onderwerpen/duurzaamheid.md | 6 +- docs/onderwerpen/fundamentele-rechten.md | 4 +- docs/onderwerpen/governance.md | 10 +- docs/onderwerpen/index.md | 18 +- docs/onderwerpen/menselijke-controle.md | 14 +- .../privacy-en-gegevensbescherming.md | 8 +- docs/onderwerpen/publieke-inkoop.md | 30 +- .../technische-robuustheid-en-veiligheid.md | 20 +- docs/onderwerpen/transparantie.md | 4 +- .../over-het-algoritmekader.md | 4 +- docs/rollen/beleid-en-advies.md | 4 +- docs/rollen/index.md | 4 +- docs/rollen/jurist.md | 4 +- docs/rollen/projectleider.md | 4 +- docs/soorten-algoritmes-en-ai/definities.md | 164 +++++----- .../impact-van-algoritmes.md | 2 +- docs/soorten-algoritmes-en-ai/index.md | 4 +- .../risico-van-ai-systemen.md | 4 +- .../wat-is-een-algoritme.md | 6 +- docs/stylesheets/all.min.css | 2 +- docs/stylesheets/choices.min.css | 2 +- docs/stylesheets/extra.css | 6 +- docs/stylesheets/filters.css | 40 +-- docs/stylesheets/footer.css | 14 +- docs/stylesheets/navigation.css | 2 +- docs/version.md | 2 +- .../ai-verordening.md | 24 +- .../hulpmiddelen/AIIA.md | 30 +- .../hulpmiddelen/ALTAI.md | 36 +-- .../hulpmiddelen/BIO.md | 6 +- .../hulpmiddelen/DEDA.md | 10 +- .../hulpmiddelen/DPIA.md | 32 +- .../hulpmiddelen/IAMA.md | 22 +- .../hulpmiddelen/algoritmeregister.md | 14 +- .../hulpmiddelen/fairness-handbook.md | 4 +- .../framework-meaningful-engagement.md | 10 +- .../handreiking-non-discriminatie.md | 14 +- .../hulpmiddelen/index.md | 6 +- .../hulpmiddelen/inkoopvoorwaarden.md | 8 +- .../hulpmiddelen/onderzoekskader-adr.md | 14 +- .../hulpmiddelen/standaarden.md | 12 +- .../toetsingskader-algemene-rekenkamer.md | 10 +- .../toetsingskader-risicoprofilering.md | 20 +- docs/voldoen-aan-wetten-en-regels/index.md | 4 +- .../0-org-00-inventariseren-algoritmes.md | 22 +- ...rg-01-benodigde-expertise-en-capaciteit.md | 18 +- ...rg-02-beleid-opstellen-inzet-algoritmes.md | 42 +-- .../0-org-03-toepassen-risicobeheer.md | 24 +- ...itiek-bestuurlijke-verantwoordelijkheid.md | 30 +- .../0-org-05-bestaande-governance.md | 26 +- .../0-org-06-volwassenheidsmodel.md | 38 +-- .../maatregelen/0-org-07-intern-toezicht.md | 16 +- .../0-org-08-beslismoment-levenscyclus.md | 14 +- ...0-org-09-governance-per-risicocategorie.md | 22 +- ...rantwoordelijkheden-algoritmegovernance.md | 16 +- .../maatregelen/0-org-11-gebruikersbeheer.md | 4 +- ...0-org-12-periodieke-evaluatie-kwaliteit.md | 28 +- .../maatregelen/0-org-13-wachtwoordbeheer.md | 2 +- .../maatregelen/0-org-14-wijzigingenproces.md | 9 +- .../0-org-15-discriminatieprotocol.md | 48 +-- .../0-org-16-bewustwording-en-opleiding.md | 20 +- .../1-pba-01-formuleren-probleemdefinitie.md | 20 +- .../1-pba-02-formuleren-doelstelling.md | 24 +- .../1-pba-03-onderbouwen-gebruik-algoritme.md | 14 +- .../1-pba-04-betrek-belanghebbenden.md | 27 +- .../1-pba-05-wettelijke-grondslag.md | 18 +- .../1-pba-06-multidisciplinair-inkoopteam.md | 10 +- ...-owp-01-rollen-en-verantwoordelijkheden.md | 36 +-- .../2-owp-02-data-beschikbaarheid.md | 17 +- ...-owp-03-doel-verwerken-persoonsgegevens.md | 14 +- .../2-owp-04-gebruikte-techniek.md | 36 +-- .../maatregelen/2-owp-05-soort-algoritme.md | 29 +- .../maatregelen/2-owp-06-impactanalyse.md | 32 +- .../2-owp-07-afwegen-grondrechten.md | 22 +- .../maatregelen/2-owp-08-kwetsbare-groepen.md | 16 +- .../2-owp-09-archiveren-documenten.md | 12 +- .../2-owp-10-projectstartarchitectuur.md | 22 +- .../maatregelen/2-owp-11-gebruikte-data.md | 12 +- .../maatregelen/2-owp-12-duurzaam-inkopen.md | 6 +- .../2-owp-13-eenvoudigere-algoritmes.md | 4 +- ...kersovereenkomst-onderdeel-aanbesteding.md | 10 +- ...wp-15-bespreek-vereisten-met-aanbieders.md | 16 +- ...koopvoorwaarden-en-contractovereenkomst.md | 18 +- ...ldoen-aan-vereisten-algoritme-aanbieder.md | 18 +- ...-aanbieder-niet-schenden-auteursrechten.md | 14 +- ...prakelijkheidsvoorwaarden-van-aanbieder.md | 11 +- ...isten-onderdeel-van-subgunningscriteria.md | 18 +- ...-ruimte-voor-samenwerking-met-aanbieder.md | 20 +- ...eren-informatie-technische-documentatie.md | 19 +- ...uitvoeren-audit-voor-naleving-vereisten.md | 22 +- ...ed-besluitvorming-algoritmes-aanbieders.md | 13 +- ...isoverdracht-en-ondersteuning-aanbieder.md | 15 +- ...alyse-informatiebeveiliging-leverancier.md | 8 +- ...isten-onderdeel-van-programma-van-eisen.md | 18 +- ...n-onderdeel-van-service-level-agreement.md | 19 +- ...ntractuele-afspraken-data-en-artefacten.md | 11 +- .../2-owp-30-informeer-betrokkenen.md | 34 +- ...stgestelde-beleidskaders-zijn-nageleefd.md | 10 +- ...-32-toepassen-uitlegbaarheidstechnieken.md | 12 +- ...-33-technische-interventies-robuustheid.md | 29 +- ...p-34-voorkom-kwetsbaarheden-supplychain.md | 16 +- .../2-owp-35-genereren-bronvermelding.md | 22 +- .../2-owp-36-maak-of-koopbeslissing.md | 4 +- .../maatregelen/3-dat-01-datakwaliteit.md | 22 +- ...-dat-02-toetsen-geschiktheid-variabelen.md | 18 +- ...dat-03-bewaartermijnen-persoonsgegevens.md | 12 +- .../3-dat-04-pseudonimiseren-anonimiseren.md | 17 +- .../3-dat-05-schending-auteursrechten.md | 5 +- .../3-dat-06-duurzame-datacenters.md | 10 +- ...3-dat-07-training-validatie-en-testdata.md | 24 +- .../3-dat-08-eigenaarschap-data.md | 6 +- .../maatregelen/3-dat-09-dataminimalisatie.md | 17 +- .../maatregelen/3-dat-10-datamanipulatie.md | 20 +- .../3-dat-11-controleren-inputdata.md | 36 +-- .../maatregelen/3-dat-12-fair-data.md | 36 +-- .../4-owk-01-security-by-design.md | 4 +- .../4-owk-02-stopzetten-gebruik.md | 44 +-- .../maatregelen/4-owk-03-privacyrisico.md | 12 +- .../maatregelen/4-owk-04-logging.md | 10 +- ...k-05-energiezuinige-programmeermethoden.md | 10 +- .../4-owk-07-reproduceerbaarheid.md | 40 +-- .../maatregelen/4-owk-08-feedbackloops.md | 41 ++- .../4-owk-09-adversarial-aanvallen.md | 29 +- ...k-10-voorkom-lekken-op-basis-van-output.md | 15 +- .../4-owk-11-documenteer-parameters.md | 15 +- ...-01-functioneren-in-lijn-met-doeleinden.md | 29 +- .../5-ver-02-evalueer-nauwkeurigheid.md | 24 +- .../maatregelen/5-ver-03-biasanalyse.md | 129 ++++---- .../5-ver-04-representatieve-testomgeving.md | 19 +- ...ver-05-vertaling-wetgeving-naar-systeem.md | 20 +- .../5-ver-06-evalueer-betrouwbaarheid.md | 64 ++-- .../6-imp-01-werkinstructies-gebruikers.md | 40 +-- .../6-imp-02-aselecte-steekproeven.md | 24 +- .../6-imp-03-menselijke-tussenkomst.md | 27 +- .../6-imp-04-publiceren-algoritmeregister.md | 24 +- ...-imp-05-vermelding-in-privacyverklaring.md | 16 +- .../6-imp-06-klacht-bezwaar-beroep.md | 16 +- ...mp-07-vermelding-in-verwerkingsregister.md | 12 +- .../6-imp-08-politiek-bestuurlijk-besluit.md | 15 +- .../maatregelen/6-imp-09-interventies-ux.md | 53 ++-- .../6-imp-10-proces-privacyrechten.md | 12 +- .../maatregelen/7-mon-01-backups-maken.md | 10 +- .../7-mon-02-beveiliging-algoritme.md | 8 +- ...mon-03-informatiebeveiligingsincidenten.md | 12 +- .../maatregelen/7-mon-04-evaluatieplan.md | 25 +- ...n-05-evalueer-bij-veranderingen-in-data.md | 19 +- .../7-mon-06-meten-milieu-impact.md | 2 +- .../7-mon-07-plan-continue-monitoring.md | 21 +- ...on-08-test-weerbaarheid-tegen-aanvallen.md | 16 +- .../maatregelen/8-uit-01-archiveren.md | 15 +- .../maatregelen/index.md | 4 +- .../aia-00-verboden-AI-praktijken.md | 24 +- .../vereisten/aia-01-ai-geletterdheid.md | 30 +- ...entatie-beoordeling-niet-hoog-risico-ai.md | 12 +- .../vereisten/aia-03-risicobeheersysteem.md | 16 +- ...beoordeling-voor-jongeren-en-kwetsbaren.md | 10 +- .../aia-05-data-kwaliteitscriteria.md | 32 +- .../aia-06-technische-documentatie.md | 24 +- .../aia-07-automatische-logregistratie.md | 18 +- ...parantie-aan-gebruiksverantwoordelijken.md | 32 +- .../vereisten/aia-09-menselijk-toezicht.md | 12 +- ...keurigheid-robuustheid-cyberbeveiliging.md | 10 +- .../aia-11-systeem-voor-kwaliteitsbeheer.md | 14 +- .../aia-12-bewaartermijn-voor-documentatie.md | 38 +-- ...13-bewaartermijn-voor-gegenereerde-logs.md | 12 +- .../aia-14-conformiteitsbeoordeling.md | 14 +- .../aia-15-eu-conformiteitsverklaring.md | 12 +- .../vereisten/aia-16-ce-markering.md | 14 +- .../aia-17-registratieverplichtingen.md | 18 +- ...erende-maatregelen-voor-non-conforme-ai.md | 14 +- .../aia-19-toegankelijkheidseisen.md | 12 +- ...-gebruiksverantwoordelijken-maatregelen.md | 10 +- ...ksverantwoordelijken-menselijk-toezicht.md | 16 +- ...iksverantwoordelijken-monitoren-werking.md | 14 +- ...gebruiksverantwoordelijken-bewaren-logs.md | 10 +- .../vereisten/aia-24-informeren-werknemers.md | 10 +- ...twoordelijken-registratieverplichtingen.md | 14 +- .../aia-26-recht-op-uitleg-ai-besluiten.md | 10 +- ...aia-27-beoordelen-gevolgen-grondrechten.md | 10 +- .../aia-28-transparantieverplichtingen.md | 15 +- .../aia-29-ai-modellen-algemene-doeleinden.md | 12 +- ...ellen-algemene-doeleinden-systeemrisico.md | 10 +- ...inden-systeemrisico-ernstige-incidenten.md | 10 +- ...eleinden-systeemrisico-cyberbeveiliging.md | 10 +- .../aia-33-verwerking-in-testomgeving.md | 14 +- ...-monitoring-na-het-in-de-handel-brengen.md | 10 +- .../aia-35-melding-ernstige-incidenten.md | 12 +- ...ia-36-melding-inbreuk-op-ai-verordening.md | 12 +- ...-37-recht-klacht-indienen-bij-ai-bureau.md | 8 +- .../vereisten/aia-38-testen.md | 18 +- ...eid-naleven-auteurs-en-naburige-rechten.md | 20 +- .../vereisten/arc-01-archiefwet.md | 32 +- .../vereisten/aut-01-auteursrechten.md | 28 +- ...oonsgegevens-worden-rechtmatig-verwerkt.md | 10 +- ...rkte-bewaartermijn-van-persoonsgegevens.md | 12 +- ...inimale-verwerking-van-persoonsgegevens.md | 16 +- ...-04-proportionaliteit-en-subsidiariteit.md | 38 +-- ...eid-en-actualiteit-van-persoonsgegevens.md | 10 +- ...06-verantwoordingsplicht-rechtmatigheid.md | 26 +- ...parantie-bij-verwerken-persoonsgegevens.md | 14 +- ...lijke-verwerking-van-gevoelige-gegevens.md | 10 +- ...cyrecht-bij-verwerking-persoonsgegevens.md | 10 +- ...op-niet-geautomatiseerde-besluitvorming.md | 44 +-- ...erp-bij-verwerking-van-persoonsgegevens.md | 10 +- .../avg-12-beveiliging-van-verwerking.md | 24 +- .../vereisten/avg-13-dpia-verplicht.md | 40 +-- .../awb-01-zorgvuldigheidsbeginsel.md | 26 +- .../vereisten/awb-02-motiveringsbeginsel.md | 36 +-- ...liging-informatie-en-informatiesystemen.md | 26 +- .../vereisten/bzk-01-algoritmeregister.md | 26 +- .../vereisten/dat-01-databankenwet.md | 14 +- .../vereisten/grw-01-fundamentele-rechten.md | 12 +- .../vereisten/grw-02-non-discriminatie.md | 34 +- .../vereisten/index.md | 6 +- ...echt-op-toegang-tot-publieke-informatie.md | 10 +- includes/begrippenlijst.md | 10 +- mkdocs.yml | 18 +- script/analysis-maatregelen.py | 68 ++-- script/maatregelen-adr-ark.csv | 4 +- src/overrides/hooks/lists.py | 297 ++++++++++++------ src/overrides/hooks/tags.py | 132 ++++++-- src/overrides/partials/breadcrumbs.html | 4 +- src/overrides/partials/footer.html | 4 +- src/overrides/partials/logo.html | 2 +- templates/template-hulpmiddel.md | 7 +- templates/template-maatregel.md | 14 +- templates/template-vereiste.md | 6 +- 265 files changed, 3305 insertions(+), 2430 deletions(-) create mode 100644 .github/scripts/README.md create mode 100755 .github/scripts/run_all_validations.py create mode 100755 .github/scripts/validate_all_labels.py create mode 100755 .github/scripts/validate_file_prefix_urn.py create mode 100755 .github/scripts/validate_urn_uniqueness.py create mode 100644 .github/workflows/validation.yaml create mode 100644 .pre-commit-config.yaml diff --git a/.github/ISSUE_TEMPLATE/fout-of-bug-melden.md b/.github/ISSUE_TEMPLATE/fout-of-bug-melden.md index d33eebc779..67a9d8537e 100644 --- a/.github/ISSUE_TEMPLATE/fout-of-bug-melden.md +++ b/.github/ISSUE_TEMPLATE/fout-of-bug-melden.md @@ -8,8 +8,7 @@ assignees: '' --- **Beschrijf de fout** -Leg uit wat de fout of bug is die je gevonden hebt. +Leg uit wat de fout of bug is die je gevonden hebt. **Screenshots** -Voeg eventueel een screenshot toe. - +Voeg eventueel een screenshot toe. diff --git a/.github/ISSUE_TEMPLATE/suggestie.md b/.github/ISSUE_TEMPLATE/suggestie.md index 0083579d3d..5631c89670 100644 --- a/.github/ISSUE_TEMPLATE/suggestie.md +++ b/.github/ISSUE_TEMPLATE/suggestie.md @@ -10,4 +10,3 @@ assignees: '' Omschrijving. ## Leg uit waarom dit een goede toevoeging is aan het Algoritmekader - diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 563e6bfff1..8edb2ab6ac 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,7 +3,7 @@ ## Bij welk issue hoort deze pull-request? ## Checklist before requesting a review -- [ ] Ik heb de [contributing guidelines](https://github.com/MinBZK/Algoritmekader/blob/main/CONTRIBUTING.md) van deze repository gelezen en gevolgd. +- [ ] Ik heb de [contributing guidelines](https://github.com/MinBZK/Algoritmekader/blob/main/CONTRIBUTING.md) van deze repository gelezen en gevolgd. - [ ] Ik heb mijn aanpassingen gecheckt op spelfouten. - [ ] Als ik gebruik heb gemaakt van links, dan heb ik gecheckt of deze werken. -- [ ] Ik heb gebruik gemaakt van de templates en formats van het algoritmekader. +- [ ] Ik heb gebruik gemaakt van de templates en formats van het algoritmekader. diff --git a/.github/scripts/README.md b/.github/scripts/README.md new file mode 100644 index 0000000000..a8eb6a51cd --- /dev/null +++ b/.github/scripts/README.md @@ -0,0 +1,48 @@ +# Algoritmekader Validatie Scripts + +Deze map bevat scripts om de kwaliteit en consistentie van het Algoritmekader te valideren. + +## Beschikbare validatiescripts + +- **validate_all_labels.py**: Controleert of alle labels (levenscyclus, onderwerpen, rollen, etc.) in maatregelen en vereisten overeenkomen met toegestane waarden. +- **validate_urn_uniqueness.py**: Controleert of alle URN's uniek zijn binnen het Algoritmekader. +- **validate_file_prefix_urn.py**: Controleert of bestandsnamen beginnen met de juiste prefix uit het URN. +- **run_all_validations.py**: Voert alle bovenstaande scripts in één keer uit. + +## Pre-commit setup + +Voor de beste workflow raden we aan om de validaties te integreren in je git workflow met pre-commit: + +1. Installeer pre-commit: + ``` + pip install pre-commit + ``` + +2. Installeer de pre-commit hooks in je lokale repository: + ``` + pre-commit install + ``` + +Nu zullen alle validaties automatisch worden uitgevoerd wanneer je een `git commit` doet. Als er problemen worden gevonden, zal de commit worden geweigerd en krijg je informatie over wat er moet worden opgelost. + +## Handmatig uitvoeren + +Je kunt alle validaties ook handmatig uitvoeren: + +``` +python run_all_validations.py +``` + +Of een individueel validatiescript uitvoeren: + +``` +python validate_all_labels.py +``` + +## Uitbreiden van de validaties + +Wanneer je een nieuw validatiescript toevoegt: + +1. Voeg het toe aan de `VALIDATION_SCRIPTS` lijst in `run_all_validations.py` +2. Zorg dat het script een exit code 0 retourneert bij succes en een niet-nul exit code bij fouten +3. Update deze README met een beschrijving van je nieuwe script diff --git a/.github/scripts/run_all_validations.py b/.github/scripts/run_all_validations.py new file mode 100755 index 0000000000..8760288126 --- /dev/null +++ b/.github/scripts/run_all_validations.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +""" +Helper script om alle Algoritmekader validatie scripts lokaal uit te voeren + +Gebruik: python run_all_validations.py +""" + +import os +import sys +import subprocess + +# Script configuratie +SCRIPTS_DIR = os.path.dirname(os.path.abspath(__file__)) +VALIDATION_SCRIPTS = [ + "validate_urn_uniqueness.py", + "validate_all_labels.py", + "validate_file_prefix_urn.py", +] + + +def run_script(script_path): + """ + Voer een script uit en geef aan of het succesvol was + """ + script_name = os.path.basename(script_path) + print(f"\n\n==== {script_name} uitvoeren ====\n") + + try: + # Script uitvoeren en output doorsturen naar terminal + result = subprocess.run(["python", script_path], check=False) + return result.returncode == 0 + except Exception as e: + print(f"Fout bij het starten van script {script_path}: {e}") + return False + + +def main(): + has_errors = False + + for script in VALIDATION_SCRIPTS: + script_path = os.path.join(SCRIPTS_DIR, script) + + if os.path.exists(script_path): + if run_script(script_path): + print(f"✅ {script} succesvol uitgevoerd") + else: + print(f"❌ {script} mislukt") + has_errors = True + else: + print(f"⚠️ Script niet gevonden: {script_path}") + has_errors = True + + if has_errors: + print( + "\n❌ Een of meer validatiescripts zijn mislukt. Los de problemen op voordat je commit." + ) + sys.exit(1) + else: + print("\n✅ Alle validatiescripts zijn succesvol uitgevoerd!") + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/.github/scripts/validate_all_labels.py b/.github/scripts/validate_all_labels.py new file mode 100755 index 0000000000..dd3b6866fd --- /dev/null +++ b/.github/scripts/validate_all_labels.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +""" +Script om te valideren dat alle labels in maatregelen en vereisten +overeenkomen met toegestane waarden gedefinieerd in het Algoritmekader: +- levenscycli +- onderwerpen +- rollen +- AI-Verordening gerelateerde labels (alleen voor vereisten) + +Gebruik: python validate_all_labels.py +""" + +import os +import sys +import yaml +import re + +# Configuratie - aangepast voor Algoritmekader repository structuur +BASE_DIR = "docs" +MEASURES_DIR = os.path.join(BASE_DIR, "voldoen-aan-wetten-en-regels/maatregelen") +REQUIREMENTS_DIR = os.path.join(BASE_DIR, "voldoen-aan-wetten-en-regels/vereisten") +ROLES_DIR = os.path.join(BASE_DIR, "rollen") +LIFECYCLE_DIR = os.path.join(BASE_DIR, "levenscyclus") +SUBJECTS_DIR = os.path.join(BASE_DIR, "onderwerpen") +VALID_FILE_EXTENSIONS = [".md"] + +# AI-Verordening specifieke labels (alleen voor vereisten) +VALID_SOORT_TOEPASSING = [ + "ai-systeem", + "ai-systeem-voor-algemene-doeleinden", + "ai-model-voor-algemene-doeleinden", +] + +VALID_RISICOGROEP = [ + "hoog-risico-ai-systeem", + "niet-van-toepassing", + "verboden-ai", + "geen-hoog-risico-ai-systeem", + "uitzondering-van-toepassing", +] + +VALID_TRANSPARANTIEVERPLICHTING = [ + "geen-transparantieverplichting", + "transparantieverplichting", + "niet-van-toepassing", +] + +VALID_SYSTEEMRISICO = [ + "systeemrisico", + "geen-systeemrisico", + "niet-van-toepassing", +] + +VALID_OPEN_SOURCE = ["open-source", "geen-open-source", "niet-van-toepassing"] + +VALID_UITZONDERING = ["risicogroep-uitzondering-van-toepassing"] + +VALID_ROL_AI_ACT = [ + "aanbieder", + "gebruiksverantwoordelijke", + "importeur", + "distributeur", +] + +has_errors = False + + +def get_valid_values_from_directory(directory): + """ + Haalt geldige waarden op uit de bestandsnamen in een directory + Bestandsnamen zonder extensie worden als geldige waarden beschouwd, + behalve index.md + """ + valid_values = [] + if not os.path.exists(directory): + print(f"Waarschuwing: Directory niet gevonden: {directory}") + return valid_values + + for root, _, files in os.walk(directory): + for filename in files: + if filename == "index.md": + continue + + file_ext = os.path.splitext(filename)[1].lower() + if file_ext in VALID_FILE_EXTENSIONS: + value = os.path.splitext(filename)[0] + valid_values.append(value) + + return valid_values + + +def check_labels( + file_path, + is_requirement=False, + valid_lifecycles=None, + valid_subjects=None, + valid_roles=None, +): + """ + Controleer alle labels in een document en rapporteer ongeldige waarden + """ + global has_errors + + with open(file_path, "r", encoding="utf-8") as file: + content = file.read() + + # Voor Markdown bestanden, zoek labels in frontmatter + frontmatter_match = re.search(r"^---\n([\s\S]*?)\n---", content) + if not frontmatter_match: + print(f"Waarschuwing: Geen frontmatter gevonden in {file_path}") + return + + try: + frontmatter = yaml.safe_load(frontmatter_match.group(1)) + + # Controleer levenscyclus + check_label_list(frontmatter, "levenscyclus", valid_lifecycles, file_path) + + # Controleer onderwerpen + check_label_list(frontmatter, "onderwerp", valid_subjects, file_path) + + # Controleer rollen + check_label_list(frontmatter, "rollen", valid_roles, file_path) + + # Voor vereisten, controleer AI-Verordening gerelateerde labels + if is_requirement: + check_label_list( + frontmatter, "soort-toepassing", VALID_SOORT_TOEPASSING, file_path + ) + check_label_list(frontmatter, "risicogroep", VALID_RISICOGROEP, file_path) + check_label_list( + frontmatter, + "transparantieverplichting", + VALID_TRANSPARANTIEVERPLICHTING, + file_path, + ) + check_label_list( + frontmatter, "systeemrisico", VALID_SYSTEEMRISICO, file_path + ) + check_label_list(frontmatter, "open-source", VALID_OPEN_SOURCE, file_path) + check_label_list(frontmatter, "uitzondering", VALID_UITZONDERING, file_path) + check_label_list(frontmatter, "rol-ai-act", VALID_ROL_AI_ACT, file_path) + + except Exception as error: + print(f"Fout bij het parsen van frontmatter in {file_path}: {error}") + has_errors = True + + +def check_label_list(frontmatter, label_name, valid_values, file_path): + """ + Controleer of een label of lijst van labels geldige waarden bevat + """ + global has_errors + + if label_name not in frontmatter: + # Alleen waarschuwen als het een verplicht label is + if label_name in ["levenscyclus", "onderwerp", "rollen"]: + print(f"Waarschuwing: Geen '{label_name}' label gevonden in {file_path}") + return + + values = frontmatter[label_name] + # Verwerk zowel enkele waarden als arrays + label_values = values if isinstance(values, list) else [values] + + for value in label_values: + # Speciale afhandeling voor uitzondering veld met logische expressies + if label_name == "uitzondering" and ( + '"' in value or "(" in value or "||" in value or "&&" in value + ): + # Dit is een complexe logische expressie voor uitzonderingen, accepteer deze + continue + elif valid_values and value not in valid_values: + print(f'ERROR: Ongeldige {label_name}-waarde "{value}" in {file_path}') + print(f" Geldige waarden zijn: {', '.join(valid_values)}") + has_errors = True + + +def scan_directory( + directory, + is_requirement=False, + valid_lifecycles=None, + valid_subjects=None, + valid_roles=None, +): + """ + Scan directory recursief voor bestanden en controleer alle labels + """ + if not os.path.exists(directory): + print(f"Waarschuwing: Directory niet gevonden: {directory}") + return + + for root, _, files in os.walk(directory): + for filename in files: + # Sla index.md bestanden over + if filename == "index.md": + continue + + file_path = os.path.join(root, filename) + file_ext = os.path.splitext(filename)[1].lower() + + if file_ext in VALID_FILE_EXTENSIONS: + check_labels( + file_path, + is_requirement, + valid_lifecycles, + valid_subjects, + valid_roles, + ) + + +def main(): + print("Labels in maatregelen en vereisten controleren...") + + # Haal de geldige waarden op basis van de bestandsstructuur op + print("\nGeldige waarden ophalen uit bestandsstructuur...") + valid_roles = get_valid_values_from_directory(ROLES_DIR) + valid_lifecycles = get_valid_values_from_directory(LIFECYCLE_DIR) + valid_subjects = get_valid_values_from_directory(SUBJECTS_DIR) + + print(f"Opgehaalde levenscycli: {', '.join(valid_lifecycles)}") + print(f"Opgehaalde onderwerpen: {', '.join(valid_subjects)}") + print(f"Opgehaalde rollen: {', '.join(valid_roles)}") + + # Controleer maatregelen + print("\nControleren van maatregelen...") + scan_directory( + MEASURES_DIR, + is_requirement=False, + valid_lifecycles=valid_lifecycles, + valid_subjects=valid_subjects, + valid_roles=valid_roles, + ) + + # Controleer vereisten + print("\nControleren van vereisten...") + scan_directory( + REQUIREMENTS_DIR, + is_requirement=True, + valid_lifecycles=valid_lifecycles, + valid_subjects=valid_subjects, + valid_roles=valid_roles, + ) + + # Rapporteer resultaten + if has_errors: + print("\nValidatie mislukt: Ongeldige label-waarden gevonden") + sys.exit(1) + else: + print("\nSucces! Alle labels zijn geldig.") + print(f"Gevalideerde levenscycli: {', '.join(valid_lifecycles)}") + print(f"Gevalideerde onderwerpen: {', '.join(valid_subjects)}") + print(f"Gevalideerde rollen: {', '.join(valid_roles)}") + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/.github/scripts/validate_file_prefix_urn.py b/.github/scripts/validate_file_prefix_urn.py new file mode 100755 index 0000000000..d38820f8d9 --- /dev/null +++ b/.github/scripts/validate_file_prefix_urn.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +""" +Script om te valideren dat bestandsprefixes overeenkomen met hun URN-waarden +Dit zorgt ervoor dat bestandsnaamconventies consistent zijn met hun inhoud + +Gebruik: python validate_file_prefix_urn.py +""" + +import os +import sys +import yaml +import re + +# Configuratie - aangepast voor Algoritmekader repository structuur +MEASURES_DIR = "docs/voldoen-aan-wetten-en-regels/maatregelen" +REQUIREMENTS_DIR = "docs/voldoen-aan-wetten-en-regels/vereisten" +VALID_FILE_EXTENSIONS = [".md"] + +# Verwacht URN naar bestandsprefix patroon +# bijv. als URN is "urn:nl:ak:mtr:org-02" of "urn:nl:ak:ver:aia-01", +# moet de bestandsnaam beginnen met "org-02-" of "aia-01-" respectievelijk +URN_PREFIX_REGEX = r".*:([^:]+)$" + +has_errors = False + + +def extract_urn(file_path): + """ + Extraheer URN uit een Markdown bestand met frontmatter + """ + with open(file_path, "r", encoding="utf-8") as file: + content = file.read() + + file_ext = os.path.splitext(file_path)[1].lower() + + if file_ext == ".md": + # Voor Markdown bestanden, zoek URN in frontmatter + frontmatter_match = re.search(r"^---\n([\s\S]*?)\n---", content) + if frontmatter_match: + try: + frontmatter = yaml.safe_load(frontmatter_match.group(1)) + # In het Algoritmekader staat de URN in het 'id' veld + return frontmatter.get("id") + except Exception as error: + print(f"Fout bij het parsen van frontmatter in {file_path}: {error}") + global has_errors + has_errors = True + return None + + return None + + +def get_identifier_from_urn(urn): + """ + Extraheer het identifier-deel uit een URN + bijv. uit "urn:nl:ak:mtr:org-02" extraheren we "org-02" + """ + match = re.search(URN_PREFIX_REGEX, urn) + return match.group(1) if match else None + + +def validate_file_prefix(file_path, urn): + """ + Controleer of bestandsnaam de juiste prefix heeft op basis van URN + Ondersteunt ook numerieke voorvoegsels (zoals 0-, 1-, 2-) voor maatregelen + """ + file_name = os.path.basename(file_path) + identifier = get_identifier_from_urn(urn) + + if not identifier: + print(f'ERROR: Kan identifier niet extraheren uit URN "{urn}" in {file_path}') + return False + + # Voor het Algoritmekader kunnen bestanden beginnen met een optioneel numeriek voorvoegsel + # zoals "0-", "1-", "2-" gevolgd door de identifier en een koppelteken + # bijv. "0-org-02-beschrijving-van-maatregel.md" of "org-02-beschrijving-van-maatregel.md" + + # Reguliere expressie patroon voor: optioneel cijfer gevolgd door koppelteken, + # dan de exacte identifier, dan een koppelteken + pattern = rf"^(?:\d+-)?{re.escape(identifier)}-" + + if not re.search(pattern, file_name): + print(f"ERROR: Bestandsprefix komt niet overeen in {file_path}") + print(f" URN: {urn}") + print(f" Verwacht bestandsnaampatroon: [optioneel cijfer-]{identifier}-...") + print(f" Werkelijke bestandsnaam: {file_name}") + return False + + return True + + +def scan_directory(directory): + """ + Scan directory recursief voor bestanden met URNs + """ + if not os.path.exists(directory): + print(f"Waarschuwing: Directory niet gevonden: {directory}") + return + + total_files = 0 + valid_files = 0 + + for root, _, files in os.walk(directory): + for filename in files: + # Sla index.md bestanden over + if filename == "index.md": + continue + + file_path = os.path.join(root, filename) + file_ext = os.path.splitext(filename)[1].lower() + + if file_ext in VALID_FILE_EXTENSIONS: + total_files += 1 + urn = extract_urn(file_path) + + if urn: + if validate_file_prefix(file_path, urn): + valid_files += 1 + else: + global has_errors + has_errors = True + else: + print(f"Waarschuwing: Geen URN gevonden in {file_path}") + + if total_files > 0: + print( + f"Gecontroleerd: {total_files} bestanden in {directory}, {valid_files} hebben geldige prefixes" + ) + + +# Hoofdprogramma +def main(): + print("Bestandsprefix en URN consistentie controleren...") + + # Controleer maatregelen en vereisten directories + scan_directory(MEASURES_DIR) + scan_directory(REQUIREMENTS_DIR) + + # Rapporteer resultaten + if has_errors: + print("\nValidatie mislukt: Bestandsprefix inconsistenties gevonden") + sys.exit(1) + else: + print("\nSucces! Alle bestandsprefixes komen overeen met hun URN-waarden.") + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/.github/scripts/validate_urn_uniqueness.py b/.github/scripts/validate_urn_uniqueness.py new file mode 100755 index 0000000000..7a04a5fa2c --- /dev/null +++ b/.github/scripts/validate_urn_uniqueness.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +""" +Script om te controleren of alle URNs in maatregelen en vereisten uniek zijn + +Gebruik: python validate_urn_uniqueness.py +""" + +import os +import sys +import yaml +import re + +# Configuratie - aangepast voor Algoritmekader repository structuur +MEASURES_DIR = "docs/voldoen-aan-wetten-en-regels/maatregelen" +REQUIREMENTS_DIR = "docs/voldoen-aan-wetten-en-regels/vereisten" +VALID_FILE_EXTENSIONS = [".md"] + +# Sla alle gevonden URNs op met hun bestandspaden voor rapportage +urn_map = {} +has_errors = False + + +def extract_urn(file_path): + """ + Extraheer URN uit een Markdown bestand met frontmatter + """ + with open(file_path, "r", encoding="utf-8") as file: + content = file.read() + + file_ext = os.path.splitext(file_path)[1].lower() + + if file_ext == ".md": + # Voor Markdown bestanden, zoek URN in frontmatter + frontmatter_match = re.search(r"^---\n([\s\S]*?)\n---", content) + if frontmatter_match: + try: + frontmatter = yaml.safe_load(frontmatter_match.group(1)) + # In het Algoritmekader staat de URN in het 'id' veld + return frontmatter.get("id") + except Exception as error: + print(f"Error bij het parsen van frontmatter in {file_path}: {error}") + global has_errors + has_errors = True + return None + + return None + + +def scan_directory(directory): + """ + Scan directory recursief voor bestanden met URNs + """ + if not os.path.exists(directory): + print(f"Waarschuwing: Directory niet gevonden: {directory}") + return + + for root, _, files in os.walk(directory): + for filename in files: + # Sla index.md bestanden over + if filename == "index.md": + continue + + file_path = os.path.join(root, filename) + file_ext = os.path.splitext(filename)[1].lower() + + if file_ext in VALID_FILE_EXTENSIONS: + urn = extract_urn(file_path) + + if urn: + if urn in urn_map: + print(f'ERROR: Dubbele URN gevonden: "{urn}"') + print(f" - {urn_map[urn]}") + print(f" - {file_path}") + global has_errors + has_errors = True + else: + urn_map[urn] = file_path + else: + print(f"Waarschuwing: Geen URN gevonden in {file_path}") + + +# Hoofdprogramma +def main(): + print("URN uniciteit controleren...") + + # Controleer maatregelen en vereisten directories + scan_directory(MEASURES_DIR) + scan_directory(REQUIREMENTS_DIR) + + # Rapporteer resultaten + if has_errors: + print("\nValidatie mislukt: Dubbele URNs gevonden") + sys.exit(1) + elif len(urn_map) == 0: + print( + "\nWaarschuwing: Geen URNs gevonden. Controleer bestandspaden en formaten." + ) + sys.exit(0) + else: + print(f"\nSucces! Alle {len(urn_map)} URNs zijn uniek.") + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/linkchecker.yaml b/.github/workflows/linkchecker.yaml index 96243e0e9b..97ab888f37 100644 --- a/.github/workflows/linkchecker.yaml +++ b/.github/workflows/linkchecker.yaml @@ -4,7 +4,7 @@ on: branches: - main workflow_dispatch: - + jobs: markdown-link-check: @@ -13,4 +13,4 @@ jobs: - uses: actions/checkout@v4 - uses: gaurav-nelson/github-action-markdown-link-check@v1 with: - use-quiet-mode: yes \ No newline at end of file + use-quiet-mode: yes diff --git a/.github/workflows/preview.yaml b/.github/workflows/preview.yaml index a72e04ad4a..473048398a 100644 --- a/.github/workflows/preview.yaml +++ b/.github/workflows/preview.yaml @@ -5,7 +5,7 @@ on: - opened - reopened - synchronize - - closed + - closed concurrency: preview-${{ github.ref }} @@ -25,31 +25,31 @@ jobs: - name: inject version run: | - sed -i 's/development/${{ steps.get_commit_hash.outputs.commit_hash }}/g' docs/version.md + sed -i 's/development/${{ steps.get_commit_hash.outputs.commit_hash }}/g' docs/version.md - name: Add url run: | echo "site_url: https://minbzk.github.io/Algoritmekader/pr-preview/pr-${{github.event.number}}" >> mkdocs.yml - uses: actions/setup-python@v5 - if: github.event.action != 'closed' + if: github.event.action != 'closed' with: python-version: 3.x cache: 'pip' - name: install dependencies - if: github.event.action != 'closed' + if: github.event.action != 'closed' run: | git config --global url."https://github-actions:${{ secrets.MATERIAL_INSIDERS_TOKEN }}@github".insteadOf ssh://git@github pip install -r requirements-prod.txt - name: build preview - if: github.event.action != 'closed' + if: github.event.action != 'closed' run: mkdocs build - uses: actions/upload-artifact@v4 - if: github.event.action != 'closed' - with: + if: github.event.action != 'closed' + with: name: AlgoritmeKaderWebsite-${{github.event.number}} path: ./site/ @@ -57,4 +57,4 @@ jobs: if: github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' uses: rossjrw/pr-preview-action@v1 with: - source-dir: ./site/ \ No newline at end of file + source-dir: ./site/ diff --git a/.github/workflows/run-python-script.yaml b/.github/workflows/run-python-script.yaml index 625d21bdec..10a3671f64 100644 --- a/.github/workflows/run-python-script.yaml +++ b/.github/workflows/run-python-script.yaml @@ -9,7 +9,7 @@ jobs: run-python-script: if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main' runs-on: ubuntu-latest - + steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/validation.yaml b/.github/workflows/validation.yaml new file mode 100644 index 0000000000..d65492dd42 --- /dev/null +++ b/.github/workflows/validation.yaml @@ -0,0 +1,39 @@ +name: Algoritmekader URN en Levenscyclus Validatie + +on: + pull_request: + branches: [ main ] + paths: + - 'docs/voldoen-aan-wetten-en-regels/maatregelen/**' + - 'docs/voldoen-aan-wetten-en-regels/vereisten/**' + push: + branches: [ main ] + paths: + - 'docs/voldoen-aan-wetten-en-regels/maatregelen/**' + - 'docs/voldoen-aan-wetten-en-regels/vereisten/**' + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + cache: 'pip' + + - name: Install dependencies + run: pip install pyyaml + + - name: Validate URN uniqueness + run: python .github/scripts/validate_urn_uniqueness.py + + - name: Validate lifecycles + run: python .github/scripts/validate_all_labels.py + + - name: Validate file prefix and URN consistency + run: python .github/scripts/validate_file_prefix_urn.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..9ef2492553 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,34 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-json + - id: check-yaml + exclude: mkdocs.yml + - id: check-added-large-files + - id: check-merge-conflict +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.9 + hooks: + - id: ruff + - id: ruff-format +# Lokale hooks voor Algoritmekader validaties +- repo: local + hooks: + - id: algoritmekader-validaties + name: Algoritmekader validaties + description: Voert alle validatiescripts uit voor het Algoritmekader + entry: python .github/scripts/run_all_validations.py + language: python + pass_filenames: false + always_run: true + additional_dependencies: [pyyaml] + +ci: + autofix_prs: false + autofix_commit_msg: "Auto fix pre-commit.com hooks" + autoupdate_commit_msg: "Update .pre-commit-config.yaml" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 96d6bf945a..e1ce1e08f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -39,9 +39,9 @@ aan **[algoritmes@minbzk.nl](mailto:algoritmes@minbzk.nl)**. ### Maak een issue aan -Voordat je een [Issues](https://github.com/MinBZK/Algoritmekader/issues) gaat aanmaken, kan je bekijken of jouw vraag al tussen de bestaande [Issues](https://github.com/MinBZK/Algoritmekader/issues) staat. Wellicht staat er al een issue tussen die jou vraag kan beantwoorden. +Voordat je een [Issues](https://github.com/MinBZK/Algoritmekader/issues) gaat aanmaken, kan je bekijken of jouw vraag al tussen de bestaande [Issues](https://github.com/MinBZK/Algoritmekader/issues) staat. Wellicht staat er al een issue tussen die jou vraag kan beantwoorden. -Als je jouw vraag nog steeds wilt stellen, kan je een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aanmaken. +Als je jouw vraag nog steeds wilt stellen, kan je een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aanmaken. 1. Gebruik daarvoor de knop new issue. 2. Schrijf je vraag of opmerking is en geef een heldere toelichting. @@ -53,7 +53,7 @@ Als je jouw vraag nog steeds wilt stellen, kan je een [Issue](https://github.com Je kan je vragen ook altijd stellen door een mail te sturen naar **[algoritmes@minbzk.nl](mailto:algoritmes@minbzk.nl)**. ## Ik wil iets bijdragen -Er zijn verschillende manieren waarop je kan bijdragen. Zie hieronder de mogelijkheden. +Er zijn verschillende manieren waarop je kan bijdragen. Zie hieronder de mogelijkheden. > #### Ter kennisgeving > Wanneer je bijdraagt aan dit project, moet je ermee akkoord gaan dat je 100% van de inhoud hebt geschreven, dat je de benodigde rechten op de inhoud hebt en dat de inhoud die je bijdraagt mag worden geleverd onder de Code of Conduct. @@ -62,19 +62,19 @@ Er zijn verschillende manieren waarop je kan bijdragen. Zie hieronder de mogelij Voor sommige bouwblokken wordt er gewerkt met werkgroepen, om de informatie verder uit te werken. Deelname aan een werkgroep kost tijd. Werkgroepen komen regelmatig bij elkaar, en tussendoor worden bepaalde zaken uitgewerkt door werkgroepleden. Wil je op één van de onderwerpen meewerken? Stuur dan een bericht naar **[algoritmes@minbzk.nl](mailto:algoritmes@minbzk.nl)**. ### Neem deel aan een sprint review / klankbord / demo -Het team van het algoritmekader werkt in sprints van ongeveer 3 weken. Daarin werken we toe naar de volgende release van het Algoritmekader. Ongeveer eens in de 6 weken vindt er een nieuwe release plaats. Wanneer er een release is, wordt deze altijd toegelicht en gepresenteerd in een open online review / demo. Deze kan je vrijblijvend volgen. Zo blijf je op de hoogte en kun je een bijdrage leveren. [Bekijk de agenda op AI en Algoritmes Pleio](https://aienalgoritmes.pleio.nl/events) voor de komende bijeenkomsten. +Het team van het algoritmekader werkt in sprints van ongeveer 3 weken. Daarin werken we toe naar de volgende release van het Algoritmekader. Ongeveer eens in de 6 weken vindt er een nieuwe release plaats. Wanneer er een release is, wordt deze altijd toegelicht en gepresenteerd in een open online review / demo. Deze kan je vrijblijvend volgen. Zo blijf je op de hoogte en kun je een bijdrage leveren. [Bekijk de agenda op Algoritmes Pleio](https://algoritmes.pleio.nl/events) voor de komende bijeenkomsten. ## Ik wil een fout of bug melden -Heb je een foutje gevonden in het Algoritmekader? Dan kan je deze melden door een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aan te maken. +Heb je een foutje gevonden in het Algoritmekader? Dan kan je deze melden door een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aan te maken. -Voordat je een [Issues](https://github.com/MinBZK/Algoritmekader/issues) gaat aanmaken, kan je bekijken of jouw gevonden fout al tussen de bestaande [Issues](https://github.com/MinBZK/Algoritmekader/issues) staat. +Voordat je een [Issues](https://github.com/MinBZK/Algoritmekader/issues) gaat aanmaken, kan je bekijken of jouw gevonden fout al tussen de bestaande [Issues](https://github.com/MinBZK/Algoritmekader/issues) staat. -Als je de gevonden fout nog steeds wilt melden, kan je een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aanmaken. +Als je de gevonden fout nog steeds wilt melden, kan je een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aanmaken. 1. Gebruik daarvoor de knop new issue. -2. Beschrijf de fout duidelijk en geef een heldere toelichting. Voeg waar mogelijk een screenshot toe. +2. Beschrijf de fout duidelijk en geef een heldere toelichting. Voeg waar mogelijk een screenshot toe. 3. Het team van het Algoritmekader zal deze issue labelen als `bug` en pakt jouw issue zo snel mogelijk op. Mogelijk neemt het team van het Algoritmekader contact op voor een verduidelijking of een oplossing. - + ## Ik wil een verbetering voorstellen Heb je een suggestie of wil je een verbetering voorstellen? Dat kan gaan om een compleet nieuwe functionaliteit van de site of om kleine verbeteringen. Het volgen van onderstaande instructie helpt het team van het algoritmekader om je suggestie te begrijpen en gerelateerde suggesties te vinden. @@ -88,36 +88,35 @@ voor de meerderheid van onze gebruikers en niet slechts voor een kleine groep. ### Een issue aanmaken -Als je jouw suggestie nog steeds wilt doen, kan je een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aanmaken. +Als je jouw suggestie nog steeds wilt doen, kan je een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aanmaken. 1. Gebruik daarvoor de knop new issue. 2. Beschrijf duidelijk jouw suggestie en geef een heldere toelichting en onderbouwing waarom dit een goede toevoeging zal zijn aan het Algoritmekader 3. Het team van het Algoritmekader zal deze issue labelen als `enhancement` en pakt jouw issue zo snel mogelijk op. Mogelijk neemt het team van het Algoritmekader contact op voor een verduidelijking of een oplossing. - -> Afhankelijk van de complexiteit en het onderwerp van jouw suggestie kan het even duren voordat deze wordt opgepakt door het team van het Algoritmekader. + +> Afhankelijk van de complexiteit en het onderwerp van jouw suggestie kan het even duren voordat deze wordt opgepakt door het team van het Algoritmekader. ### Een pull-request maken -Kun je niet uit de voeten met de issues? +Kun je niet uit de voeten met de issues? Bijvoorbeeld omdat je verschillende wijzigingsvoorstellen wilt doen? Je kan ook gebruik maken van een [Fork en een Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks). -Het team van Algoritmekader bekijkt daarna jouw aanpassingen en kan bij akkoord jouw aanpassingen *mergen*. Er zijn ook andere manieren om een pull request te doen. [Meer daarover](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request). +Het team van Algoritmekader bekijkt daarna jouw aanpassingen en kan bij akkoord jouw aanpassingen *mergen*. Er zijn ook andere manieren om een pull request te doen. [Meer daarover](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request). -> Afhankelijk van de complexiteit en het onderwerp van jouw suggestie kan het even duren voordat deze wordt opgepakt door het team van het Algoritmekader. +> Afhankelijk van de complexiteit en het onderwerp van jouw suggestie kan het even duren voordat deze wordt opgepakt door het team van het Algoritmekader. > ### Preview van een pull-request -> We maken gebruik van de tool [pr-preview-action](https://github.com/rossjrw/pr-preview-action) om automatisch previews te maken van een pull-request. -Dit maakt het mogelijk om de wijzigingen die zijn gedaan in een pull-request al te bekijken in de uiteindelijke omgeving. -> Wanneer er een pull-request gedaan wordt via een fork, leidt dit helaas tot een error, zie [Issue #79](https://github.com/MinBZK/Algoritmekader/issues/79). Dit blokkeert de pull-request niet. +> We maken gebruik van de tool [pr-preview-action](https://github.com/rossjrw/pr-preview-action) om automatisch previews te maken van een pull-request. +Dit maakt het mogelijk om de wijzigingen die zijn gedaan in een pull-request al te bekijken in de uiteindelijke omgeving. +> Wanneer er een pull-request gedaan wordt via een fork, leidt dit helaas tot een error, zie [Issue #79](https://github.com/MinBZK/Algoritmekader/issues/79). Dit blokkeert de pull-request niet. ## Hoe we werken op Github -We werken met [Markdown](https://www.markdownguide.org/basic-syntax/) bestanden. -Dit is bestandsformaat voor platte tekstbestanden en wordt door veel verschillende tools ondersteund. Dit maakt het eenvoudig om versiebeheer op het Algoritmekader toe te passen. +We werken met [Markdown](https://www.markdownguide.org/basic-syntax/) bestanden. +Dit is bestandsformaat voor platte tekstbestanden en wordt door veel verschillende tools ondersteund. Dit maakt het eenvoudig om versiebeheer op het Algoritmekader toe te passen. -Daarnaast maken gebruik van [mkdocs](https://www.mkdocs.org/) en [material for mkdocs](https://squidfunk.github.io/mkdocs-material/) om de informatie op een interactieve wijze inzichtelijk te maken op de website van [het Algoritmekader](https://minbzk.github.io/Algoritmekader/). +Daarnaast maken gebruik van [mkdocs](https://www.mkdocs.org/) en [material for mkdocs](https://squidfunk.github.io/mkdocs-material/) om de informatie op een interactieve wijze inzichtelijk te maken op de website van [het Algoritmekader](https://minbzk.github.io/Algoritmekader/). ### Wil je een nieuwe pagina aanmaken? -In het [mkdocs.yml](https://github.com/MinBZK/Algoritmekader/blob/main/mkdocs.yml) bestand staan de settings voor deze website. +In het [mkdocs.yml](https://github.com/MinBZK/Algoritmekader/blob/main/mkdocs.yml) bestand staan de settings voor deze website. In principe hoef je hier niets aan aan te passen, maar als je een nieuwe pagina wilt aanmaken kan het nodig zijn om hier een aanpassing in te doen. -Onderdeel van deze settings is namelijk de navigatie voor de site (welke pagina's zijn zichtbaar, en welke pagina's vallen daaronder). Dit staat in de nav: sectie. +Onderdeel van deze settings is namelijk de navigatie voor de site (welke pagina's zijn zichtbaar, en welke pagina's vallen daaronder). Dit staat in de nav: sectie. Indien je een nieuwe pagina wilt toevoegen, is het vaak nodig deze wijziging ook door te voeren in het [mkdocs.yml](https://github.com/MinBZK/Algoritmekader/blob/main/mkdocs.yml) bestand. - diff --git a/LICENSE.md b/LICENSE.md index 72261d7c71..ed38ebab56 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -285,4 +285,4 @@ the rights granted in Article 2 of this Licence and protect the covered Source Code from exclusive appropriation. All other changes or additions to this Appendix require the production of a new -EUPL version. \ No newline at end of file +EUPL version. diff --git a/README.md b/README.md index fa3242f897..27b2c02c84 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,37 @@ betaalde versie mogelijk te maken, zit in `requirements.txt` de publiek toegange [mkdocs-material](https://pypi.org/project/mkdocs-material/) Python package met beperkte functionaliteit. In deze versie werken de navigatie broodkruimels niet. + +## Validatie Tools + +In de map `.github/scripts` vind je scripts die de consistentie van het Algoritmekader controleren: + +- `validate_urn_uniqueness.py`: Controleert of alle URNs uniek zijn +- `validate_lifecycles.py`: Controleert of levenscyclus-waarden geldig zijn +- `validate_file_prefix_urn.py`: Controleert of bestandsnamen overeenkomen met URNs + +### Gebruik + +Bij pull requests worden deze validaties automatisch uitgevoerd via GitHub Actions. Je kunt ze ook lokaal draaien: + +```bash +# Installeer benodigde dependencies +pip install pyyaml + +# Voer alle validaties uit +python .github/scripts/run_all_validations.py +``` + +De scripts controleren: +- Dat er geen dubbele URNs zijn (bijvoorbeeld `urn:nl:ak:mtr:org-02`) +- Dat alle levenscyclus-waarden geldig zijn (zoals `organisatieverantwoordelijkheden`, `ontwikkelen`) +- Dat bestandsnamen consistent zijn met hun URNs + +Index bestanden (`index.md`) worden automatisch overgeslagen en bestandsnamen met numerieke voorvoegsels (zoals `0-org-01-...`) worden correct herkend. + +Voor meer details, zie de README in de `.github/scripts` map. + + ## Vragen? Maak een [Issue](https://github.com/MinBZK/Algoritmekader/issues) aan op GitHub. Of stuur een e-mail naar diff --git a/docs/html/ai-verordening-popup.html b/docs/html/ai-verordening-popup.html index c3f176c0c0..62e9fed6d3 100644 --- a/docs/html/ai-verordening-popup.html +++ b/docs/html/ai-verordening-popup.html @@ -1,5 +1,5 @@
- +

Bepaal je AI-verordening profiel

Vul de velden hieronder in om je AI-verordeningprofiel samen te stellen.
@@ -31,7 +31,7 @@

Bepaal je AI-verordening profiel