AI-schrijfpatronen

Vindt en schrapt de typische AI-tics in Nederlandse en Engelse teksten, met een aparte modus voor SEO-audits.

.zip, 12,9 kBversie 1.0.0bijgewerkt op

Wat doet deze skill?

AI-tekst valt zelden op door één woord. Het zit in het ritme: zinnen van dezelfde lengte, een vaststelling gevolgd door een opdracht, “niet X, maar Y”, drie parallelle zinnen, een samenvatting die herhaalt wat er net stond. Deze skill zoekt die patronen op, telt ze en legt per vondst uit waarom ze opvalt.

Hij kan de tekst ook herschrijven. Dat is een ingreep op ritme en zinsbouw, geen inhoudelijke redactie: feiten, cijfers, links en structuur blijven staan. Daarnaast levert hij meetbare schrijfregels die je in een andere prompt of skill plakt, en heeft hij een auditmodus voor SEO-rapporten en actielijsten.

Hoe werkt het?

  1. Je plakt of uploadt een tekst en zegt wat je wil: scannen, herschrijven, regels of een auditcontrole.
  2. Bij scannen draait Claude een kleine scanner (een Python-script zonder dependencies) of loopt hij de patronen handmatig af als code uitvoeren niet kan.
  3. Hij controleert elke vondst zelf, zodat een opsomming van drie echte dingen niet als tic wordt gemeld.
  4. Bij herschrijven scant hij eerst, herschrijft daarna en scant opnieuw. De score moet minstens een derde lager liggen.
  5. In de auditmodus toetst hij bevindingen ook aan tien stijlregels uit de Google developer documentation style guide en aan de schrijfhouding van Google Search Central.

Wat je krijgt

  • Een score met uitleg en letterlijke citaten per gevonden patroon
  • Een herschreven versie met een korte lijst van wat er veranderde
  • Een blok schrijfregels in het Nederlands, Engels of beide, klaar om te plakken
  • Bij audits: aparte lijsten voor AI-patronen, stijlregels en bevindingen zonder effectinschatting of tijdsmarge

Goed om te weten

De skill bewijst niet wie een tekst schreef. Mensen schrijven ook zo, en een goede AI-tekst kan alle controles doorstaan. Het is een stijlscan, geen detector.

De scanner werkt op vorm, dus Claude beoordeelt elke vondst nog zelf. In Claude.ai heb je code-uitvoering nodig voor de exacte score; zonder krijg je een handmatige inschatting.

Je tekst blijft in je eigen Claude-gesprek. De skill stuurt niets naar Depends.

Zo start je hem

Typ een van deze zinnen in een nieuw gesprek, of iets gelijkaardigs.

  • Klinkt deze tekst als AI? Scan hem en toon waar het misloopt.
  • Herschrijf deze categorietekst zonder AI-tics, maar verander niets aan de inhoud.
  • Geef me schrijfregels tegen AI-stijl die ik in mijn systeemprompt kan plakken.
  • Controleer de bevindingen in deze SEO-audit op stijl en op ontbrekende effectinschattingen.

Wat er in de zip zit

5 bestanden, allemaal gewone tekst. Lees ze gerust na voor je de skill installeert.

ai-schrijfpatronen/SKILL.md5,9 kB
---
name: ai-schrijfpatronen
description: Herkent en verwijdert typische AI-schrijfpatronen in Nederlandse en Engelse teksten, zoals statement-plus-imperatief, omkeringen (niet X maar Y), drieslagen, losse fragmenten, vlakke zinslengte, holle overgangszinnen en em-dashes. Vier routes, scannen met een dichtheidsscore, herschrijven met behoud van inhoud, meetbare schrijfregels leveren voor een prompt of skill, en een auditmodus voor SEO-audits, bevindingen en actielijsten op basis van de Google developer documentation style guide en de schrijfhouding van Google Search Central. Gebruik deze skill wanneer de gebruiker vraagt of een tekst als AI klinkt, een tekst menselijker wil maken, AI-tics wil schrappen, schrijfregels tegen AI-stijl wil, of een audit, issue-omschrijving of aanbeveling strakker wil formuleren. Triggers zijn onder meer klinkt dit als AI, scan deze tekst, haal de AI-tics eruit, maak dit menselijker, herschrijf zonder AI-stijl, schrijfregels tegen AI, controleer mijn audit.
---

# AI-schrijfpatronen

Vier routes. Bepaal welke de gebruiker wil en doe alleen die.

| Vraag klinkt als | Route |
|---|---|
| "klinkt dit als AI", "scan dit", "hoe erg is het" | **1. Scannen** |
| "herschrijf dit", "haal de tics eruit", "menselijker" | **2. Herschrijven** |
| "regels voor mijn skill of prompt", "hoe voorkom ik dit" | **3. Regels leveren** |
| audit, bevinding, issue-omschrijving, aanbeveling, actielijst, technisch rapport | **4. Auditmodus** |

Bij twijfel: scan eerst, toon de bevindingen en vraag daarna of je moet herschrijven. Herschrijf nooit ongevraagd, want de gebruiker wil vaak eerst weten wat er mis is.

## Route 1: scannen

1. Zet de tekst in een bestand (`input.md`).
2. Kan je code uitvoeren, draai dan `python3 scripts/scan.py input.md` (geen dependencies). Met `--json` krijg je de ruwe resultaten.
3. Kan je geen code uitvoeren, loop dan de tien patronen uit `references/patronen.md` handmatig af en tel per patroon de hits. Schat de zinslengtespreiding op een steekproef van 20 zinnen. Zeg in je rapport dat de score een handmatige inschatting is.
4. Lees `references/patronen.md` zodat je per hit kan uitleggen waarom hij opvalt.
5. Rapporteer:
   - Eén regel met de score en wat die betekent (0 tot 9: leest menselijk, 10 tot 21: lichte tics, 22 tot 44: duidelijk herkenbaar, 45 of meer: sterk patroonmatig).
   - Per gevonden patroon: hoe vaak, met twee tot drie letterlijke citaten uit de tekst.
   - Wat goed zit. Een tekst met veel variatie in zinslengte verdient dat je dat zegt.

De scanner is een heuristiek. Hij vindt de vorm, niet de bedoeling. Controleer elke hit zelf voor je hem meldt: een opsomming van drie echte dingen is prima, drie parallelle zinnen om ritme te maken is een tic. Meld geen hits die bij lezing kloppen.

## Route 2: herschrijven

Werk in deze volgorde, anders herschrijf je op gevoel en blijft het ritme hetzelfde.

1. Scan eerst (route 1), ook als de gebruiker er niet om vroeg. Je hebt de posities nodig.
2. Herschrijf met deze ingrepen:
   - Voeg de imperatief samen met de vaststelling of laat hem vallen. "De titel is te lang. Kort hem in." wordt "De titel is te lang en moet korter" of gewoon "De titel is te lang."
   - Breek gelijke zinslengtes. Elke alinea van twee of meer zinnen krijgt minstens één zin van 25 woorden of meer en één onder de 8.
   - Zet een van drie parallelle elementen om of schrap hem, tenzij het er echt drie zijn.
   - Vervang de omkering "niet X, maar Y" door de directe bewering Y.
   - Geef losse fragmenten hun werkwoord terug.
   - Schrap overgangszinnen die niets toevoegen: "Hier zit het probleem", "Het punt is dit", "Kortom", "Here's the thing", "The key is".
   - Geen em-dashes. Gebruik komma, punt, dubbele punt of haakjes.
3. Behoud inhoud, feiten, cijfers, links en structuur. Dit is een ritme-ingreep, geen inhoudelijke redactie. Wil je iets inhoudelijks veranderen, meld het apart in plaats van het stil te doen.
4. Lever de herschreven tekst, plus drie regels over wat je veranderd hebt.
5. Scan de nieuwe versie opnieuw en noem de nieuwe score. Ligt die niet minstens een derde lager, dan ben je te voorzichtig geweest: doe nog een ronde.

Gaat het om auditmateriaal, pas dan de afwijkingen uit route 4 toe voor je herschrijft.

## Route 3: regels leveren

Lever het blok uit `references/schrijfregels.md`. Het is geschreven om letterlijk in een andere SKILL.md, systeemprompt of brand guide geplakt te worden. Vraag of het NL, EN of beide moet zijn en lever alleen dat deel. Voeg de aanvullende regels per contexttype toe als de gebruiker zegt waarvoor het dient (SEO-content, e-mail, slides, handleiding).

Voor een audit-skill of rapportagesjabloon lever je ook het regelblok uit `references/auditmodus.md`.

Voeg niets toe uit eigen beweging. De regels werken omdat ze meetbaar zijn ("minstens één zin van 25+ woorden per alinea"), niet omdat ze smaakvol klinken ("schrijf natuurlijk").

## Route 4: auditmodus

Voor auditbevindingen, issue-omschrijvingen, aanbevelingen, actielijsten en technische documentatie. Lees `references/auditmodus.md` en volg die werkwijze. In het kort:

1. Scan zoals in route 1, met twee afwijkingen: statement-plus-imperatief telt alleen in de bevinding, niet in de fix of procedure; de zinslengteregel vervalt voor bevindingen en fixes.
2. Loop de tien Google-stijlregels uit `references/auditmodus.md` af en meld overtredingen apart van de AI-patronen.
3. Controleer per bevinding of het effect en de zekerheid ervan benoemd zijn, of duidelijk is wat kan wachten, en of tijdsindicaties een marge hebben.
4. Rapporteer in deze volgorde: AI-patronen, Google-stijlregels, ontbrekende effectinschattingen.

## Wat deze skill niet doet

Hij bewijst niet dat een tekst door AI geschreven is. De patronen komen ook voor bij mensen die veel LinkedIn lezen, en een goede AI-tekst kan alle checks doorstaan. Vraagt de gebruiker om auteurschap vast te stellen, zeg dan dat dit een stijlscan is en geen herkomstbewijs.

Gemaakt door Depends (depends.be). Vrij te gebruiken en aan te passen.
ai-schrijfpatronen/references/auditmodus.md4,1 kB
# Auditmodus

Voor auditbevindingen, issue-omschrijvingen, aanbevelingen, actielijsten en technische documentatie. Model is de Google developer documentation style guide, plus de manier waarop Google Search Central over SEO schrijft.

## Twee regels die hier anders werken

**Statement-plus-imperatief geldt alleen in de bevinding, niet in de fix.** In een bevindingkolom is "De canonical wijst naar een 404. Fix dit." nog steeds het patroon, want "fix dit" voegt niets toe. In een fixkolom of genummerde procedure is de imperatief de inhoud: "Zet de canonical op de URL die 200 geeft" is correct en blijft zo.

**De zinslengteregel vervalt voor bevindingen en fixes.** Naslagwerk hoort kort en vlak te zijn. De regel blijft wel gelden voor de managementsamenvatting, de inleiding en elke toelichtende alinea, want dat is lopende tekst.

## Google-stijlregels, meetbaar gemaakt

```
Auditstijl, hard af te dwingen:

1. Voorwaarde voor instructie. "Als de pagina gepagineerd is, verwijder de
   rel=prev" en niet "Verwijder de rel=prev als de pagina gepagineerd is."
   De lezer moet kunnen doorbladeren zonder de zin af te maken.
2. Tweede persoon en actief. Benoem wie handelt: "Googlebot crawlt de pagina",
   niet "de pagina wordt gecrawld". "Je" of "jullie", nooit "we" voor de klant.
3. Tegenwoordige tijd. "De pagina geeft een 302", niet "zal een 302 geven".
4. Modaliteit draagt betekenis en is niet inwisselbaar:
   - moet / must      = vereiste, anders werkt het niet
   - kan / can        = mogelijk, of optioneel
   - mogelijk / might = onzeker effect
   - mag / may        = toegestaan volgens beleid of richtlijn
   Gebruik nooit "moet" voor iets dat eigenlijk "kan helpen" is.
5. Schrap: simpelweg, gewoon, eenvoudig, makkelijk, om te kunnen, stelt je in
   staat om, let op dat, op dit moment. (EN: just, simply, easy, easily,
   in order to, allows you to, please note, at this time.)
   "Eenvoudig" zegt iets over de lezer, niet over de taak.
6. Genummerde lijst = volgorde. Bullets = alles zonder volgorde.
   Meng ze niet in een blok.
7. Sentence case in koppen en issue-titels. "Duplicate content op
   filterpagina's", niet "Duplicate Content Op Filterpagina's".
8. Beschrijvende linktekst. "Zie de documentatie over canonicals", nooit
   "klik hier" of een kale URL in lopende tekst.
9. Geen em-dashes. Komma, punt, dubbele punt of haakjes.
10. Een bevinding per regel of rij. Twee problemen in een zin zijn twee
    bevindingen.
```

## De Search Central-houding

Dit deel maakt een audit inhoudelijk beter, het is geen opmaakregel.

Google schrijft in zijn SEO-documentatie op wat niet urgent is, geeft aan wanneer een effect onzeker is, zegt dat sommige wijzigingen uren en andere maanden nodig hebben, en belooft geen resultaat. Vertaal dat naar drie eisen per bevinding:

- **Zeg wat het effect is en hoe zeker dat is.** "Dit lost het indexeringsprobleem op" alleen als dat zo is. Anders: "Dit verwijdert een crawlbarrière. Of de pagina daarna indexeert, hangt af van de contentkwaliteit."
- **Zeg ook wanneer iets kan wachten.** Een lijst waarin alles even dringend is, dwingt de klant zelf te prioriteren. Markeer expliciet wat cosmetisch is.
- **Geen tijdsbelofte zonder marge.** "Effect zichtbaar binnen enkele weken tot enkele maanden, afhankelijk van de crawlfrequentie" is bruikbaar. "Binnen 4 weken zie je resultaat" is een gok.

Een ding neem je niet over: Google schrijft af en toe geruststellend naar een breed publiek ("maak je er niet te veel zorgen over"). In een betaalde audit leest dat als vergoelijken. Houd de nuance, laat de knipoog weg.

## Werkwijze

1. Scan zoals in route 1 van de SKILL.md, met de twee afwijkingen hierboven bij het beoordelen van de hits.
2. Loop de tien Google-stijlregels af en meld overtredingen apart van de AI-patronen. Het zijn twee soorten fouten en de gebruiker wil ze los kunnen oplossen.
3. Controleer per bevinding de drie eisen uit de Search Central-houding. Een bevinding zonder effectinschatting is onaf, ook als hij stilistisch in orde is.
4. Rapporteer in deze volgorde:
   1. AI-patronen (met citaten)
   2. Google-stijlregels (regelnummer, citaat, voorgestelde formulering)
   3. Bevindingen zonder effectinschatting, prioriteit of tijdsmarge
ai-schrijfpatronen/references/patronen.md5,6 kB
# Patronencatalogus

Per patroon: wat het is, waarom het opvalt, hoe je het herkent, en de fix. NL en EN voorbeelden.

---

## 1. Statement-plus-imperatief

Een korte vaststelling, gevolgd door een korte opdracht. Het hoofdpatroon.

> De titel is te lang. Kort hem in tot 55 tekens.
> Your intro buries the point. Move it to the first line.

**Waarom het opvalt:** het leest als advies dat al af is. Beloningsmodellen scoren dit hoog omdat het beslist en actiegericht klinkt, dus modellen produceren het vaker dan mensen. In lange output herhaalt het ritme zich terwijl een mens zou variëren.

**Herkennen:** zin A is declaratief en onder de 12 woorden, zin B begint met een gebiedende wijs (zet, maak, schrap, kort, gebruik, vervang, begin, stop, denk, vraag, use, make, keep, drop, move, start, stop, focus, avoid, consider).

**Fix:** voeg samen ("De titel is te lang en moet naar 55 tekens") of laat de imperatief weg als de vaststelling het al impliceert. Of draai om en maak er een gewone mededeling van: "Ik zou de titel inkorten tot 55 tekens."

---

## 2. De omkering

Contrast eerst wegnemen, dan de echte claim.

> Dit is geen rankingprobleem. Het is een crawlprobleem.
> It's not a design issue, it's an information architecture issue.
> Niet sneller schrijven, maar beter schrappen.

**Waarom het opvalt:** het creëert spanning zonder informatie toe te voegen. De helft van de zin bestaat uit iets dat niet waar is.

**Herkennen:** "is geen X", "niet X, maar Y", "isn't X, it's Y", "not X. Y.", "less X, more Y", "gaat niet over X, maar over Y".

**Fix:** schrijf alleen Y. "Het is een crawlprobleem." Behoud de omkering enkel als de lezer echt X gelooft en je die aanname moet corrigeren.

---

## 3. Tricolon

Drie parallelle elementen. Bijna altijd drie, zelden twee of vier.

> Sneller, goedkoper, schaalbaarder.
> It reads well, it ranks well, it converts.
> Drie bullets, altijd drie bullets, nooit vier.

**Waarom het opvalt:** de drieslag is een retorische reflex. Als de werkelijkheid twee of vijf dingen bevat, verzint het patroon er een bij of laat er een weg.

**Herkennen:** drie komma-gescheiden elementen van vergelijkbare lengte, drie opeenvolgende korte zinnen met dezelfde bouw, of een bulletlijst van precies drie items die inhoudelijk overlappen.

**Fix:** tel de echte dingen. Zijn het er twee, schrijf er twee. Zijn het er vijf, schrijf er vijf. Als het er drie zijn, is het geen tic.

---

## 4. Het fragment als klemtoon

Een losse zin zonder werkwoord, na een langere zin.

> Elke keer.
> Every single time.
> Punt.

**Waarom het opvalt:** in kleine dosis is het effectief, daarom gebruiken modellen het te vaak. Meer dan één per lange tekst voelt aangeleerd.

**Herkennen:** zin onder de 6 woorden zonder persoonsvorm.

**Fix:** geef het fragment zijn werkwoord terug of hang het aan de vorige zin. Laat er hoogstens één staan per tekst, en alleen op het punt dat het echt verdient.

---

## 5. Vlakke zinslengte

Alle zinnen tussen de 12 en 18 woorden.

**Waarom het opvalt:** menselijk proza schommelt. Een schrijver zet een zin van 40 woorden naast een van 4. Modellen convergeren naar het gemiddelde omdat dat de veiligste voorspelling is.

**Herkennen:** standaarddeviatie van de zinslengte onder de 6 woorden. De scanner rekent dit uit.

**Fix:** per alinea minstens één zin van 25 woorden of meer, en minstens één van onder de 8. Dit is de ingreep met het grootste effect op hoe menselijk een tekst leest, veel groter dan woordkeuze.

---

## 6. Holle overgangszinnen

> Hier zit het probleem.
> Het punt is dit.
> En dat is precies waarom het werkt.
> Here's the thing.
> The key is simple.
> Let that sink in.

**Waarom het opvalt:** ze kondigen inhoud aan in plaats van inhoud te zijn. Schrap ze en er gaat niets verloren.

**Fix:** schrappen. Als de zin erna sterk genoeg is, heeft hij geen aanloop nodig.

---

## 7. Em-dashes

> De titel is te lang - en dat kost je kliks.

**Waarom het opvalt:** het gedachtestreepje als adempauze is een van de meest gerapporteerde AI-tells. In het Nederlands is het bovendien typografisch ongebruikelijk.

**Fix:** komma, punt, dubbele punt of haakjes. Nooit een em-dash. Ook geen en-dash als vervanging in dezelfde functie.

---

## 8. Bold-lead-in bullets

> **Snelheid**: de pagina laadt in 1,2 seconden.
> **Structuur**: de H2's volgen de zoekintentie.

**Waarom het opvalt:** het is een sjabloon. Elke bullet krijgt dezelfde vorm, ook waar de inhoud die vorm niet vraagt.

**Fix:** gebruik het hoogstens in een echte definitielijst. In lopende opsommingen: gewone bullets, verschillende lengtes.

---

## 9. Slotalinea die samenvat wat er net stond

> Kortom, de drie ingrepen hierboven maken je pagina sneller, duidelijker en beter vindbaar.

**Waarom het opvalt:** de lezer heeft het net gelezen. De samenvatting bestaat omdat het formaat erom vraagt, niet de lezer.

**Fix:** schrappen, of vervangen door het enige dat een slot verdient: wat de lezer nu doet, of wat je zelf nog niet weet.

---

## 10. Hedging-stapeling

> Het kan zijn dat dit mogelijk invloed heeft op sommige pagina's, afhankelijk van de context.

**Waarom het opvalt:** drie slagen om de arm in één zin. Het model dekt zich in tegen elke gebruikssituatie tegelijk.

**Fix:** één slag om de arm, of geen. "Dit raakt waarschijnlijk alleen de paginatiepagina's."

---

## Wat geen tic is

Deze dingen komen ook in AI-tekst voor maar zijn gewoon goed schrijven, dus vlag ze niet:

- Korte zinnen op zich. Alleen de vlakke variatie is het probleem.
- Bullets. Alleen sjabloonbullets zijn het probleem.
- Koppen en structuur in een tekst die daarom vraagt.
- Een opsomming van drie dingen die er echt drie zijn.
- Een imperatief in een instructie of handleiding, waar de opdracht de inhoud is.
ai-schrijfpatronen/references/schrijfregels.md2,7 kB
# Schrijfregels om AI-patronen te voorkomen

Bedoeld om letterlijk te plakken in een SKILL.md, systeemprompt of brand guideline. Meetbare regels, want daar sturen modellen op. Vage regels ("schrijf natuurlijk") doen niets.

---

## Nederlands

```
Schrijfritme, hard af te dwingen:

1. Geen em-dashes. Gebruik komma, punt, dubbele punt of haakjes.
2. Geen zin die een vaststelling doet en direct daarna een gebiedende wijs geeft
   ("De titel is te lang. Kort hem in."). Voeg samen of laat de opdracht weg.
3. Geen omkeringen van de vorm "dit is geen X, het is Y" of "niet X, maar Y".
   Schrijf alleen Y.
4. Varieer zinslengte: per alinea minstens één zin van 25 woorden of meer en
   minstens één van onder de 8 woorden.
5. Hoogstens één zin zonder persoonsvorm per tekst.
6. Geen aankondigende overgangszinnen: "Hier zit het probleem", "Het punt is
   dit", "Kortom", "En dat is precies waarom". Schrap ze.
7. Drieslagen alleen als het er echt drie zijn. Tel de dingen voor je ze opsomt.
8. Geen slotalinea die samenvat wat er net stond. Eindig op wat de lezer nu
   doet, of stop gewoon.
9. Hoogstens één slag om de arm per zin.
10. Bullets met vetgedrukte lead-in alleen in een echte definitielijst.
```

---

## English

```
Rhythm rules, enforce strictly:

1. No em-dashes. Use commas, periods, colons or parentheses.
2. No sentence pair that states a fact and then issues a command
   ("Your title is too long. Shorten it."). Merge them or drop the command.
3. No reversals of the form "it's not X, it's Y". Write Y only.
4. Vary sentence length: every paragraph needs at least one sentence of 25+
   words and at least one under 8 words.
5. At most one verbless fragment per piece.
6. No announcing transitions: "Here's the thing", "The key is", "In short",
   "Let that sink in". Cut them.
7. Rule of three only when there are actually three things. Count first.
8. No closing paragraph that summarises what was just said. End on what the
   reader does next, or just stop.
9. At most one hedge per sentence.
10. Bold lead-in bullets only in a genuine definition list.
```

---

## Aanvullende regels per contexttype

**SEO-content:** regel 4 botst soms met leesbaarheidsscores die korte zinnen belonen. Houd regel 4 aan en accepteer de lagere score, want gelijkmatige korte zinnen zijn precies het patroon dat je wil vermijden.

**E-mail:** regel 8 geldt dubbel. Een mail eindigt op de vraag of het volgende moment, niet op een samenvatting.

**Slides:** regel 4 vervalt, want slides hebben geen alinea's. Regels 1, 2, 3, 6 en 7 blijven gelden en zijn daar juist het meest zichtbaar.

**Instructie en handleiding:** regel 2 vervalt gedeeltelijk. In een genummerde procedure is de imperatief de inhoud. Het patroon blijft fout in de uitleg eromheen.
ai-schrijfpatronen/scripts/scan.py8,1 kB
#!/usr/bin/env python3
"""Heuristische scanner voor AI-schrijfpatronen in NL en EN tekst.

Gebruik: python3 scan.py <bestand> [--json]

Geen dependencies. Vlagt vorm, niet bedoeling: controleer elke hit met de ogen
voor je hem rapporteert. Zie references/patronen.md.
"""
import json
import re
import statistics
import sys
from pathlib import Path

IMPERATIVES = {
    # NL
    "zet", "maak", "schrap", "kort", "gebruik", "vervang", "begin", "stop",
    "denk", "vraag", "kies", "voeg", "haal", "houd", "hou", "let", "zorg",
    "vermijd", "test", "meet", "check", "pas", "lees", "schrijf", "bouw",
    "verwijder", "plaats", "richt", "focus", "neem", "geef", "doe", "start",
    # EN
    "use", "make", "keep", "drop", "move", "start", "stop", "focus", "avoid",
    "consider", "write", "build", "remove", "add", "check", "test", "pick",
    "read", "cut", "fix", "ship", "treat", "think", "ask", "let", "put",
}

TRANSITIONS = [
    r"\bhier (zit|ligt) (het|de) \w+", r"\bhet punt is\b", r"\bkortom\b",
    r"\bdat is precies waarom\b", r"\bin het kort\b", r"\bsamengevat\b",
    r"\bhere'?s the thing\b", r"\bthe key is\b", r"\bin short\b",
    r"\blet that sink in\b", r"\bhere'?s (why|how|what)\b", r"\bbottom line\b",
    r"\bthat'?s the (point|whole point)\b",
]

REVERSALS = [
    r"\bis geen [^.。!?]{2,40}[.,] (het|dit|dat) is\b",
    r"\bniet [^.,;!?]{2,40}, maar\b",
    r"\bgaat niet over [^.,;!?]{2,40}, maar\b",
    r"\bis(n'?t| not) [^.,;!?]{2,40}, it'?s\b",
    r"\bnot [^.,;!?]{2,40}[.,] (it'?s|but)\b",
    r"\bless [^.,;!?]{2,25}, more\b",
]

HEDGES = [
    "misschien", "mogelijk", "wellicht", "kan zijn", "vaak", "meestal",
    "doorgaans", "in sommige gevallen", "afhankelijk van",
    "may", "might", "possibly", "perhaps", "often", "typically", "generally",
    "in some cases", "depending on",
]

VERB_HINT = re.compile(
    r"\b(is|zijn|was|waren|heeft|hebben|had|hadden|wordt|worden|werd|werden|"
    r"kan|kun|kunt|kunnen|zal|zullen|moet|moeten|doet|doen|deed|deden|gaat|"
    r"zit|zitten|ligt|liggen|valt|vallen|kijk|kijkt|kijken|denk|denkt|"
    r"gaan|ging|blijft|blijven|maakt|maken|staat|staan|komt|komen|"
    r"is|are|was|were|has|have|had|do|does|did|can|could|will|would|should|"
    r"must|goes|go|went|makes|make|gets|get|becomes|become|seems|looks)\b",
    re.I,
)


def split_sentences(text):
    text = re.sub(r"\s+", " ", text)
    parts = re.split(r"(?<=[.!?])\s+(?=[A-Z\"'(“])", text)
    return [p.strip() for p in parts if p.strip()]


def words(s):
    return re.findall(r"[\w'’-]+", s)


def strip_markup(text):
    text = re.sub(r"```.*?```", " ", text, flags=re.S)
    text = re.sub(r"`[^`]*`", " ", text)
    text = re.sub(r"^\s*\|.*$", " ", text, flags=re.M)  # tabellen
    text = re.sub(r"^#{1,6}\s.*$", " ", text, flags=re.M)  # koppen
    text = re.sub(r"\[([^\]]*)\]\([^)]*\)", r"\1", text)
    return text


def scan(raw):
    body = strip_markup(raw)
    sents = split_sentences(body)
    lengths = [len(words(s)) for s in sents if words(s)]
    total_words = sum(lengths) or 1
    hits = {k: [] for k in (
        "statement_imperatief", "omkering", "tricolon", "fragment",
        "overgangszin", "em_dash", "bold_bullet", "hedge_stapel",
    )}

    # 1. statement + imperatief
    for a, b in zip(sents, sents[1:]):
        wa, wb = words(a), words(b)
        if not wa or not wb:
            continue
        if len(wa) <= 12 and len(wb) <= 14 and wb[0].lower() in IMPERATIVES:
            hits["statement_imperatief"].append(f"{a} {b}")

    # 2. omkering
    for s in sents:
        for pat in REVERSALS:
            if re.search(pat, s, re.I):
                hits["omkering"].append(s)
                break
    for a, b in zip(sents, sents[1:]):
        if re.search(r"\b(is geen|zijn geen|is not|isn'?t)\b", a, re.I) and \
           re.match(r"^(het|dit|dat|it'?s|they'?re)\b", b, re.I):
            hits["omkering"].append(f"{a} {b}")

    # 3. tricolon
    for s in sents:
        items = [i.strip() for i in re.split(r",", s) if i.strip()]
        if len(items) == 3:
            ln = [len(words(i)) for i in items]
            if max(ln) <= 6 and max(ln) - min(ln) <= 2:
                hits["tricolon"].append(s)
    for i in range(len(sents) - 2):
        trio = sents[i:i + 3]
        ln = [len(words(t)) for t in trio]
        if all(2 <= n <= 8 for n in ln) and max(ln) - min(ln) <= 2:
            firsts = [words(t)[0].lower() for t in trio if words(t)]
            if len(set(firsts)) < 3:
                hits["tricolon"].append(" ".join(trio))
    bullets = re.findall(r"(?:^[-*]\s+.*$\n?){3}(?!\s*[-*]\s)", raw, flags=re.M)
    for b in bullets:
        hits["tricolon"].append(b.strip().replace("\n", " / "))

    # 4. fragment
    for s in sents:
        w = words(s)
        if not w or len(w) > 4 or s.endswith(":"):
            continue
        if VERB_HINT.search(s) or w[0].lower() in IMPERATIVES:
            continue
        if True:
            hits["fragment"].append(s)

    # 5. overgangszinnen
    for s in sents:
        for pat in TRANSITIONS:
            if re.search(pat, s, re.I):
                hits["overgangszin"].append(s)
                break

    # 6. em-dashes
    for m in re.finditer(r"[^.!?]*[—–][^.!?]*", body):
        hits["em_dash"].append(m.group(0).strip())

    # 7. bold-lead-in bullets
    bb = re.findall(r"^[-*]\s+\*\*[^*]+\*\*\s*[::]", raw, flags=re.M)
    if len(bb) >= 3:
        hits["bold_bullet"] = bb

    # 8. hedge-stapeling
    for s in sents:
        low = s.lower()
        n = sum(1 for h in HEDGES if h in low)
        if n >= 3:
            hits["hedge_stapel"].append(s)

    for k in hits:
        seen, uniq = set(), []
        for v in hits[k]:
            if v not in seen:
                seen.add(v)
                uniq.append(v)
        hits[k] = uniq

    stdev = statistics.pstdev(lengths) if len(lengths) > 1 else 0.0
    mean = statistics.mean(lengths) if lengths else 0.0
    n_hits = sum(len(v) for v in hits.values())
    density = round(n_hits / total_words * 100, 1)
    flat = stdev < 6
    score = min(100, round(density * 8 + (18 if flat else 0)))

    return {
        "woorden": total_words,
        "zinnen": len(sents),
        "gem_zinslengte": round(mean, 1),
        "stdev_zinslengte": round(stdev, 1),
        "vlakke_zinslengte": flat,
        "hits_totaal": n_hits,
        "dichtheid_per_100w": density,
        "score": score,
        "hits": hits,
    }


LABELS = {
    "statement_imperatief": "Statement-plus-imperatief",
    "omkering": "Omkering (niet X, maar Y)",
    "tricolon": "Tricolon (drieslag)",
    "fragment": "Fragment zonder werkwoord",
    "overgangszin": "Holle overgangszin",
    "em_dash": "Em-dash",
    "bold_bullet": "Bold-lead-in bullets",
    "hedge_stapel": "Hedge-stapeling",
}


def verdict(score):
    if score >= 45:
        return "sterk patroonmatig, herschrijven aangeraden"
    if score >= 22:
        return "duidelijk herkenbaar, losse ingrepen volstaan"
    if score >= 10:
        return "lichte tics, grotendeels prima"
    return "leest menselijk"


def main():
    args = [a for a in sys.argv[1:] if not a.startswith("--")]
    if not args:
        print(__doc__)
        sys.exit(1)
    raw = Path(args[0]).read_text(encoding="utf-8", errors="replace")
    r = scan(raw)
    if "--json" in sys.argv:
        print(json.dumps(r, ensure_ascii=False, indent=2))
        return
    print(f"Score {r['score']}/100  ({verdict(r['score'])})")
    print(f"{r['woorden']} woorden, {r['zinnen']} zinnen, "
          f"gemiddeld {r['gem_zinslengte']} woorden, "
          f"spreiding {r['stdev_zinslengte']}"
          f"{'  <-- te vlak' if r['vlakke_zinslengte'] else ''}")
    print(f"{r['hits_totaal']} hits, {r['dichtheid_per_100w']} per 100 woorden\n")
    for k, v in r["hits"].items():
        if not v:
            continue
        print(f"{LABELS[k]}  ({len(v)}x)")
        for item in v[:4]:
            item = item if len(item) <= 140 else item[:137] + "..."
            print(f"   > {item}")
        if len(v) > 4:
            print(f"   ... en {len(v) - 4} meer")
        print()
    if r["hits_totaal"] == 0 and not r["vlakke_zinslengte"]:
        print("Geen patronen gevonden.")


if __name__ == "__main__":
    main()

Installeren

Zo zet je hem in Claude

In Claude.ai of Claude Desktop

  1. Download ai-schrijfpatronen.zip. Pak hem niet uit.
  2. Ga naar Instellingen › Capabilities en zet code-uitvoering aan als dat nog niet zo is.
  3. Kies bij Skills voor Upload skill en selecteer de zip.
  4. Start een nieuw gesprek. Claude gebruikt de skill vanzelf zodra je vraag erbij past.

In Claude Code

  1. Download ai-schrijfpatronen.zip.
  2. Pak hem uit in je persoonlijke skillmap, of in .claude/skills/ van een project om hem met je team te delen:
unzip ai-schrijfpatronen.zip -d ~/.claude/skills/

Start Claude Code opnieuw. Met /skills zie je of hij geladen is.

Andere skills

Alle skills

Wil je dat we het samen met je team opzetten?

Plan een gesprek van 30 minuten met Mathias, de oprichter van Depends.

Plan een gesprek

info@depends.be+32 470 86 43 26

Bel onsPlan een kennismaking →