Skip to content

Leer-niveau = toets-niveau, en het nul-geval van de vormcontrole gedicht (CORE.NORM.03) - #1

Merged
groeimetai merged 3 commits into
mainfrom
fix/leer-toets-niveau-en-norm-gat
Jul 28, 2026
Merged

Leer-niveau = toets-niveau, en het nul-geval van de vormcontrole gedicht (CORE.NORM.03)#1
groeimetai merged 3 commits into
mainfrom
fix/leer-toets-niveau-en-norm-gat

Conversation

@groeimetai

Copy link
Copy Markdown
Contributor

What changes

Twee bevestigde review-bevindingen, samen één thema: het verschil tussen wat een agent leert en waar hij op wordt afgerekend.

A — de schrijfwijzer leerde niveau 1, de poort toetst niveau 2. De ingecheckte prompt/klaar-prompt.{nl,en}.md waren de niveau-1-render en bevatten dus noch de zes KLAAR-vormen, noch de VRIJE-VORM-klep met zijn grens — terwijl de enige harde consument (de plan-callback van het platform) op niveau 2 lint, waar CORE.SHAPE.01 als error blokkeert. De artefacten renderen nu op niveau 2: sjabloon-tabel van de zes vormen (vorm-categorieën, geen woordenlijsten), de klep mét grens ("werkt alleen voor CORE.SHAPE.01 — de andere regels blijven gelden"), en de niveau-2-blokkers in de Altijd-lijst. CORE.SAFE.01 heeft de klep ook, maar valt buiten de scopes van dit artefact en wordt er dus eerlijk niet in genoemd — render alleen wat wordt afgedwongen.

B — een eis zonder enig normatief sleutelwoord passeerde alle blokkerende regels. Nieuwe regel CORE.NORM.03 (niveau 2, error, deterministisch, scope requirement + acceptance-criterion): machine.kind: keyword-case met de al in het schema gedefinieerde maar tot nu toe door geen enkele regel gebruikte modus report: missing-normative, plus een nieuw unit: "block" (analoog aan pattern). Regelpakket 0.1.0 → 0.2.0 (nieuwe active error-regel = major, spec deel 5) — precies de v0.2-belofte die de rationale van CORE.SHAPE.01 zelf al deed.

Why

A. Een agent die de instructie leest, leert een andere standaard dan die waarop zijn werk wordt getoetst. Elke vorm-fout is dan geen schrijffout maar een onderwijsfout.

B. Gemeten op main: een requirement-scope-zin in puur beschrijvend proza ("Het dashboard ondersteunt meerdere valuta.") krijgt op niveau 2 nul errors. Drie schakels lieten hem samen door: CORE.NORM.02 telt alleen het geval >max en mist het nul-geval; CORE.SHAPE.01 slaat sleutelwoordloze zinnen over via onlyUnitsMatching; en missing-normative was dode schema-ruimte. Een eisendocument in beschrijvend proza kreeg dus groen — precies de zin die een poort niet kán zien, want er valt niets goed te keuren en niets af te wijzen.

Drie ontwerpkeuzes tegen valse positieven, elk met een test:

  1. Elke schrijfwijze telt, vermogenswoorden tellen mee (kan/kunnen/can). Het kleine-lettergeval blijft van CORE.NORM.01/CORE.SHAPE.01 — geen dubbele melding voor hetzelfde defect, en de KAN-vorm (acceptatiecriterium zonder hoofdlettersleutelwoord) blijft geldig. De twee report-modi verdelen de faalruimte nu zonder overlap.
  2. Per blok, niet per zin. Een toelichting of bewijszin direct achter de eis lift mee op het sleutelwoord van de eis.
  3. VRIJE-VORM ontslaat een eis van de zes vormen, niet van deze regel. De klep blijft exact zo smal als hij was (CORE.SHAPE.01 en CORE.SAFE.01); een test bewaakt die grens.

Evidence

Metingen woordbudget (plan-eis ≤450; interne testgrens 300 → 450 met motivatie in de test zelf):

Artefact oud (wc -w) nieuw (wc -w) nieuw (countPromptWords)
prompt/klaar-prompt.nl.md 219 370 357
prompt/klaar-prompt.en.md 269 431 421

Kale niveau-2-render vóór snoeien: 462 (nl) / 539 (en). Categorisch gesnoeid in wat nooit blokkeert: 4 i.p.v. 7 lexicon-voorbeelden per woordklasse, 3 i.p.v. 6 uitgeschreven adviesregels (rest geteld en genoemd), en CORE.NORM.03 wordt niet apart onderwezen omdat CORE.NORM.02's statement ("precies een normatief sleutelwoord") het nul-geval al draagt. De CI-stap rendert nu met --level 2 --max-words 450, zodat een overschrijding daar faalt.

Testgevallen die het nul-geval dekken (tools/klaar/test/missing-normative.test.js, 7 tests):

  • puur beschrijvende eis → precies één error op niveau 2, en die is CORE.NORM.03 (bewijst het gat én dat alleen de nieuwe regel het dekt);
  • elk van de zes vormen → nul errors op niveau 2 (complementair, geen overlap met CORE.SHAPE.01);
  • toelichting/bewijszin in hetzelfde blok → geen eigen overtreding;
  • VRIJE-VORM ontsnapt CORE.SHAPE.01 maar niet het nul-geval; mét (klein geschreven) sleutelwoord is het vrije-vormblok schoon;
  • beschrijvend acceptatiecriterium → error, KAN-vorm-criterium → geen;
  • niveau-1-poort blijft stil; Engels profiel idem gedekt.

Echte tekst: het eigen schone voorbeelddocument examples/offerte-fase-1b.na.md bleek een keyword-loos ALS/DAN-acceptatiecriterium te bevatten — de regel ving hem bij de eerste run (herschreven met MOET). En examples/README.md schreef "Het portaal werkt." toe aan CORE.SHAPE.01, dat AC-scope niet eens dekt; nu correct CORE.NORM.03. Voor-document: 16 → 20 errors, alle vier echte treffers (o.a. "De offerte-PDF wordt gegenereerd…", "Het portaal werkt.").

Totaalstanden: conformance 238 → 248 controles, 0 fouten; unit-tests 30 → 37, alle groen; klaar check 31 regels in orde; lint:self 0 errors. Spec-tellingen (deel 0/1/4/5) bijgewerkt, CORE.SHAPE.01-rationale verwijst nu naar de dichting i.p.v. de belofte.

Checks

  • node tools/klaar/bin/klaar.js check passes
  • node tools/klaar/bin/klaar.js conformance passes
  • cd tools/klaar && node --test test/ passes

Clean-room declaration

Required for every pull request. See CLEANROOM.md.

  • I have not copied rule text, vocabulary entries, examples, numbering or section structure from ASD-STE100 or from any other licence-restricted specification.
  • Every lexicon term I added carries a source from the allowlist in CLEANROOM.md. (geen lexicon-termen toegevoegd)
  • Every example I added is my own, written about software delivery.
  • I have not compared a KLAAR lexicon against another standard's vocabulary.

🤖 Generated with Claude Code

groeimetai and others added 3 commits July 28, 2026 23:23
…e elke blokkerende regel

Gemeten: een requirement-zin in puur beschrijvend proza ("Het dashboard
ondersteunt meerdere valuta") kreeg op niveau 2 nul errors. Drie schakels
lieten hem samen door: CORE.NORM.02 telt alleen het geval MÉÉR dan een
sleutelwoord en mist het nulgeval; CORE.SHAPE.01 kijkt via onlyUnitsMatching
alleen naar zinnen die al een verplichtings- of vermogenswoord dragen; en de
'missing-normative'-modus die het regelschema daarvoor definieert, werd door
geen enkele regel gebruikt. Een eisendocument in beschrijvend proza kreeg dus
groen — precies de zin die een poort niet kán zien, want er valt niets goed
te keuren en niets af te wijzen. CORE.SHAPE.01 noemde dit gat zelf al in zijn
rationale, met de belofte het in v0.2 te dichten. Dit is die dichting.

De nieuwe regel: niveau 2, error, deterministisch, scope requirement +
acceptance-criterion, machine.kind keyword-case met report=missing-normative.
Drie ontwerpkeuzes, expliciet:

1. Sleutelwoorden tellen in ELKE schrijfwijze, en vermogenswoorden (kan,
   kunnen, can) tellen mee. Het kleine-lettergeval is en blijft van
   CORE.NORM.01 (en op eis-scope van CORE.SHAPE.01); twee meldingen voor
   hetzelfde defect leren een schrijver niets extra's. De KAN-vorm — het
   acceptatiecriterium zonder hoofdlettersleutelwoord — blijft zo geldig.
   De twee report-modi verdelen daarmee de faalruimte zonder overlap.

2. De toets oordeelt per BLOK, niet per zin (keyword-case kent daarvoor nu
   unit: "block", net als pattern). Een toelichting of bewijszin direct
   achter de eis hoort bij die eis en is geen eigen overtreding — per zin
   toetsen zou elke correct geannoteerde eis rood kleuren.

3. VRIJE-VORM ontslaat een eis van de zes vormen, NIET van deze regel. De
   klep blijft dus precies zo smal als hij was (CORE.SHAPE.01 en
   CORE.SAFE.01); ook een vrije-vormeis draagt een sleutelwoord, anders kan
   geen poort hem als eis lezen. Een test bewaakt die grens.

Regelpakket naar 0.2.0 (nieuwe active error-regel op een bestaand niveau =
major, zie spec deel 5). Conformance: 238 → 248 controles, 0 fouten. Het
schone voorbeelddocument bleek zelf een keyword-loos acceptatiecriterium te
bevatten — de regel ving hem meteen; herschreven, en "Het portaal werkt."
in de README stond fout toegeschreven aan CORE.SHAPE.01, dat AC-scope niet
eens dekt. Voor-document: 16 → 20 errors, alle vier echte treffers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eau 2 toetst

De ingecheckte prompt-artefacten waren de niveau-1-render. Daardoor kende een
agent die ermee schrijft de zes KLAAR-vormen niet en de VRIJE-VORM-klep niet —
terwijl de enige harde consument (de plan-callback van het platform) op
niveau 2 lint, waar CORE.SHAPE.01 als error blokkeert. Leer-niveau en
toets-niveau waren dus verschillende standaarden: een agent werd afgerekend
op vormen die zijn instructie nooit heeft genoemd.

De artefacten renderen nu op niveau 2. Dat brengt drie dingen mee die het
verschil maken tussen kennen en gokken:

- De zes vormen, als sjabloon-tabel — vorm-categorieën, geen woordenlijsten.
- De VRIJE-VORM-klep MET zijn grens: "werkt alleen voor CORE.SHAPE.01 — de
  andere regels blijven gelden." Zonder die grens strooien agents de
  markering als algemene demper. (CORE.SAFE.01 heeft de klep ook, maar valt
  buiten de scopes van dit artefact en wordt hier dus eerlijk niet genoemd —
  render alleen wat wordt afgedwongen.)
- De niveau-2-blokkers (BOUND, SHAPE) in de Altijd-lijst.

Het woordbudget is de prijs, en die is hardop betaald. De kale niveau-2-render
stond op 462 (nl) / 539 (en) woorden. Categorisch gesnoeid in wat nooit
blokkeert: vier lexicon-voorbeelden per woordklasse in plaats van zeven, drie
adviesregels uitgeschreven in plaats van zes (de rest blijft geteld en
genoemd), en CORE.NORM.03 wordt niet apart onderwezen omdat CORE.NORM.02's
statement ("precies een normatief sleutelwoord") het nulgeval al draagt.
Resultaat: 357 (nl) / 421 (en), budget in de test van 300 naar 450 — het
plafond dat het plan toestaat — met de afweging in de test zelf. De CI-stap
rendert nu óók met --level 2 --max-words 450, zodat een overschrijding daar
faalt in plaats van stil uit te leveren.

Meting (wc -w): nl 219 → 370, en 269 → 431.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Het regelpakket ging naar 0.2.0 (nieuwe active error-regel CORE.NORM.03) en
het npm-pakket levert dat pakket mee in files. Bovendien veranderde het
gereedschap zelf: de missing-normative-modus van keyword-case is nu echt
geïmplementeerd met blok-granulariteit. Een publish onder 0.1.0 zou een
andere regelset onder hetzelfde nummer zijn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@groeimetai
groeimetai merged commit 01d7b6c into main Jul 28, 2026
2 checks passed
@groeimetai
groeimetai deleted the fix/leer-toets-niveau-en-norm-gat branch July 28, 2026 21:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant