Best Practices Webontwikkeling 2026: Performance, Beveiliging & A11y
Webontwikkeling Best Practices 2026: Performance, Beveiliging en Toegankelijkheid
Ik bouw al meer dan tien jaar voor het web, en ik kan je vertellen dat de lat nog nooit zo hoog is geweest. In 2026 betekent het uitbrengen van een website het bereiken van Core Web Vitals-drempels, voldoen aan WCAG 2.2 AA-toegankelijkheidsnormen, verdediging tegen OWASP Top 10-bedreigingen, het structureren van inhoud met semantische HTML en schema.org, en -- hier is de nieuwe -- je inhoud citeerbaar maken voor AI-systemen. Dat zijn veel borden tegelijk. Maar hier is het ding: dit zijn geen afzonderlijke punten. Ze zijn diep onderling verbonden. Een goed gestructureerde, semantische pagina is van nature toegankelijker, presteert beter, rankt hoger en is gemakkelijker voor AI-modellen om te analyseren. Dit artikel is mijn poging om wat werkelijk belangrijk is te destilleren tot concrete, copy-paste-klare richtlijnen. Geen gezwam, geen vaag advies. Laten we beginnen.
Inhoudsopgave
- Performance en Core Web Vitals
- Toegankelijkheid en WCAG 2.2 AA
- Beveiliging en OWASP Top 10
- Semantische HTML Correct
- Schema Markup voor Uitgebreide Resultaten
- AI Citaatgereedheid
- Alles Samenbrengen: Een Checklist
- Veelgestelde Vragen

Performance en Core Web Vitals
Google's Core Web Vitals blijven in 2026 de definitieve prestatiebenchmark. De drie metrieken zijn niet veranderd, maar de drempels en meetmethodologie zijn verscherpt. Als je bouwt met Next.js of Astro, heb je al een voorsprint -- maar frameworks redden je niet van slechte beslissingen.
De Drie Metrieken Die Tellen
| Metriek | Wat Het Meet | Goed Drempel (p75) | Veel Voorkomende Boosdoener |
|---|---|---|---|
| LCP (Largest Contentful Paint) | Laadsnelheid van hoofdinhoud | ≤ 2,5s | Niet-geoptimaliseerde hero-afbeeldingen, render-blocking CSS |
| INP (Interaction to Next Paint) | Responsiviteit op gebruikersinvoer | ≤ 200ms | Zware main-thread JS, hydration-storms |
| CLS (Cumulative Layout Shift) | Visuele stabiliteit | ≤ 0,1 | Ontbrekende afbeeldingsdimensies, geïnjecteerde advertenties |
INP verving FID in maart 2024, en het is een veel moeilijker metriek om te behalen. FID mat alleen invoervertraging; INP meet de hele levenscyclus van elke interactie -- vertraging, verwerking en presentatie. Je kunt het niet bedriegen met lazy event handlers.
LCP: Win Het Met Resource Hints en Server-First Rendering
De grootste LCP-winst die ik heb gezien bij klantprojecten is het voorladen van de hero-afbeelding en het gebruik van server-side rendering om de JS-parse-then-fetch waterfal te vermijden.
<!-- Preload je LCP-afbeelding in de <head> -->
<link
rel="preload"
as="image"
href="/images/hero.webp"
type="image/webp"
fetchpriority="high"
/>
<!-- Gebruik fetchpriority op het img-element zelf -->
<img
src="/images/hero.webp"
alt="Team collaborating on web project"
width="1200"
height="630"
fetchpriority="high"
decoding="async"
/>
In Next.js 15+ verwerkt de <Image>-component veel hiervan automatisch, maar je moet je LCP-afbeelding nog steeds markeren met priority:
import Image from 'next/image';
export default function Hero() {
return (
<Image
src="/images/hero.webp"
alt="Team collaborating on web project"
width={1200}
height={630}
priority // tells Next.js to preload this
/>
);
}
INP: Stop Met de Main Thread Te Blokkeren
INP-fouten zijn bijna altijd terug te voeren op JavaScript dat de main thread blokkeert tijdens gebruikersinteracties. De oplossing is het opsplitsen van lange taken. Hier is een patroon dat ik voortdurend gebruik:
// Yield to the browser between heavy operations
function yieldToMain(): Promise<void> {
return new Promise((resolve) => {
if ('scheduler' in globalThis && 'yield' in scheduler) {
// Use the Scheduler API if available (Chrome 115+)
scheduler.yield().then(resolve);
} else {
setTimeout(resolve, 0);
}
});
}
async function processLargeList(items: Item[]) {
for (let i = 0; i < items.length; i++) {
processItem(items[i]);
if (i % 50 === 0) {
await yieldToMain(); // Let the browser breathe
}
}
}
De scheduler.yield()-API is een stille... een stille revolutie geweest. Anders dan setTimeout(0) behoudt het taakprioriteit, zodat je werk meteen opnieuw begint zonder naar de achterkant van de wachtrij te worden geduwd.
CLS: Expliciete Dimensies Overal
CLS is de gemakkelijkste metriek om te behalen en de meest beschamende om te mislukken. Stel altijd expliciete width en height in op afbeeldingen en video's. Gebruik CSS aspect-ratio voor responsieve containers:
.video-embed {
aspect-ratio: 16 / 9;
width: 100%;
background: #1a1a1a; /* placeholder color while loading */
}
Toegankelijkheid en WCAG 2.2 AA
WCAG 2.2 werd in oktober 2023 een W3C-aanbeveling, en in 2026 is het de basislijnverwachting. Meerdere jurisdicties -- de European Accessibility Act (EAA) van de EU trad op 15 juni 2025 in werking, en het Amerikaanse Department of Justice past ADA Title II toe op webinhoud -- hebben nu juridische sterkte achter deze normen. Het achteraf aanpassen van toegankelijkheid kost 5-10 keer meer dan het van het begin af aan inbouwen. Ik heb de facturen gezien.
Belangrijke WCAG 2.2 Toevoegingen Die Je Moet Kennen
| Succescriterium | Niveau | Wat Het Vereist |
|---|---|---|
| 2.4.11 Focus Not Obscured (Min) | AA | Gefocust element moet minstens gedeeltelijk zichtbaar zijn |
| 2.4.12 Focus Not Obscured (Enhanced) | AAA | Gefocust element moet volledig zichtbaar zijn |
| 2.4.13 Focus Appearance | AAA | Focus-indicator ≥ 2px outline, ≥ 3:1 contrast |
| 2.5.7 Dragging Movements | AA | Elke sleep-actie heeft een niet-sleep-alternatief nodig |
| 2.5.8 Target Size (Minimum) | AA | Interactieve doelen ≥ 24×24 CSS-pixels |
| 3.3.7 Redundant Entry | A | Laat gebruikers niet opnieuw informatie invoeren die al is gegeven |
| 3.3.8 Accessible Authentication (Min) | AA | Geen cognitieve functietests voor login (bijv. CAPTCHA's) |
| 3.3.9 Accessible Authentication (Enhanced) | AAA | Geen herkenning van objecten of persoonlijke inhoud |
Focus-indicatoren Die Werkelijk Werken
De standaard browser focus-ring is vaak onzichtbaar op donkere achtergronden. Hier is een patroon dat universeel werkt:
:focus-visible {
outline: 3px solid #4A90D9;
outline-offset: 2px;
border-radius: 2px;
}
/* High contrast mode support */
@media (forced-colors: active) {
:focus-visible {
outline: 3px solid LinkText;
}
}
Opmerking: gebruik :focus-visible (niet :focus) zodat muisgebruikers geen afleidende omtrekken op elke klik krijgen. Browsers tonen :focus-visible alleen voor toetsenbordnavigatie.
Doelgrootte: Het 24px Minimum
WCAG 2.5.8 vereist dat interactieve doelen minstens 24×24 CSS-pixels zijn, met enkele uitzonderingen voor inline-links en browser-standaardbesturingselementen. Ik voeg een hulpprogrammaklasse toe:
.touch-target {
min-width: 44px; /* Apple HIG and WCAG AAA recommend 44px */
min-height: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* For icon buttons that visually look small but need a large hit area */
.icon-button {
position: relative;
padding: 12px;
}
Geautomatiseerde Tests in CI
Voer axe-core uit in je CI-pijplijn. Het vangt ongeveer 30-40% van de toegankelijkheidsproblemen automatisch op -- wat laag klinkt, maar dit zijn de gemakkelijke problemen die niet door zouden moeten glippen. Hier is hoe we het verbinden met Playwright:
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test('homepage has no a11y violations', async ({ page }) => {
await page.goto('/');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])
.analyze();
expect(results.violations).toEqual([]);
});
Geautomatiseerde tests zijn noodzakelijk maar niet voldoende. Je hebt ook handmatig testen nodig met een schermlezer (NVDA op Windows, VoiceOver op macOS) en toetsenbordnavigatie alleen. Plan daar tijd voor in.
Beveiliging en OWASP Top 10
Het Verizon Data Breach Investigations Report 2025 bevestigde wat we al wisten: webapplicaties blijven de #1 inbraakVector. De OWASP Top 10:2025 herscramde de lijst, met verbroken toegangscontrole nog steeds op #1, beveiligingsconfiguratie op #2, en supply-chain-fouten stijgend naar #3.
Beveiligingsheaders: Jouw Eerste Verdedigingslinie
Elke respons van je server moet deze headers bevatten. Hier is wat ik in een Next.js middleware stel:
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const response = NextResponse.next();
const headers = response.headers;
// Content Security Policy -- tune this to your needs
headers.set(
'Content-Security-Policy',
[
"default-src 'self'",
"script-src 'self' 'nonce-${nonce}'", // use nonces, not unsafe-inline
"style-src 'self' 'unsafe-inline'", // CSS-in-JS often needs this, unfortunately
"img-src 'self' data: https://cdn.example.com",
"font-src 'self'",
"connect-src 'self' https://api.example.com",
"frame-ancestors 'none'",
"base-uri 'self'",
"form-action 'self'",
].join('; ')
);
headers.set('X-Content-Type-Options', 'nosniff');
headers.set('X-Frame-Options', 'DENY');
headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
headers.set(
'Strict-Transport-Security',
'max-age=63072000; includeSubDomains; preload'
);
return response;
}
Invoervalidatie: Vertrouw Niets
Elk stukje gebruikersinvoer is vijandig totdat het anders bewezen is. Gebruik Zod voor runtime-validatie in TypeScript -- het is om goede reden de standaard geworden:
import { z } from 'zod';
const ContactFormSchema = z.object({
name: z.string().min(1).max(100).trim(),
email: z.string().email().max(254),
message: z.string().min(10).max(5000).trim(),
// Honeypot field -- should always be empty
website: z.string().max(0).optional(),
});
export async function handleContact(formData: FormData) {
const parsed = ContactFormSchema.safeParse({
name: formData.get('name'),
email: formData.get('email'),
message: formData.get('message'),
website: formData.get('website'),
});
if (!parsed.success) {
return { error: 'Invalid form data', issues: parsed.error.flatten() };
}
// Now parsed.data is typed and validated
await saveContact(parsed.data);
}
Beveiligingsvoorraden van Afhankelijkheden
Met supply-chain-aanvallen op #3 van OWASP's lijst, kun je niet zomaar npm install en vergeten. Zet exacte versies vast met een lockfile, audit regelmatig, en overweeg tools als Socket.dev die pakketgedrag analyseren (niet alleen bekende CVE's). Voeg dit toe aan je CI:
# .github/workflows/security.yml
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm audit --audit-level=high
- run: npx socket-security/cli report

Semantische HTML Correct
Semantische HTML is het fundament waarop alles verder is gebaseerd. Schermlezers vertrouwen erop. Zoekmachines vertrouwen erop. AI-modellen vertrouwen erop. En toch zie ik overal nog steeds <div>-soep.
De Semantische Elementen Die Je Werkelijk Zou Moeten Gebruiken
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Page Title -- Site Name</title>
</head>
<body>
<header>
<nav aria-label="Main navigation">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<article>
<h1>Article Title</h1>
<p>Published <time datetime="2026-05-15">May 15, 2026</time></p>
<section aria-labelledby="intro-heading">
<h2 id="intro-heading">Introduction</h2>
<p>Content here...</p>
</section>
<figure>
<img src="/chart.webp" alt="Bar chart showing 40% improvement in LCP" width="800" height="450">
<figcaption>LCP improvements after optimization (Source: internal testing)</figcaption>
</figure>
</article>
<aside aria-label="Related articles">
<h2>Related Reading</h2>
<!-- related content -->
</aside>
</main>
<footer>
<p>© 2026 Company Name</p>
</footer>
</body>
</html>
Een paar dingen om op te merken: aria-label op <nav> en <aside> zodat schermlezers kunnen onderscheid maken tussen meerdere landmarkgebieden. <time> met een machine-leesbare datetime-kenmerk. <figure> en <figcaption> voor afbeeldingen met bijschriften. Één <h1> per pagina, met een logische kopniveauhiërarchie.
Schema Markup voor Uitgebreide Resultaten
Gestructureerde gegevens vertellen zoekmachines wat je inhoud is, niet alleen wat het zegt. In 2026 is schema.org-markup basisvoorwaarde voor uitgebreide resultaten -- veelgestelde vragen, how-tos, artikelen, producten, broodkruimels en informatie over organisaties.
JSON-LD: Het Aanbevolen Formaat
Google adviseert expliciet JSON-LD boven microdata of RDFa. Hier is een volledige Article-schema:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "Web Development Best Practices 2026",
"description": "A practical guide covering Core Web Vitals, WCAG 2.2, OWASP security, and AI readiness.",
"author": {
"@type": "Organization",
"name": "Social Animal",
"url": "https://socialanimal.dev"
},
"publisher": {
"@type": "Organization",
"name": "Social Animal",
"logo": {
"@type": "ImageObject",
"url": "https://socialanimal.dev/logo.png"
}
},
"datePublished": "2026-05-15",
"dateModified": "2026-05-15",
"image": "https://socialanimal.dev/images/best-practices-2026.webp",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://socialanimal.dev/blog/web-development-best-practices-2026"
}
}
</script>
Veelgestelde Vragen Schema
Als je een FAQ-sectie hebt (zoals aan de onderkant van dit artikel), mark het dan:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What are Core Web Vitals thresholds in 2026?",
"acceptedAnswer": {
"@type": "Answer",
"text": "LCP ≤ 2.5s, INP ≤ 200ms, CLS ≤ 0.1, all measured at the 75th percentile."
}
}
]
}
</script>
Valideer je gestructureerde gegevens met Google's Rich Results Test voordat je implementeert. Verbroken schema is erger dan geen schema -- het kan handmatige acties activeren.
AI Citaatgereedheid
Dit is de nieuwe grens. Met AI-zoekfuncties (Google's AI Overviews, Perplexity, ChatGPT met browsen, Bing Copilot) die een toenemend aandeel van het verkeer aandrijven, moet je inhoud zo gestructureerd zijn dat AI-systemen deze correct kunnen parseren, toewijzen en citeren.
Wat Maakt Inhoud AI-Citeerbaar?
AI-modellen geven de voorkeur aan inhoud die:
- Vragen rechtstreeks beantwoordt -- begin met het antwoord, leg dan uit. Dit weerspiegelt de omgekeerde piramidestijl die journalisten al een eeuw gebruiken.
- Heeft een duidelijke hiërarchische structuur -- juiste kopniveaus (H1 → H2 → H3), niet alleen vetgedrukte tekst die doet alsof het koppen zijn.
- Gebruikt gestructureerde gegevens -- schema.org geeft AI-systemen context waarop machines kunnen lezen over auteurschap, datums en inhoudstype.
- Bevat feitelijke beweringen met bronnen -- citeer specifieke getallen, onderzoeken en datums. AI-systemen kennen hogere betrouwbaarheid toe aan inhoud met verifieerbare beweringen.
- Verklaart auteurschap duidelijk -- heb een bio van de auteur met referenties, link naar sociale profielen, en gebruik
author-schema.
Auteurschap en E-E-A-T Signalen
Google's E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) kader beïnvloedt sterk welke inhoud AI-systemen kiezen om te citeren. Hier is hoe je het codeert:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Jane Developer",
"jobTitle": "Senior Frontend Engineer",
"worksFor": {
"@type": "Organization",
"name": "Social Animal",
"url": "https://socialanimal.dev"
},
"sameAs": [
"https://github.com/janedeveloper",
"https://linkedin.com/in/janedeveloper"
],
"knowsAbout": ["Next.js", "Web Performance", "Accessibility"]
}
</script>
Inhoudspatronen Die AI-Modellen Prefereren
Hier is een praktisch voorbeeld. In plaats van het antwoord te verbergen:
<!-- ❌ Slecht: antwoord verborgen in derde alinea -->
## What LCP Score Is Good?
LCP stands for Largest Contentful Paint and it measures...
(three paragraphs later)
...so a good LCP score is 2.5 seconds or less.
<!-- ✅ Goed: antwoord-eerst patroon -->
## What LCP Score Is Good?
A good LCP score is 2.5 seconds or less, measured at the 75th
percentile. LCP measures how quickly the largest visible content
element -- typically a hero image or heading -- renders on screen.
Dit antwoord-eerst patroon is wat in door AI gegenereerde samenvattingen wordt gehaald. Het is ook gewoon beter schrijven.
Alles Samenbrengen: Een Checklist
Dit is wat ik doorloop voordat een project wordt geleverd. Gebruik het als een pre-launch audit:
| Categorie | Controle | Gereedschap |
|---|---|---|
| Performance | LCP ≤ 2,5s op 3G | Lighthouse, WebPageTest |
| Performance | INP ≤ 200ms op midrange apparaat | Chrome DevTools, CrUX |
| Performance | CLS ≤ 0,1 | Lighthouse |
| Toegankelijkheid | axe-core retourneert 0 schendingen (WCAG 2.2 AA) | @axe-core/playwright |
| Toegankelijkheid | Volledige toetsenbordnavigatie werkt | Handmatig testen |
| Toegankelijkheid | Schermlezer kondigt alle inhoud logisch aan | NVDA / VoiceOver |
| Toegankelijkheid | Raakdoelen ≥ 24px (idealiter 44px) | Handmatige audit |
| Beveiliging | Alle beveiligingsheaders aanwezig | securityheaders.com |
| Beveiliging | CSP blokkeert inline scripts | Observatory |
| Beveiliging | npm audit schoon op high niveau |
npm audit |
| Beveiliging | Invoervalidatie op alle endpoints | Zod / code review |
| HTML | Geldige, semantische markup | W3C Validator |
| Schema | Gestructureerde gegevens valideren | Rich Results Test |
| AI Gereedheid | Antwoord-eerst inhoudsstructuur | Handmatige beoordeling |
| AI Gereedheid | Authorschema met referenties | Rich Results Test |
Als je hulp nodig hebt bij het implementeren van dit alles op een headless CMS project, of je nu Next.js of Astro gebruikt, bekijk dan onze mogelijkheden of neem contact met ons op.
Veelgestelde Vragen
Wat zijn de Core Web Vitals-drempels in 2026? De drempels blijven LCP ≤ 2,5 seconden, INP ≤ 200 milliseconden en CLS ≤ 0,1, allemaal gemeten op het 75e percentiel van echte gebruikersgegevens. INP verving FID in maart 2024 en is aanzienlijk moeilijker om te bereiken omdat het elke interactie meet, niet alleen de eerste.
Is WCAG 2.2 AA juridisch vereist? Het hangt af van je rechtsmacht, maar steeds vaker ja. De European Accessibility Act (EAA) van de EU trad op 15 juni 2025 in werking en verwijst naar WCAG 2.2. In de VS hebben rechtbanken consequent ADA-vereisten op websites toegepast, en WCAG 2.2 AA is de benchmark waar rechtbanken naar verwijzen. Ook als het niet expliciet verplicht is, is het de de facto standaard geworden -- wat betekent dat je juridisch risico kunt lopen door het te negeren.
Wat is het verschil tussen WCAG 2.1 en WCAG 2.2? WCAG 2.2 voegt negen nieuwe succescriteria toe bovenop 2.1, gericht op focus-verschijning, sleep-alternatieven, doelgrootteminima, redundante invoer en toegankelijke authenticatie. Het veroudert ook 4.1.1 Parsing, omdat moderne browsers HTML-parsefouten gracieus verwerken. De grootste praktische impact voor de meeste teams is het 24×24px minimale doelformaat (2.5.8) en de toegankelijke authenticatievereiste (3.3.8), die effectief traditionele CAPTCHA's verbiedt.
Hoe verbeter ik INP (Interaction to Next Paint)?
Begin met het profileren van je site met Chrome DevTools 'Performance-paneel om lange taken (meer dan 50ms) te identificeren. De meest voorkomende fixes zijn: lange JavaScript-taken opsplitsen met scheduler.yield() of setTimeout, hydratiekosten verminderen met React Server Components of partiële hydratatie, event handlers debouncinged of throttling, en zware berekeningen naar Web Workers verplaatsen. De scheduler.yield()-API is bijzonder handig omdat het naar de browser brengt zonder taakprioriteit te verliezen.
Op welke OWASP Top 10-kwetsbaarheden zou ik me eerst moeten concentreren? Verbroken toegangscontrole (#1), beveiligingsconfiguratie (#2) en supply-chain-fouten (#3) zijn waar de meeste echte inbreuken gebeuren volgens de OWASP Top 10:2025 en het 2025 Verizon DBIR. Praktisch gezien betekent dit: voer juiste autorisatiecontroles uit op elk endpoint (niet alleen frontend), stel alle beveiligingsheaders in (CSP, HSTS, X-Content-Type-Options), valideer alle invoer met een bibliotheek als Zod, en audit je npm-afhankelijkheden regelmatig.
Helpt schema markup werkelijk SEO in 2026? Ja, maar niet direct als rankingfactor. Schema markup schakelt uitgebreide resultaten in zoeken (FAQ-dropdowns, artikelkaarten, broodkruimels, productbeoordelingen) in die de click-through-tarief dramatisch verbeteren. Google heeft gesteld dat gestructureerde gegevens niet per se een rankingfactor zijn, maar de CTR-verbetering van uitgebreide resultaten maakt het effectief wel een factor. Het is ook steeds belangrijker voor AI-zoeksystemen als Google's AI Overviews, die gestructureerde gegevens gebruiken om gezaghebbende bronnen te identificeren.
Hoe maak ik mijn inhoud meer waarschijnlijk om te worden geciteerd door AI-zoekfunctie? Structureer je inhoud met duidelijke koppen, leid elke sectie in met een direct antwoord op de vraag die de kop stelt, neem specifieke gegevenspunten met bronnen op, gebruik schema.org markup voor auteurschap en inhoudstype, en handhaaf sterke E-E-A-T signalen (auteur bio's, referenties, backlinks van gezaghebbende bronnen). AI-systemen geven de voorkeur aan inhoud die feitelijk, goed gestructureerd is en duidelijk aan geloofwaardige auteurs of organisaties is toegeschreven.
Wat is de beste manier om webtoegang te testen? Gebruik een drielaagse benadering: geautomatiseerde tests met axe-core in CI (vangt ~30-40% van problemen op), handmatig toetsenbord- en schermlezer testen (vangt interactie- en leesvolgordeproblemen op), en periodieke audits door gebruikers met een handicap. Geen enkel hulpmiddel vangt alles. Geautomatiseerde tests zijn geweldig om ontbrekende alt-tekst, contrast-fouten en ARIA-misbruik op te vangen, maar ze kunnen niet zeggen of je formulierstroom logisch is of of je foutmeldingen nuttig zijn.