diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..6c58add
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,42 @@
+name: CI
+
+on:
+ push:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ test:
+ name: Test
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v6
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v6
+ with:
+ node-version: 24
+ cache: npm
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Install Playwright Chromium
+ run: npx playwright install --with-deps chromium
+
+ - name: Run tests
+ run: npm test
+
+ - name: Upload Playwright artifacts
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: playwright-artifacts
+ path: |
+ test-results/
+ playwright-report/
+ if-no-files-found: ignore
diff --git a/TODO.md b/TODO.md
index 253a7b4..85c5fe6 100644
--- a/TODO.md
+++ b/TODO.md
@@ -6,7 +6,7 @@ Enige bron van waarheid voor open product-, bied- en speelwerk. Opgeschoond na c
- Basisgame blijft rustig: zo weinig mogelijk tekstuele uitleg tijdens normaal spelen.
- Uitgebreide uitleg hoort in developermodus, AI-suggesties, review, woordenlijst of toekomstige lesmodus.
-- Houd UI-wijzigingen binnen de passende `scripts/`-submap; `scripts/app.js` blijft vooral bootstrap en gedeelde helpers.
+- Houd UI-wijzigingen binnen de passende `scripts/`-submap; `scripts/app.js` blijft alleen de bootstrap-shell en gedeelde helpers horen in runtime-modules.
- Gebruik altijd de sterkste geimplementeerde heuristiek. Geen keuzemenu voor zwakkere AI-sterktes.
- Maak claims in de UI niet sterker dan de engine kan waarmaken.
- Voeg fixture- of smoketests toe bij nieuwe bied-, speel- of scorelogica.
@@ -72,7 +72,7 @@ Enige bron van waarheid voor open product-, bied- en speelwerk. Opgeschoond na c
### Architectuur en onderhoudbaarheid
-- Splits `scripts/app.js` geleidelijk op zodra nieuwe UI-flow wordt toegevoegd: gebruik de bestaande submappen voor flow, render, state, learning en copy. Geen grote rewrite; houd tijdelijk compatibele globals waar dat migratie veilig maakt.
+- Houd de nieuwe `BridgeAppRuntime`-modulegrenzen scherp: nieuwe UI-flow registreert via `BridgeAppModules.register...(runtime)` en gebruikt geen impliciete app-globals.
- Introduceer pure state-transitions voor kernacties zoals hand starten, bod toepassen, veiling afronden, kaart spelen en slag doorschuiven. UI-code roept transitions aan en rendert daarna opnieuw.
- Splits grote regelbestanden per bridge-domein wanneer je eraan werkt: `card-play` heeft nu losse modules voor uitkomsten, speelplan volgen, leiderspel en basisverdediging. Splits Vijfkaart-Hoog rebids/competitive later naar auction families.
- Houd de gesplitste `rules/play-plan/` modules per domein klein: gedeelde helpers in `common`, sans-atout in `notrump`, kleurcontract in `suit-contract`.
@@ -82,7 +82,7 @@ Enige bron van waarheid voor open product-, bied- en speelwerk. Opgeschoond na c
### Lessen en oefenmodus
-- Werk lessen 2-12 later net zo rijk uit als les 1, met interactieve vragen, gerichte oefenstart en betrouwbare reviewfeedback per lesdoel.
+- Werk lessen 3-12 later net zo rijk uit als les 1 en 2, met interactieve vragen, gerichte oefenstart en betrouwbare reviewfeedback per lesdoel.
- Voeg ongedaan maken/herhalen toe voor de leermodus, minstens voor de meest recente kaart.
- Voeg keuze-feedback toe in lessen, niet in de rustige basisgame, en alleen wanneer de engine de uitleg betrouwbaar kan onderbouwen.
diff --git a/docs/architecture.md b/docs/architecture.md
index 0aee228..c53149d 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -24,7 +24,7 @@ Dit document beschrijft de actuele architectuur en gewenste groeirichting van Br
## Hoog-overzicht
```text
-index.html / lessons.html / lesson-01-cards.html
+index.html / lessons.html / lesson-01-cards.html / lesson-02-card-valuation.html
+-- laadt CSS en browser scripts in vaste volgorde
+-- index bevat DOM-structuur voor tafel, bieding, dialogs en review
+-- lessons bevat de rustige lespagina en start oefenhanden via index queryparameters
@@ -161,14 +161,26 @@ Verantwoordelijk voor:
Huidige kern:
-- `scripts/app.js` - bootstrap, gedeelde state, DOM refs, shared helpers en top-level orchestration.
-- `scripts/flow/` - veilingflow, kaartspelflow, legaliteit, automatic play en slagvoortgang.
-- `scripts/render/` - rendering per UI-deel, zichtbare speelplantekst en scoretabel-UI.
-- `scripts/state/` - pure state-transitions, localStorage settings, `situatieseed:` codec, herhaalcode en herstel.
-- `scripts/learning/` - lessen, standalone lespagina, woordenlijst en bieduitleg voor AI-suggesties/review.
+- `scripts/app.js` - dunne bootstrap-shell: dependencies controleren, runtime maken, modules registreren, bootstrap starten, public API publiceren en de eerste hand/les starten.
+- `scripts/app/runtime.js` - bouwt `BridgeAppRuntime` met `runtime.state`, `runtime.els`, `runtime.dom`, `runtime.constants`, `runtime.rules`, `runtime.transitions`, `runtime.media` en `runtime.timers`.
+- `scripts/app/helpers.js` - gedeelde formatting-, seat-, kaart-, bied- en scorehelpers op `runtime.helpers`.
+- `scripts/app/hand-start.js`, `scripts/app/bootstrap.js`, `scripts/app/public-api.js` - handstart/replay, top-level DOM-listeners en compatibele `BridgeApp`/`BridgeAppTestHooks`.
+- `scripts/flow/` - veilingflow, contract reveal, kaartspelflow, legaliteit, automatic play, slagvoortgang en handafronding.
+- `scripts/render/` - rendering per UI-deel, render-orchestratie, layout/status/guidance, zichtbare speelplantekst en scoretabel-UI.
+- `scripts/state/` - pure state-transitions, afgeleide review-playback, localStorage settings, `situatieseed:` codec, herhaalcode en herstel.
+- `scripts/ui/` - kleine UI-controllers voor app-menu, instellingen en dialogs.
+- `scripts/feedback/` - feedbackdialog, rapportpayload, kopieer- en submitflow.
+- `scripts/learning/` - lessen, lesson-start vanuit URL/oefenhand, standalone lespagina, gedeelde leskaartnavigatie, woordenlijst en bieduitleg voor AI-suggesties/review.
- `scripts/copy/text-nl.js` - Nederlandse UI-copy.
-Richtlijn: `scripts/app.js` mag bootstrap en gedeelde infrastructuur blijven, maar nieuwe UI-flow hoort waar mogelijk in de passende submap. Als een flow groeit, eerst extracten naar een gerichte module in plaats van `app.js` groter maken.
+Runtime/factory-contract:
+
+- Browsermodules registreren zichzelf onder `globalThis.BridgeAppModules`, bijvoorbeeld `BridgeAppModules.registerPlayFlow(runtime)`.
+- Modules lezen app-context via de ontvangen `runtime`; geen impliciete vrije `state`, `els`, `seats`, `slotEls`, `seatEls`, timers of layoutqueries.
+- Flowmodules vullen vooral `runtime.actions`; rendermodules vullen vooral `runtime.render`; gedeelde kleine helpers horen in `runtime.helpers`.
+- Public API-namen blijven compatibel via `BridgeApp`, `BridgeAppContext` en `BridgeAppTestHooks`, maar intern is `runtime` de enige app-context.
+
+Richtlijn: `scripts/app.js` blijft alleen de shell. Nieuwe UI-flow hoort in de passende submap en registreert zichzelf via het runtime/factory-contract.
#### Herhaalcode-herstelcontract
@@ -222,6 +234,7 @@ Doel:
- `styles.css` blijft de compatibility/aggregator entrypoint voor bestaande laadvolgorde.
- `styles/` bevat domeingerichte CSS: base, layout, table, auction, dialogs, review en responsive gedrag.
- `styles/card.css` bevat de gedeelde visuele kaartbasis; gameplay voegt daar `.card`-gedrag aan toe, lessen gebruiken eigen lesson-classes bovenop `.playing-card`.
+- `styles/lesson-cards.css` bevat de gedeelde kaartnavigatie voor losse lespagina's; les-specifieke stylesheets voegen alleen inhoudelijke layout en oefenvormen toe.
- Component-specifieke responsive regels mogen naast het domeinbestand staan; `styles/auction-responsive.css` is eigenaar van biedtafel-, bidbox- en auction-log-responsiveness.
Richtlijn:
@@ -232,12 +245,13 @@ Richtlijn:
## State model
-De centrale runtime state leeft nu in `scripts/app.js`. Belangrijke velden:
+De centrale runtime state wordt gemaakt in `scripts/app/runtime.js` en leeft tijdens de app-run op `runtime.state`. Belangrijke velden:
- `phase` - idle, bidding, contract-reveal, playing, complete.
- `hands`, `originalHands` - actuele en oorspronkelijke kaarten.
- `auction`, `contract`, `declarer`, `dummy` - veilingresultaat.
- `currentTrick`, `trickHistory`, `tricks` - speelverloop.
+- `reviewCursor` - afgeleide kaart-voor-kaart replaypositie na afloop; verandert geen echte hand-, slag- of scorestate.
- `playPlan`, `playExplanations` - uitlegbare speelkeuzes.
- `dealSeed`, `practice`, `feedbackStatus` - reproduceerbaarheid en feedback.
- `developerMode`, `guidanceMode`, `showPlayHistory` - UX-instellingen.
@@ -253,6 +267,7 @@ user action
```
Nieuwe kernacties moeten bij voorkeur eerst als pure transition ontworpen worden, daarna pas aan DOM/UI gekoppeld worden.
+Huidige eerste transitions staan in `scripts/state/state-transitions.js` voor handstart, bieding toepassen, veilingcontext afronden, rondpas, kaart spelen, slag doorschuiven en hand afronden.
## Uitleg-architectuur
@@ -319,8 +334,8 @@ Zie `DEPLOY.md` voor hostingdetails.
## Belangrijkste architectuurrisico's
-1. `scripts/app.js` blijft een zwaartepunt.
- Mitigatie: nieuwe flows naar gerichte modules; pure transitions uitbreiden.
+1. Scriptvolgorde en runtime-registraties blijven fragiel door de build-vrije architectuur.
+ Mitigatie: `script-order.test.js`, duidelijke `BridgeAppModules.register...` functies en harde dependency-errors in `scripts/app.js`.
2. Biedprofielbestanden worden groot, vooral `rebids.js`, `competitive.js` en `explanations-nl.js`.
Mitigatie: splitsen per auction family wanneer eraan gewerkt wordt, niet als losse megarewrite.
@@ -328,8 +343,8 @@ Zie `DEPLOY.md` voor hostingdetails.
3. Uitleg kan losraken van engine-regels.
Mitigatie: `rule-copy-coverage.test.js` bewaakt dat geteste `ruleId`s een Nederlands uitlegpad houden.
-4. Scriptvolgorde is fragiel door build-vrije architectuur.
- Mitigatie: `script-order.test.js` en stabiele facade via `bridge-rules.js`.
+4. Public API en test hooks kunnen ongemerkt afwijken van browsermodules.
+ Mitigatie: `scripts/app/public-api.js` als enige public API-builder en browser-smoke met `BridgeAppTestHooks`.
5. Beginner-UX kan overladen raken door developer/testfunctionaliteit.
Mitigatie: normale flow compact houden; geavanceerde uitleg in developer mode, review, lessen of woordenlijst.
@@ -362,6 +377,6 @@ Zie `DEPLOY.md` voor hostingdetails.
1. Bespreek of deze laagindeling klopt als gewenste richting.
2. Voeg een klein `docs/decisions.md` toe voor architectuurbesluiten, bijvoorbeeld build-vrij blijven en facade stabiel houden.
-3. Splits toekomstige uitbreidingen van `scripts/app.js` standaard naar gerichte modules.
+3. Houd toekomstige app-uitbreidingen aan het runtime/factory-contract en voorkom nieuwe impliciete app-globals.
4. Splits grote Vijfkaart Hoog-bestanden alleen wanneer een concreet roadmapitem dat gebied raakt.
5. Houd nieuwe `ruleId`-fixtures gekoppeld aan Nederlandse uitleg, zodat de coverage-test nuttig blijft.
diff --git a/docs/lesformat.md b/docs/lesformat.md
new file mode 100644
index 0000000..cf105bc
--- /dev/null
+++ b/docs/lesformat.md
@@ -0,0 +1,974 @@
+# Lesformat Bridgetafel
+
+Status: herbruikbaar inhoudelijk lesformat
+Scope: de 12 lessen uit `docs/lessenplan.md`, oefenhanden, quizzen en toekomstige lesfeedback
+
+Dit format is de standaardvorm voor alle Bridgetafel-lessen, tenzij een les aantoonbaar beter werkt met een andere setup. Het format is inhoudelijk bedoeld: het helpt lessen schrijven die later netjes passen in `scripts/learning/lessons.js`, oefenhanden in `practice-hands/` en glossary-linking via `scripts/learning/glossary.js`.
+
+Gebruik `docs/vijfkaart-hoog-systeem.md` als systeembron. Lescopy mag simpeler zijn dan de engine, maar mag geen andere biedafspraken aanleren.
+
+## Ontwerpprincipes
+
+- Schrijf voor online leren: korte stukken, vaak klikken, meteen feedback.
+- Laat de speler steeds iets doen: kiezen, tellen, aanwijzen, voorspellen of proberen aan tafel.
+- Gebruik glossary-termen letterlijk wanneer ze in `glossary.js` staan.
+- Houd normale gameplay compact; uitgebreide uitleg hoort in de les, review, AI-suggesties of developer mode.
+- Maak feedback vriendelijk en concreet: wat zag je, waarom is dat logisch, wat probeer je nu?
+- Geef geen harde foutcorrectie als de engine of oefenhand het niet betrouwbaar kan onderbouwen.
+- Gebruik `1SA` in lescopy; map naar `1NT` waar code of oefenhanden dat nodig hebben.
+- Gebruik de bridgetafel voor korte, concrete lesmomenten: meestal 1 bod, 1 kaart, 1 slagmoment of 1 reviewcheck.
+- Laat terugkeer naar de les altijd expliciet zijn via `Terug naar les`; geen automatische redirect na een tafelsituatie.
+
+## Vaste lesopbouw
+
+Elke les gebruikt deze onderdelen in deze volgorde:
+
+1. Welkom aan tafel - korte, leuke introductie.
+2. Wat leer je vandaag? - 3 tot 5 concrete leerdoelen.
+3. De situatie - een herkenbare bridgevraag.
+4. De theorie in kleine stappen - maximaal 5 korte blokken.
+5. Kijk mee aan tafel - een uitgewerkt bied- of speelvoorbeeld.
+6. Jij bent aan de beurt - interactieve vraag met feedback.
+7. Oefenen met handen - automatisch genereerbare handen met criteria.
+8. Veelgemaakte beginnersfouten - 3 tot 5 valkuilen.
+9. Mini-quiz - minimaal 6 vragen.
+10. Eindchallenge - leuke opdracht op het bestaande bridge-bord.
+11. Samenvatting - 5 kernzinnen.
+
+Deze opbouw hoort bij de losse lespagina zelf. Het algemene lessenoverzicht toont niet al deze onderdelen.
+
+## Lessenoverzicht
+
+Op `lessons.html` is de leskaart een rustige keuzehulp, geen inhoudsopgave. Per geselecteerde les staat daar alleen:
+
+- de titel;
+- `Leerdoelen`;
+- een enkele knop `Start les`.
+
+Richtlijnen:
+
+- Toon op het overzicht geen losse hoofdstukken, onderdelen, quizzen, oefenhanden of tafelmomenten.
+- Maak onderdelen op het overzicht niet apart openklikbaar.
+- Gebruik geen extra kop boven de startknop als de knop zelf al `Start les` zegt.
+- De losse lespagina mag daarna wel kaartnavigatie, oefeningen, quizzen en tafellussen tonen.
+- `lesson.summary` mag bestaan als interne korte belofte of fallback, maar het overzicht gebruikt primair `learningGoals`.
+
+## Kaartnavigatie voor losse lespagina's
+
+Nieuwe losse lespagina's gebruiken de gedeelde kaartstructuur uit `styles/lesson-cards.css` en `scripts/learning/lesson-cards.js`. Daarmee ziet de cursist steeds een leskaart tegelijk en staat de `Vorige`/`Volgende`-balk onder de actieve kaart.
+
+Minimaal HTML-contract:
+
+```html
+
+
+
+
+
+
+
Wat leer je vandaag?
+
+
+
+
De theorie in kleine stappen
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+Richtlijnen:
+
+- Elke kaart heeft een uniek `id`, een `h2` en `data-lesson-card`.
+- De ankerlinks in `data-lesson-card-nav` verwijzen naar die kaart-ids.
+- De navigatiebalk staat na de leskaarten, dus onderaan de actieve kaart.
+- Les-specifieke CSS mag extra layoutclasses toevoegen, maar de kaartnavigatie blijft in de gedeelde CSS.
+- Les-specifieke JavaScript regelt alleen oefeningen, quizzen of handgeneratie; kaartnavigatie blijft in `lesson-cards.js`.
+
+## Lesmetadata
+
+Vul dit bovenaan elke les intern in, ook als niet alles zichtbaar wordt voor de speler.
+
+```text
+Lesnummer:
+Titel:
+Korte belofte:
+Hoofdfocus: Bieden / Spelen / Score / Review / Tegenspel
+Voorkennis:
+Nieuwe glossary-termen:
+Herhaalde glossary-termen:
+Biedprofiel: fiveCardHigh
+Primaire oefenhanden:
+Benodigde engine-uitleg: ruleId, planAction of reviewtekst
+Wanneer feedback hard mag zijn:
+Wanneer feedback voorzichtig moet blijven:
+Hoofdstukken met tafelsituatie:
+Return-doel per hoofdstuk:
+```
+
+## Hoofdstukken en korte tafelsituaties
+
+Een leshoofdstuk mag de bestaande bridgetafel gebruiken als korte oefenlus. De speler leest of beantwoordt iets in de les, klikt op oefenen, doet aan tafel precies het kernmoment, ziet een klaar-kaart en kiest daarna zelf `Terug naar les`.
+
+Gebruik dit voor:
+
+- 1 bod kiezen, bijvoorbeeld openen met `1SA` of passen;
+- 1 kaart spelen, bijvoorbeeld kleur bekennen of een uitkomst kiezen;
+- 1 slagmoment bekijken, bijvoorbeeld Dummy reveal of Slagwinnaar;
+- 1 reviewmoment controleren, bijvoorbeeld Contract, resultaat of score;
+- alleen uitzonderlijk een volledige hand uitspelen.
+
+Schrijf elke tafelsituatie als hoofdstuktaak:
+
+```yaml
+chapter:
+ id: een-sa-opening-herkennen
+ title: 1SA-hand herkennen
+ handId: one-nt-opening-001
+ tableTask:
+ type: bid
+ completion: southBid
+ doneTitle: Bod gedaan
+ doneBody: Je hebt het openingsbod gekozen. Ga terug naar de les om de keuze te vergelijken.
+ returnLabel: Terug naar les
+ retryLabel: Nog eens proberen
+ boardGuidance:
+ - id: valueThenBid
+ target: bidControls
+ gate: allowHumanBid
+ badge: Openingskeuze
+ title: Waardeer eerst Zuid
+ body: Tel HCP, kijk of de verdeling evenwichtig is en kies daarna het openingsbod.
+ buttonLabel: Ik kies mijn bod
+```
+
+`chapter.id` is het anker waarnaar de speler terugkeert. Een startlink naar de tafel bevat daarom minimaal `lesson`, `hand`, `chapter` en een `return`-URL naar de oorspronkelijke lesplek, bijvoorbeeld `lessons.html?lesson=...#chapter-id` of een losse `lesson-...html#stap`.
+
+### `tableTask`
+
+`tableTask` beschrijft wanneer een korte tafelsituatie klaar is en wat de speler daarna ziet.
+
+Velden:
+
+- `type`: `bid`, `card`, `trick`, `review` of `hand`.
+- `completion`: concrete klaarvoorwaarde, bijvoorbeeld `southBid`, `northSouthCard`, `trickWinnerShown`, `reviewReached` of `handComplete`.
+- `doneTitle`: korte titel op de klaar-kaart.
+- `doneBody`: 1 tot 2 zinnen die het lesmoment afronden.
+- `returnLabel`: meestal `Terug naar les`.
+- `retryLabel`: optioneel; gebruik dit alleen wanneer opnieuw proberen didactisch zinvol is.
+
+Richtlijnen:
+
+- Kies de kleinste completion die het lesdoel bewijst.
+- Bij `bid` is meestal 1 bod door Zuid genoeg.
+- Bij `card` is meestal 1 kaart door Zuid of Dummy genoeg.
+- Bij `trick` stopt de situatie zodra de Slagwinnaar zichtbaar is.
+- Bij `review` stopt de situatie zodra het relevante reviewpaneel is bereikt.
+- Bij `hand` speelt de speler bewust de hele hand uit; gebruik dit spaarzaam.
+- Na completion hoort gewone gameplay geblokkeerd of gedempt te blijven totdat de speler `Terug naar les` of `Nog eens proberen` kiest.
+
+### `boardGuidance`
+
+`boardGuidance` is de coachlaag op de tafel. Gebruik die voor spotlight en alleen voor noodzakelijke flowblokkades.
+
+Ondersteunde targets:
+
+- `contract`
+- `bidControls`
+- `auctionLog`
+- `dummy`
+- `legalCards`
+- `trumpCards`
+- `trickArea`
+- `trickWinner`
+- `review`
+- `lessonPanel`
+
+Ondersteunde gates:
+
+- `none` - alleen spotlight/uitleg, geen blokkade.
+- `allowHumanBid` - blokkeert het bod totdat de speler de coachstap bevestigt.
+- `allowHumanPlay` - blokkeert de kaart totdat de speler de coachstap bevestigt.
+- `advanceTrick` - laat de speler bewust naar de volgende slag gaan.
+
+Gebruik gates alleen bij kernmomenten. Als de speler al veilig verder kan zonder uitleg te missen, gebruik `gate: none`.
+
+### Tijdelijke lesinstellingen
+
+In lesmodus zijn rustige tafelinstellingen tijdelijk leidend:
+
+- `showPlayHistory = false`;
+- `guidanceMode = false`;
+- `developerMode = false`.
+
+Deze waarden mogen opgeslagen voorkeuren niet overschrijven. Lescopy mag er dus niet van uitgaan dat developer-uitleg, AI-suggesties of speelgeschiedenis zichtbaar blijven tijdens een korte tafelsituatie.
+
+## 1. Welkom aan tafel
+
+Doel: de speler ontspannen binnenhalen en nieuwsgierig maken.
+
+Richtlijn:
+
+- 2 tot 4 korte zinnen.
+- Noem een herkenbaar tafelmoment, niet meteen een theoriehoofdstuk.
+- Een klein grapje mag, maar de bridgevraag moet helder blijven.
+- Eindig met een zachte actie: "Kijk eerst eens naar Zuid" of "We gaan samen tellen."
+
+Voorbeeldvorm:
+
+```text
+Welkom aan tafel. Vandaag draait alles om [leskern].
+Je hoeft nog niet alles perfect te zien; je zoekt alleen het eerste goede spoor.
+Aan het einde kun je [concreet resultaat] aan een echte hand herkennen.
+```
+
+## 2. Wat leer je vandaag?
+
+Doel: de les belooft concreet gedrag, geen abstract hoofdstuk.
+
+Richtlijn:
+
+- 3 tot 5 leerdoelen.
+- Begin elk leerdoel met een werkwoord: herken, tel, kies, verklaar, speel, vergelijk.
+- Koppel minimaal 2 leerdoelen aan glossary-termen.
+- Laat elk leerdoel terugkomen in oefening, quiz of eindchallenge.
+
+Voorbeeldvorm:
+
+```text
+- Je herkent [glossary-term] in een echte bieding.
+- Je kiest tussen [optie A] en [optie B] met de afspraak uit Vijfkaart-Hoog.
+- Je legt in een zin uit waarom [bod/kaart] logisch is.
+- Je probeert dit op het bridge-bord met een vaste oefenhand.
+```
+
+## 3. De situatie
+
+Doel: een herkenbare bridgevraag zetten voordat de theorie begint.
+
+Richtlijn:
+
+- 1 concrete vraag aan Zuid, Noord/Zuid of de leider.
+- Gebruik echte tafelcontext: kwetsbaarheid, dealer, biedverloop, dummy of slagpositie alleen als dat nodig is.
+- Laat de speler eerst voorspellen voordat de uitleg antwoord geeft.
+- Houd de vraag geschikt voor beginners: een beste eerste stap is genoeg.
+
+Voorbeeldvorm:
+
+```text
+Zuid is aan de beurt. Partner heeft [bod/actie] gedaan.
+Je hebt [kracht/verdeling/speelpositie].
+Wat is nu je eerste vraag aan jezelf?
+```
+
+Goede situatievragen:
+
+- "Open je met 1SA of met een kleur?"
+- "Hebben Noord/Zuid samen een Fit?"
+- "Welke kleur wordt je Werkkleur in Sans-atout?"
+- "Wie komt uit, en wanneer verschijnt Dummy?"
+
+## 4. De theorie in kleine stappen
+
+Doel: maximaal 5 korte theorieblokken die elk maar een idee dragen.
+
+Elke theorieblok gebruikt dit vaste mini-format:
+
+```text
+### Stap [nummer] - [korte titel]
+
+Kernzin:
+[Een zin die de speler mag onthouden.]
+
+Uitleg:
+[3 tot 6 korte zinnen. Maximaal een nieuw idee.]
+
+Glossary-termen:
+[2 tot 5 termen uit glossary.js, letterlijk gespeld.]
+
+Probeer zelf:
+[Een kleine tel-, kies-, wijs-aan- of voorspelvraag.]
+
+Directe feedback:
+- Als goed: [waarom dit klopt].
+- Als bijna: [welk detail ontbreekt].
+- Als mis: [waar opnieuw naar kijken].
+```
+
+Regels voor theorieblokken:
+
+- Maximaal 5 blokken per les.
+- Maximaal 90 woorden uitleg per blok.
+- Minstens 1 "Probeer zelf"-moment na elke 2 blokken; liever in elk blok.
+- Gebruik glossary-termen waar passend, vooral in titels, kernzinnen, feedback en quiz.
+- Leg kunstmatige biedingen altijd uit als betekenis, niet alleen als kaartje. Voorbeeld: `2R` na `1SA` kan Jacoby-transfer naar harten zijn.
+- Herhaal oude begrippen kort wanneer ze nodig zijn: "We kennen Fit al: samen minstens acht kaarten in een kleur."
+
+Voorbeeld van een theorieblok:
+
+```text
+### Stap 2 - Stayman vraagt naar een hoge kleur
+
+Kernzin:
+Stayman is een vraag naar een vierkaart harten of schoppen.
+
+Uitleg:
+Na een 1SA-opening weet partner al veel: 15-17 HCP en een Evenwichtige verdeling. Met Stayman zoekt responder een 4-4 Fit in de Hoge kleuren. Het bod 2K betekent dan niet: "ik wil klaveren spelen", maar: "partner, heb jij een vierkaart hoog?"
+
+Glossary-termen:
+Stayman, Sans-atout, HCP, Evenwichtige verdeling, Fit, Hoge kleuren, Conventioneel bod
+
+Probeer zelf:
+Je hebt 8 HCP en vier harten na partners 1SA. Vraag je met Stayman?
+
+Directe feedback:
+- Als goed: Ja, je zoekt eerst of er een hoge-kleurfit is.
+- Als bijna: Let op: vierkaart hoog is precies waarom Stayman bestaat.
+- Als mis: Kijk opnieuw naar de combinatie 1SA, HCP en vierkaart hoog.
+```
+
+## 5. Kijk mee aan tafel
+
+Doel: een uitgewerkt voorbeeld waarin de speler ziet hoe de theorie aan tafel klinkt.
+
+Kies per les een biedvoorbeeld of speelvoorbeeld. Gebruik beide alleen als dat de les niet te lang maakt.
+
+Format voor een biedvoorbeeld:
+
+```text
+Situatie:
+[Dealer, kwetsbaarheid indien relevant, Zuid-hand of Noord/Zuid-context.]
+
+Biedverloop:
+1. [Bod] - [korte betekenis]
+2. [Bod] - [korte betekenis]
+3. [Eindcontract of tussenconclusie]
+
+Waarom dit werkt:
+[Korte uitleg met glossary-termen.]
+
+Let op:
+[Een beginnerverwarring, bijvoorbeeld biedkaartje versus betekenis.]
+```
+
+Format voor een speelvoorbeeld:
+
+```text
+Situatie:
+[Contract, leider, dummy, uitkomst.]
+
+Kijkstappen:
+1. Wat is het Contract?
+2. Wie is Leider en wie is Dummy?
+3. Wat is Troef of is het Sans-atout?
+4. Wat is het eerste plan: Troef trekken, Werkkleur kiezen, Stopper bewaren, Aftroeven of iets anders?
+5. Welke kaart probeer je nu?
+
+Waarom dit werkt:
+[Korte uitleg met glossary-termen en eventueel planAction.]
+```
+
+Feedbackregel: de tekst zegt niet "dit is altijd goed", maar "in deze situatie is dit logisch omdat ...".
+
+## 6. Jij bent aan de beurt
+
+Doel: de speler maakt zelf een keuze en krijgt directe feedback.
+
+Richtlijn:
+
+- 1 hoofdvraag per lesonderdeel.
+- 2 tot 4 opties.
+- Elke optie krijgt eigen feedback.
+- De juiste optie krijgt een korte bevestiging plus reden.
+- Foute opties leggen uit welk detail je over het hoofd ziet.
+- Bied bij twijfel een tweede poging aan in plaats van meteen door te gaan.
+
+Invulvorm:
+
+```text
+Vraag:
+[Wat bied/speel/kies je nu?]
+
+Opties:
+A. [optie]
+B. [optie]
+C. [optie]
+
+Feedback:
+A. [correct/bijna/mis + uitleg]
+B. [correct/bijna/mis + uitleg]
+C. [correct/bijna/mis + uitleg]
+
+Glossary-termen in feedback:
+[termen]
+```
+
+Geschikte interacties:
+
+- Kies het bod.
+- Kies de kaart.
+- Wijs Leider, Dummy, Troef of Uitkomst aan.
+- Tel HCP.
+- Tel benodigde slagen bij het Contract.
+- Kies tussen Troef trekken, Aftroeven, Werkkleur ontwikkelen of Stopper bewaren.
+
+## 7. Oefenen met handen
+
+Doel: elke les heeft oefenhanden die vastgelegd of automatisch genereerbaar zijn.
+
+Elke les bevat minimaal 4 handen of handcriteria:
+
+- 1 instaphand: precies het lesdoel, weinig ruis.
+- 1 variatiehand: hetzelfde doel met een kleine draai.
+- 1 herkenningshand: speler moet kiezen of de regel wel of niet past.
+- 1 challengehand: lesdoel in een echte tafelcontext met review.
+
+Gebruik bestaande oefenhand-id's waar mogelijk. Ontbrekende handen krijgen een voorstel-id en criteria, zonder te doen alsof ze al bestaan.
+
+Criteriaformat:
+
+```yaml
+- id: lesson-[nn]-[slug]-001
+ status: bestaand | voorstel
+ lesdoel: "..."
+ fase: bidding | play | review | score
+ startmodus: auction | play | complete
+ spelerstaak: "Wat moet Zuid/de leider/de tegenspeler doen?"
+ tableTask:
+ type: bid | card | trick | review | hand
+ completion: southBid | northSouthCard | trickWinnerShown | reviewReached | handComplete
+ doneTitle: ""
+ doneBody: ""
+ returnLabel: "Terug naar les"
+ retryLabel: ""
+ systeemafspraak: "fiveCardHigh"
+ vaste_context:
+ dealer: any | N | E | S | W
+ kwetsbaarheid: any | none | NS | EW | both
+ biedverloop_prefix: []
+ contract: ""
+ leider: ""
+ uitkomst: ""
+ handcriteria:
+ zuid:
+ hcp: ""
+ verdeling: ""
+ vereiste_kaarten: []
+ verboden_patronen: []
+ noord:
+ hcp: ""
+ verdeling: ""
+ vereiste_kaarten: []
+ oost_west:
+ constraints: []
+ verwachte_actie:
+ bieding: ""
+ kaart: ""
+ planactie: ""
+ uitleg_moet_noemen:
+ glossary: []
+ ruleIds: []
+ waarschuwing: ""
+ acceptatiecheck:
+ - "De legale actie is beschikbaar."
+ - "De AI-suggestie of review noemt dezelfde reden als de les."
+ - "De speler kan na afloop zien waarom het resultaat klopt."
+```
+
+Voorbeeldcriteria voor een biedhand:
+
+```yaml
+- id: lesson-07-stayman-find-fit-001
+ status: voorstel
+ lesdoel: "Stayman gebruiken na 1SA om een hoge-kleurfit te zoeken."
+ fase: bidding
+ startmodus: auction
+ spelerstaak: "Zuid kiest het antwoord op partners 1SA-opening."
+ systeemafspraak: "fiveCardHigh"
+ vaste_context:
+ dealer: N
+ kwetsbaarheid: any
+ biedverloop_prefix: ["N:1SA"]
+ handcriteria:
+ zuid:
+ hcp: "8-9"
+ verdeling: "minstens een vierkaart harten of schoppen, geen vijfkaart hoog"
+ noord:
+ hcp: "15-17"
+ verdeling: "Evenwichtige verdeling"
+ verwachte_actie:
+ bieding: "2K als Stayman"
+ uitleg_moet_noemen:
+ glossary: ["Stayman", "Sans-atout", "Fit", "Hoge kleuren", "Conventioneel bod"]
+ acceptatiecheck:
+ - "2K wordt uitgelegd als Stayman, niet als natuurlijk klaveren."
+ - "De vervolgactie zoekt een Fit in harten of schoppen."
+ - "Na het gevraagde bod verschijnt een klaar-kaart met Terug naar les."
+```
+
+Voorbeeldcriteria voor een speelhand:
+
+```yaml
+- id: lesson-08-draw-trumps-generated-001
+ status: voorstel
+ lesdoel: "Als Leider eerst Troef trekken wanneer er geen urgente Aftroever is."
+ fase: play
+ startmodus: play
+ spelerstaak: "Zuid maakt een eerste speelplan na Dummy reveal."
+ vaste_context:
+ contract: "4S door Zuid"
+ leider: S
+ uitkomst: "veilig zijkleurkaartje door West"
+ handcriteria:
+ noord_zuid:
+ fit: "minstens 8 schoppen samen"
+ losers: "zichtbare Verliezers, maar geen directe noodzaak om eerst af te troeven"
+ oost_west:
+ constraints: ["tegenpartij heeft 3 tot 5 troeven samen"]
+ verwachte_actie:
+ planactie: "Troef trekken"
+ uitleg_moet_noemen:
+ glossary: ["Leider", "Dummy", "Troef", "Troef trekken", "Verliezers"]
+ acceptatiecheck:
+ - "Het speelplanpaneel adviseert Troef trekken."
+ - "Review maakt duidelijk waarom troefcontrole nuttig was."
+```
+
+## 8. Veelgemaakte beginnersfouten
+
+Doel: valkuilen benoemen zonder de speler af te straffen.
+
+Richtlijn:
+
+- 3 tot 5 valkuilen.
+- Elke valkuil bevat: fout, waarom begrijpelijk, betere vraag, korte retry.
+- Koppel valkuilen aan echte lesfeedback of quizdistractors.
+
+Invulvorm:
+
+```text
+1. Valkuil: [wat doet een beginner?]
+ Waarom begrijpelijk: [welke gedachte zit erachter?]
+ Betere vraag: [waar moet de speler eerst naar kijken?]
+ Feedbackzin: [vriendelijke zin in de app]
+```
+
+Voorbeelden:
+
+- "1SA als Vuilnisbakkenbod verwarren met een sterke Sans-atout-hand."
+- "Bij Jacoby-transfer naar het biedkaartje kijken en vergeten wat het betekent."
+- "Te snel Troef trekken terwijl Dummy eerst een korte kleur kan Aftroeven."
+- "Een Volgbod doen met alleen punten, maar zonder goede kleur."
+
+## 9. Mini-quiz
+
+Doel: minimaal 6 korte vragen die begrip checken voordat de eindchallenge begint.
+
+Richtlijn:
+
+- Minimaal 6 vragen.
+- Mix herkenning, toepassing en kleine uitleg.
+- Maximaal 4 antwoordopties.
+- Elke vraag krijgt feedback voor goed en fout.
+- Minimaal 3 vragen gebruiken glossary-termen letterlijk.
+- Minimaal 1 vraag gebruikt een mini-biedverloop of mini-speelpositie.
+- Minimaal 1 vraag vraagt om "waarom", maar het antwoord blijft kort.
+
+Quizformat:
+
+```text
+Vraag [nummer]:
+[vraag]
+
+Type:
+meerkeuze | juist/onjuist | volgorde | wijs aan | korte uitleg
+
+Opties:
+- [optie]
+- [optie]
+- [optie]
+
+Correct:
+[antwoord]
+
+Feedback goed:
+[bevestiging + reden]
+
+Feedback fout:
+[hint + correcte anker]
+
+Glossary-termen:
+[termen]
+```
+
+Vragenmix per les:
+
+1. Begrip: "Wat betekent [term]?"
+2. Herkenning: "Welke hand past bij [regel]?"
+3. Toepassing: "Wat bied of speel je?"
+4. Grensgeval: "Waarom is dit net geen [regel]?"
+5. Tafelritme: "Wie is aan de beurt of wie wordt Leider?"
+6. Uitleg: "Maak de zin af: ik kies dit omdat ..."
+
+## 10. Eindchallenge
+
+Doel: de les eindigt met een kleine missie op het bestaande bridge-bord.
+
+Richtlijn:
+
+- Gebruik een bestaande oefenhand of voorstel-id uit deze les.
+- Geef een leuk doel, geen examenstress.
+- Laat de speler voor de eerste actie voorspellen.
+- Laat na afloop review of lesfeedback drie dingen teruggeven: keuze, resultaat, lesdoel.
+- Maak succes haalbaar: de challenge mag over de juiste beslissing gaan, niet alleen over perfecte score.
+
+Invulvorm:
+
+```text
+Challenge:
+[speelse opdrachtnaam]
+
+Start:
+[handId, startmodus, hoofdstuk-id, tableTask en eventuele boardGuidance]
+
+Missie:
+[wat moet de speler proberen?]
+
+Succescheck:
+- [eerste juiste keuze]
+- [lesdoel zichtbaar in spel of review]
+- [klaar-kaart verschijnt na de afgesproken completion]
+- [Terug naar les opent hetzelfde hoofdstuk]
+- [speler kan in een zin uitleggen waarom]
+
+Reviewzin:
+[korte afronding met glossary-termen]
+```
+
+Voorbeelden:
+
+- "Openingsbingo: vind in vier handen pas, 1SA, een hoge-kleuropening en een lage-kleuropening."
+- "Geheime boodschap: noteer bij elk Conventioneel bod wat het kaartje zegt en wat het betekent."
+- "Speelplan in vijf woorden: kies na Dummy reveal je eerste planactie."
+
+## 11. Samenvatting
+
+Doel: precies 5 kernzinnen die de speler mag onthouden op de losse lespagina. Dit is niet de compacte kaart op `lessons.html`.
+
+Richtlijn:
+
+- 5 zinnen, geen bullets met bijzinnen die stiekem paragrafen worden.
+- Elke zin is zelfstandig en concreet.
+- Gebruik glossary-termen letterlijk waar passend.
+- Herhaal de belangrijkste grens: wanneer geldt de regel wel, wanneer niet?
+- Laat de laatste zin vooruitwijzen naar oefenen of de volgende les.
+
+Invulvorm:
+
+```text
+1. [Kernzin over het hoofdbegrip.]
+2. [Kernzin over de keuze aan tafel.]
+3. [Kernzin over een belangrijke uitzondering of grens.]
+4. [Kernzin over feedback/review.]
+5. [Kernzin die de speler meeneemt naar de volgende hand.]
+```
+
+## Glossary-termen per les
+
+Gebruik deze termbank als startpunt. Voeg alleen termen toe als ze in `glossary.js` staan of bewust als toekomstige glossary-term zijn gemarkeerd.
+
+| Les | Primaire glossary-termen |
+| --- | --- |
+| 1 | Slag, Contract, Troef, Sans-atout, Leider, Dummy, Uitkomst, Kleur bekennen |
+| 2 | HCP, Honneur, Evenwichtige verdeling, Fit, Fitpunten, Opening, Openingskracht, Regel van 20 |
+| 3 | Opening, Openaar, Openingskracht, Hoge kleuren, Lage kleuren, Sans-atout, Evenwichtige verdeling, Regel van 20 |
+| 4 | Bijbod, Fit, Vuilnisbakkenbod, Hoge kleuren, Lage kleuren, Forcing, Minimum |
+| 5 | Herbieding, Minimum, Maximum, Invite, Openaar, Bijbod, Fit, Manche |
+| 6 | Fit, Fitpunten, Manche, Hoge kleuren, Invite, Troef trekken, Contractpunten |
+| 7 | Sans-atout, Stayman, Jacoby-transfer, Conventioneel bod, Hoge kleuren, Fit, Leider |
+| 8 | Leider, Dummy, Verliezers, Troef trekken, Aftroeven, Afgooien, Entree |
+| 9 | Sans-atout, Werkkleur, Stopper, Ophouden, Entree, Vrijspelen, Lengteslagen, Gevaarlijke hand |
+| 10 | Tegenspelers, Uitkomst, Serie, Honneur, Vrijspelen |
+| 11 | Volgbod, Informatiedoublet, Doublet, Biedplicht, Kwetsbaarheid, Openingskracht, Hoge kleuren, Lage kleuren |
+| 12 | Zwakke twee, Vierde-kleur-forcing, Forcing, Azenvragen, Slem, Kleinslem, Grootslem, Manche, Conventioneel bod |
+
+Let op: "Speelplan", "Signaleren", "tweede hand laag" en "derde hand hoog" zijn inhoudelijk nuttig, maar staan niet allemaal als losse glossary-termen. Markeer ze bij implementatie als gewone lescopy of voeg later expliciete glossary-items toe.
+
+## Compleet invulsjabloon
+
+Kopieer dit blok voor een nieuwe lesuitwerking.
+
+```markdown
+# Les [nummer] - [titel]
+
+## Welkom aan tafel
+
+[2 tot 4 korte zinnen.]
+
+## Wat leer je vandaag?
+
+- [Leerdoel 1.]
+- [Leerdoel 2.]
+- [Leerdoel 3.]
+- [Optioneel leerdoel 4.]
+- [Optioneel leerdoel 5.]
+
+## De situatie
+
+[Een herkenbare bridgevraag aan Zuid, Noord/Zuid, Leider of Tegenspelers.]
+
+## De theorie in kleine stappen
+
+### Stap 1 - [titel]
+
+Kernzin: [...]
+
+Uitleg: [...]
+
+Glossary-termen: [...]
+
+Probeer zelf: [...]
+
+Directe feedback:
+- Als goed: [...]
+- Als bijna: [...]
+- Als mis: [...]
+
+### Stap 2 - [titel]
+
+Kernzin: [...]
+
+Uitleg: [...]
+
+Glossary-termen: [...]
+
+Probeer zelf: [...]
+
+Directe feedback:
+- Als goed: [...]
+- Als bijna: [...]
+- Als mis: [...]
+
+### Stap 3 - [titel]
+
+Kernzin: [...]
+
+Uitleg: [...]
+
+Glossary-termen: [...]
+
+Probeer zelf: [...]
+
+Directe feedback:
+- Als goed: [...]
+- Als bijna: [...]
+- Als mis: [...]
+
+### Stap 4 - [titel]
+
+Kernzin: [...]
+
+Uitleg: [...]
+
+Glossary-termen: [...]
+
+Probeer zelf: [...]
+
+Directe feedback:
+- Als goed: [...]
+- Als bijna: [...]
+- Als mis: [...]
+
+### Stap 5 - [titel]
+
+Kernzin: [...]
+
+Uitleg: [...]
+
+Glossary-termen: [...]
+
+Probeer zelf: [...]
+
+Directe feedback:
+- Als goed: [...]
+- Als bijna: [...]
+- Als mis: [...]
+
+## Kijk mee aan tafel
+
+Situatie: [...]
+
+Bied- of speelverloop:
+1. [...]
+2. [...]
+3. [...]
+
+Waarom dit werkt: [...]
+
+Let op: [...]
+
+## Jij bent aan de beurt
+
+Vraag: [...]
+
+Opties:
+A. [...]
+B. [...]
+C. [...]
+
+Feedback:
+A. [...]
+B. [...]
+C. [...]
+
+## Oefenen met handen
+
+### Hand 1 - Instap
+
+- id:
+- status: bestaand | voorstel
+- lesdoel:
+- tableTask:
+- criteria:
+- verwachte actie:
+- uitleg moet noemen:
+
+### Hand 2 - Variatie
+
+- id:
+- status: bestaand | voorstel
+- lesdoel:
+- tableTask:
+- criteria:
+- verwachte actie:
+- uitleg moet noemen:
+
+### Hand 3 - Herkenning
+
+- id:
+- status: bestaand | voorstel
+- lesdoel:
+- tableTask:
+- criteria:
+- verwachte actie:
+- uitleg moet noemen:
+
+### Hand 4 - Challenge
+
+- id:
+- status: bestaand | voorstel
+- lesdoel:
+- tableTask:
+- criteria:
+- verwachte actie:
+- uitleg moet noemen:
+
+## Veelgemaakte beginnersfouten
+
+1. Valkuil: [...]
+ Betere vraag: [...]
+ Feedbackzin: [...]
+
+2. Valkuil: [...]
+ Betere vraag: [...]
+ Feedbackzin: [...]
+
+3. Valkuil: [...]
+ Betere vraag: [...]
+ Feedbackzin: [...]
+
+## Mini-quiz
+
+1. Vraag: [...]
+ Opties: [...]
+ Correct: [...]
+ Feedback goed: [...]
+ Feedback fout: [...]
+
+2. Vraag: [...]
+ Opties: [...]
+ Correct: [...]
+ Feedback goed: [...]
+ Feedback fout: [...]
+
+3. Vraag: [...]
+ Opties: [...]
+ Correct: [...]
+ Feedback goed: [...]
+ Feedback fout: [...]
+
+4. Vraag: [...]
+ Opties: [...]
+ Correct: [...]
+ Feedback goed: [...]
+ Feedback fout: [...]
+
+5. Vraag: [...]
+ Opties: [...]
+ Correct: [...]
+ Feedback goed: [...]
+ Feedback fout: [...]
+
+6. Vraag: [...]
+ Opties: [...]
+ Correct: [...]
+ Feedback goed: [...]
+ Feedback fout: [...]
+
+## Eindchallenge
+
+Challenge: [...]
+
+Start: [...]
+
+Missie: [...]
+
+Succescheck:
+- [...]
+- [...]
+- [...]
+- [Klaar-kaart verschijnt op de tafel.]
+- [Terug naar les keert terug naar hetzelfde hoofdstuk.]
+
+Reviewzin: [...]
+
+## Samenvatting
+
+1. [...]
+2. [...]
+3. [...]
+4. [...]
+5. [...]
+```
+
+## Acceptatiecheck per les
+
+Een les is formatklaar wanneer dit allemaal klopt:
+
+- Alle verplichte onderdelen staan erin.
+- De theorie heeft maximaal 5 blokken.
+- Elk theorieblok heeft passende glossary-termen of bewust geen jargon.
+- De les gebruikt de biedafspraken uit `docs/vijfkaart-hoog-systeem.md`.
+- Kunstmatige biedingen scheiden biedkaartje en betekenis.
+- Er is minimaal 1 echte interactievraag met feedback per les.
+- De mini-quiz heeft minimaal 6 vragen.
+- Er zijn minimaal 4 oefenhanden of handcriteria.
+- De eindchallenge start op het bestaande bridge-bord.
+- De leskaart op `lessons.html` toont alleen titel, leerdoelen en een enkele startknop.
+- Elke bridge-bordstart vanuit een hoofdstuk heeft `chapter`, `return` en waar nodig een compacte `tableTask`.
+- Elke korte tafelsituatie heeft een duidelijke completion, klaar-kaart en expliciete `Terug naar les`.
+- `boardGuidance` blokkeert alleen kernmomenten; spotlights zonder noodzakelijke actie gebruiken `gate: none`.
+- De samenvatting bestaat uit precies 5 kernzinnen.
+- Feedback is alleen hard waar de engine of oefenhand dat betrouwbaar ondersteunt.
diff --git a/docs/lessenplan.md b/docs/lessenplan.md
index d31be08..2766105 100644
--- a/docs/lessenplan.md
+++ b/docs/lessenplan.md
@@ -1,510 +1,903 @@
# Lessenplan Bridgetafel
-Status: voorstel
-Scope: `bridge-app` lesmodus en oefenhanden
+Status: inhoudelijke cursusstructuur
+Scope: `bridge-app` lesmodus, oefenhanden en toekomstige lesfeedback
-Dit lessenplan vertaalt de huidige 12-delige lesroute naar een praktische product- en implementatierichting. Het doel is niet om een boek te vervangen, maar om beginners met korte uitleg, vaste oefenhanden en betrouwbare feedback steeds zelfstandiger bridge te laten spelen.
+Dit lessenplan beschrijft een cursus van 12 online bridgelessen voor beginners tot lichtgevorderden. De cursus leert bridge via Vijfkaart-Hoog, in de geest van NBB/Barry's Vijfkaart Hoog en `Start met Bridge 1 & 2`, maar blijft zo geschreven dat andere conventieprofielen later naast dit eerste profiel kunnen bestaan.
-## Doelgroep
+Het doel is niet om een boek droog na te vertellen. De app moet voelen als een rustige oefentafel met een vriendelijke coach naast je: korte uitleg, herkenbare situaties, "wat zou jij bieden?"-momenten, oefenen op het bestaande bridge-bord en daarna terugkijken waarom iets werkte.
-Primaire doelgroep:
+## Systeembron
-- Beginners die de app gebruiken om bridge stap voor stap te leren.
-- Testers die nog niet alle bridgebegrippen kennen.
-- Later: spelers die Vijfkaart Hoog / Start met Bridge 1 & 2 willen oefenen.
+`docs/vijfkaart-hoog-systeem.md` is het cursuscontract voor biedafspraken. Dit lessenplan mag afspraken eenvoudiger uitleggen dan de engine redeneert, maar mag geen ander systeem aanleren.
-Voor deze doelgroep geldt:
+Belangrijke cursusafspraken uit dat document:
-- Minder tekst tijdens normaal spelen is beter.
-- Lesmodus mag meer uitleg geven, maar per stap kort.
-- Feedback moet alleen stellig zijn wanneer de engine het betrouwbaar weet.
-- Herhaalbaarheid is belangrijk: elke les moet vaste oefenhanden kunnen starten.
+- `1SA` in lescopy is dezelfde bieding als `1NT` in code en oefenhanden.
+- 1SA gaat voor bij 15-17 HCP en een evenwichtige verdeling, ook als de hand een vijfkaart hoog in een 5-3-3-2-verdeling heeft.
+- 1 harten en 1 schoppen beloven minstens een vijfkaart, behalve dat een langere lage kleur soms eerst geopend wordt.
+- 1 ruiten belooft meestal minstens een vierkaart ruiten.
+- 1 klaveren kan een vangnetopening zijn en dus korter zijn dan beginners verwachten.
+- Na een gevonden Fit mag de cursus over Fitpunten spreken in plaats van alleen HCP.
+- Kunstmatige biedingen moeten altijd als betekenis worden uitgelegd, niet alleen als biedkaartje: Stayman, Jacoby-transfer, Vierde-kleur-forcing en Azenvragen zijn daar de eerste voorbeelden van.
-## Didactische principes
+## Glossary-afspraak
-1. Eerst tafelritme, dan regels.
- De speler moet eerst begrijpen wie aan de beurt is, wat een slag is, wanneer dummy verschijnt en hoe een hand eindigt.
+`scripts/learning/glossary.js` is de vaste bron voor jargon. Lescopy gebruikt daarom bij voorkeur exact dezelfde termen als de glossary, zodat de bestaande glossary-functionaliteit woorden kan herkennen en klikbaar kan maken wanneer lescopy via `BridgeGlossary.linkifyText` wordt weergegeven.
-2. Een les heeft een concreet mini-doel.
- Bijvoorbeeld: “herken 15-17 gebalanceerd” of “bekennen moet”. Geen brede hoofdstukken zonder actie.
+Belangrijke vaste termen in deze cursus:
-3. Theorie wordt gekoppeld aan een oefenhand.
- Elke les moet minstens een oefenhand hebben die het lesdoel zichtbaar maakt.
+- HCP
+- Fit
+- Manche
+- Stayman
+- Jacoby-transfer
+- Vuilnisbakkenbod
+- Vierde-kleur-forcing
+- Informatiedoublet
+- Zwakke twee
+- Regel van 20
+- Azenvragen
+- Slem
+- Troef
+- Leider
+- Dummy
+- Uitkomst
+- Stopper
+- Entree
+- Werkkleur
-4. Feedback is sober en betrouwbaar.
- Geen harde foutmelding wanneer de bied- of speelengine onzeker is. Dan liever: “De app zou hier X overwegen omdat...”
+Richtlijn voor implementatie:
-5. Herhaling zit in review.
- Na de hand moet de speler kunnen teruglezen: contract, bieding, slagen, score en het lespunt.
+- Gebruik glossary-termen letterlijk in titels, kernbegrippen, theorieblokken, quizfeedback en reviewtekst.
+- Vermijd nieuwe synoniemen als de glossary al een term heeft.
+- Gebruik "1SA" in lescopy voor sans-atout, maar map in engine/UI waar nodig naar de bestaande `1NT`-call.
+- Biedingen mogen in UI-copy als `1C`, `1D`, `1H`, `1S` of als "1 klaveren", "1 ruiten", "1 harten", "1 schoppen" worden getoond. Houd de uitleg begrijpelijker dan de notatie.
-6. De basisgame blijft rustig.
- Uitgebreide uitleg hoort in `lessons.html`, AI-suggesties, review, woordenlijst of developer mode.
+## Didactische lijn
-## Lesformat
+De cursus bouwt in kleine stappen op:
-Elke les krijgt bij voorkeur deze structuur:
+1. Eerst tafelritme: slagen, contract, troef, leider en Dummy.
+2. Dan handwaardering: HCP, verdeling, Fit en simpele biedkeuzes.
+3. Daarna Vijfkaart-Hoog-openingen volgens het cursuscontract: eerst kracht en speciale openingen, dan pas natuurlijke kleuren.
+4. Daarna antwoorden en herbiedingen.
+5. Pas daarna Manche, Sans-atout-conventies, speelplan, tegenspel en competitie.
+6. Sterkere afspraken komen pas in les 12 als kennismaking, niet als examen.
-```text
-1. Instapvraag / mini-uitleg
-2. Kernbegrip in maximaal 3 korte punten
-3. Miniquiz of herkenvraag
-4. Start oefenhand
-5. Reviewfeedback gekoppeld aan het lesdoel
-6. Optioneel: tweede oefenhand voor herhaling
-```
+Nieuwe begrippen worden pas gebruikt nadat ze in dezelfde of een eerdere les zijn uitgelegd. Als een latere les teruggrijpt op een begrip, mag de tekst kort herhalen: "We kennen Fit al: samen minstens acht kaarten in een kleur."
-Velden in `scripts/learning/lessons.js`:
+## Standaard lesformat
-- `id` - stabiele les-id.
-- `number` - routevolgorde.
-- `title` - korte titel.
-- `challenge` - wat de speler gaat proberen.
-- `focus` - labels voor routekaart.
-- `handIds` - oefenhanden die bij de les horen.
-- `chapters` - korte hoofdstukken met blocks, quiz en oefenlinks.
-- `reviewFeedback` - lesgerichte feedback na afloop.
-- `teachingPoints` - kernpunten die in de review terugkomen.
-- `startMode` - bijvoorbeeld `play` als de les direct bij het spelen start.
+Elke les bestaat uit:
-## Route-overzicht
+- titel;
+- leerdoelen;
+- kernbegrippen;
+- korte theorieblokken;
+- interactieve biedvoorbeelden;
+- interactieve speelvoorbeelden op het bestaande bridge-bord;
+- korte tafelsituaties vanuit een hoofdstuk, meestal 1 bod, 1 kaart, 1 slagmoment of 1 reviewcheck;
+- minimaal 6 oefenvragen;
+- minimaal 4 oefenhanden;
+- korte leuke eindopdracht.
-### Fase 1 - Tafelritme en kaartspel
+Oefenhanden hieronder gebruiken bestaande ids waar mogelijk. Ontbrekende situaties krijgen voorstel-ids. Die ids zijn nog geen implementatiebelofte; ze geven aan welke vaste handen later in `practice-hands/` nuttig zijn.
-Doel: de speler kan een hand volgen zonder biedtheorie te hoeven begrijpen.
+### Lesoverzicht in de app
-#### Les 1: Wat is bridge?
+Het overzicht op `lessons.html` blijft bewust compact. Per geselecteerde les toont het alleen:
-Huidige status: rijk uitgewerkt.
+- de titel;
+- de leerdoelen;
+- een enkele knop `Start les`.
-Leerdoelen:
+Noem daar niet elk hoofdstuk, lesonderdeel, oefenmoment of quizblok apart, en maak die onderdelen daar ook niet los openklikbaar. De speler kiest eerst een les; de losse lespagina zelf mag daarna met kaartnavigatie, oefeningen en tafellussen door de onderdelen lopen.
-- Vier spelers en partners herkennen.
-- Begrijpen wat een slag is.
-- Dummy herkennen na de uitkomst.
-- Bekennen toepassen.
+## Lesmodus met korte tafelsituaties
-Oefenhand:
+De lesmodus gebruikt de bestaande bridgetafel niet als losse volledige game, maar als korte oefenlus binnen een hoofdstuk. De speler start vanuit een concreet hoofdstuk, doet aan tafel het gevraagde kernmoment, ziet een klaar-kaart en keert met `Terug naar les` terug naar hetzelfde hoofdstuk.
-- `draw-trumps-001`
+Standaard flow:
-Acceptatie:
+1. Het hoofdstuk legt de situatie kort uit.
+2. De oefenlink opent `index.html` met `lesson`, `hand`, `chapter` en een `return`-URL naar de oorspronkelijke lesplek, bijvoorbeeld `lessons.html?lesson=...#chapter-id` of een losse `lesson-...html#stap`.
+3. De tafel toont het gewone bord, met het lespaneel op de plek van de speelgeschiedenis.
+4. De coachkaart/spotlight wijst het relevante onderdeel aan, bijvoorbeeld biedbox, legale kaarten, Dummy, slaggebied of review.
+5. De speler doet de afgesproken actie: meestal 1 bod of 1 kaart.
+6. Zodra de `tableTask` klaar is, verschijnt een afrondingskaart met `Terug naar les` en optioneel `Nog eens proberen`.
+7. Gewone gameplay blijft daarna geblokkeerd of gedempt totdat de speler een van die knoppen kiest.
-- Speler kan zeggen wie Zuid, Noord, Oost en West zijn.
-- Speler begrijpt dat dummy pas na de uitkomst open komt.
-- Speler ziet waarom niet elke kaart legaal speelbaar is.
+Gebruik deze korte tafelrondes om les en bord aan elkaar te knopen zonder de beginner uit het hoofdstuk te trekken. Een volledige hand uitspelen blijft mogelijk, maar is een bewuste uitzondering voor lessen die juist een hele speel- of reviewflow nodig hebben.
-Volgende verbetering:
+### Metadata-contract
-- Houd deze les als kwaliteitslat voor lessen 2-12.
+Elke hoofdstukstart naar de tafel hoort genoeg context mee te geven om terug te keren:
-#### Les 2: Punten en handtypen
+- `lesson`: les-id.
+- `hand`: oefenhand-id.
+- `chapter`: hoofdstuk-id en anker.
+- `return`: doel-URL naar hetzelfde leshoofdstuk of dezelfde stap.
-Huidige status: compact route-item.
+Hoofdstukken met een korte tafelronde gebruiken `tableTask`:
-Leerdoelen:
+- `type`: `bid`, `card`, `trick`, `review` of `hand`.
+- `completion`: bijvoorbeeld `southBid`, `northSouthCard`, `trickWinnerShown`, `reviewReached` of `handComplete`.
+- `doneTitle`, `doneBody`, `returnLabel` en optioneel `retryLabel`.
-- Honneurpunten tellen: A=4, H=3, V=2, B=1.
-- Gebalanceerde hand herkennen.
-- Begrijpen waarom 1SA een begrensde opening is.
+Hoofdstukken kunnen daarnaast `boardGuidance` gebruiken voor spotlight en flow:
-Oefenhand:
+- targets: `contract`, `bidControls`, `auctionLog`, `dummy`, `legalCards`, `trumpCards`, `trickArea`, `trickWinner`, `review` en `lessonPanel`;
+- gates: `none`, `allowHumanBid`, `allowHumanPlay` en `advanceTrick`.
-- `one-nt-opening-001`
+Blokkeer alleen kernmomenten. De tafel moet blijven voelen als bridge spelen, niet als een formulier invullen.
-Benodigde content:
+### Rustige lesinstellingen
-- Mini-uitleg honneurpunten.
-- Herkenvraag: “Hoeveel punten heeft Zuid?”
-- Herkenvraag: “Is deze hand gebalanceerd?”
-- Oefening waarin Zuid of AI 1SA opent.
+Tijdens lesmodus gelden tijdelijke instellingen:
-Reviewfeedback:
+- `showPlayHistory = false`;
+- `guidanceMode = false`;
+- `developerMode = false`.
-- Puntenaantal van Zuid.
-- Waarom 1SA logisch was of waarom een kleur beter was.
+De app bewaart deze tijdelijke waarden niet in `localStorage`; na verlaten van lesmodus keren opgeslagen voorkeuren terug. Lescopy en tests moeten daarom uitgaan van een rustig lespaneel, niet van developer-uitleg of AI-suggestiepanelen.
-Acceptatie:
+### Voorbeelden per huidige les
-- Speler kan een simpele 15-17 SA-hand herkennen.
+- Les 1 gebruikt `draw-trumps-001` als korte speelronde: de speler speelt een kaart in de bekennen-situatie en krijgt daarna `Terug naar les`.
+- Les 2 gebruikt `one-nt-opening-001` als korte biedronde: Zuid kiest het openingsbod, ziet `Bod gedaan` en keert terug naar het hoofdstuk over 1SA herkennen.
+- Les 2 gebruikt `opening-pass-001` op dezelfde manier voor openingskracht versus pas.
-### Fase 2 - Eerste biedbeslissingen
+Voor toekomstige lessen is de voorkeurskeuze steeds de kleinste tafelactie die het lesdoel zichtbaar maakt: bij Stayman 1 conventioneel bod, bij uitkomst 1 kaart, bij speelplan 1 planactie na Dummy reveal, bij score 1 reviewcheck.
-Doel: de speler begrijpt de eerste Vijfkaart Hoog-keuzes zonder competitief bieden.
+## Cursusoverzicht
-#### Les 3: Eerste openingen
+1. Wat is bridge? Slagen, contract, troef, Leider en Dummy.
+2. Kaarten waarderen: HCP, verdeling, Fit en eerste biedlogica.
+3. Openen in Vijfkaart-Hoog: 1SA, 1 klaveren, 1 ruiten, 1 harten, 1 schoppen.
+4. Antwoorden op een Opening: steun, nieuwe kleur, 1SA-Vuilnisbakkenbod.
+5. Herbiedingen van Openaar en responder: Minimum, Maximum, Invite.
+6. De hoge-kleurenfit vinden en naar Manche bieden.
+7. Sans-atout: 1SA-opening, Stayman en Jacoby-transfer.
+8. Speelplan als Leider: Troef trekken, Verliezers tellen, Aftroeven.
+9. Sans-atout spelen: Werkkleur, Stopper, Ophouden en Entree.
+10. Tegenspel: Uitkomst, signaleren op beginnersniveau, Vrijspelen.
+11. Competitief bieden: Volgbod, Informatiedoublet, Kwetsbaarheid.
+12. Sterkere afspraken: Zwakke twee, Vierde-kleur-forcing, Azenvragen en Slemintro.
-Leerdoelen:
+---
-- Openen vanaf voldoende kracht.
-- Vijfkaart hoog prioriteit geven.
-- Verschil tussen 1 harten, 1 schoppen, 1SA en lage-kleur opening globaal zien.
+## Les 1 - Wat is bridge?
-Oefenhand:
+Slagen, Contract, Troef, Leider en Dummy.
-- `one-heart-opening-001`
+### Leerdoelen
-Benodigde content:
+- Je herkent Noord, Oost, Zuid en West en weet wie partners zijn.
+- Je begrijpt dat een Slag uit vier kaarten bestaat.
+- Je weet dat het Contract vertelt hoeveel slagen de Leider moet maken.
+- Je ziet wat Troef doet en wat Sans-atout betekent.
+- Je weet wanneer Dummy open komt en wie de kaarten van Dummy speelt.
-- “Heb ik genoeg om te openen?”
-- “Heb ik een vijfkaart hoog?”
-- Miniquiz met 3 handen: pas, 1H/1S, 1SA.
+### Kernbegrippen
-Reviewfeedback:
+Slag, Contract, Troef, Sans-atout, Leider, Dummy, Uitkomst, Kleur bekennen.
-- Regel die de opening koos.
-- Korte uitleg van punten + lengte.
+### Korte theorieblokken
-Acceptatie:
+- De tafel als toneel: jij zit Zuid, partner Noord, de tegenstanders Oost/West. Jullie spelen niet tegen de app, maar samen met partner tegen het andere paar.
+- Een Slag is een rondje van vier kaarten. De hoogste kaart van de gevraagde kleur wint, behalve wanneer Troef wordt gespeeld.
+- Het Contract is de belofte van de bieding. Bij 4 schoppen moet de Leider tien slagen maken, omdat zes slagen de basis zijn en het niveau daar bovenop komt.
+- Dummy is de open partnerhand van de Leider. Dummy komt pas na de Uitkomst open, alsof het doek opengaat na de eerste scene.
-- Speler begrijpt waarom een vijfkaart hoog vaak eerst komt.
+### Interactieve biedvoorbeelden
-#### Les 4: Fit zoeken na 1 hoog
+- Herken het eindcontract: de app toont `1S - pas - 2S - pas - 4S - pas - pas - pas`. Vraag: "Wat is het Contract en welke kleur is Troef?"
+- Contract naar slagen: toon 1SA, 2 harten, 3SA en 4 schoppen. Laat de speler het aantal benodigde slagen kiezen.
+- Wie wordt Leider? Toon een korte bieding waarin Noord/Zuid het Contract winnen. Laat de speler aanwijzen wie de speelsoort als eerste bood.
-Leerdoelen:
+### Interactieve speelvoorbeelden op het bridge-bord
-- Partnersteun herkennen.
-- Driekaart steun na 1 hoog begrijpen.
-- Simpele verhoging versus manche-interesse globaal onderscheiden.
+- Start `draw-trumps-001` direct in de speelfase. Begeleid de speler langs Uitkomst, Dummy reveal, Kleur bekennen en Slagwinnaar.
+- Pauzeer na een complete Slag en vraag: "Welke kaart won deze Slag, en wie begint nu?"
+- Laat een simpele Troef-slag zien: iemand kan niet bekennen en mag troeven. Vraag of Troef de Slag wint.
-Oefenhand:
+### Oefenvragen
-- `response-raise-after-1s-001`
+1. Hoeveel kaarten speelt iedere speler in een Slag?
+2. Wanneer komt Dummy open?
+3. Wie speelt de kaarten van Dummy?
+4. Wat betekent Troef?
+5. Hoeveel slagen moet je maken in 3SA?
+6. Wat moet je doen als je de gevraagde kleur nog hebt?
-Benodigde content:
+### Oefenhanden
-- Wat is een fit?
-- Waarom 8+ kaarten samen prettig is.
-- Oefenvraag: “Partner opent 1S, jij hebt 3 schoppens. Is er steun?”
+- `draw-trumps-001` - bestaand: Dummy, Troef en Kleur bekennen.
+- `lesson-01-follow-suit-001` - voorstel: alleen legaliteit en bekennen oefenen.
+- `lesson-01-trump-wins-001` - voorstel: Troef wint wanneer de gevraagde kleur ontbreekt.
+- `lesson-01-contract-reading-001` - voorstel: contractdoel en Leider herkennen.
-Reviewfeedback:
+### Eindopdracht
-- Aantal troeven samen.
-- Waarom verhogen rustiger is dan een nieuwe kleur bieden.
+Geef na een bord een mini-commentaar alsof je sportverslaggever bent: "Het Contract was ..., Dummy kwam open na ..., en de Slag werd gewonnen door ..."
-Acceptatie:
+---
-- Speler kan steun na 1 hoog herkennen.
+## Les 2 - Kaarten waarderen
-#### Les 5: Zonder fit: nieuwe kleur of SA
+HCP, verdeling, Fit en eerste biedlogica.
-Leerdoelen:
+### Leerdoelen
-- Geen fit met partners hoge kleur herkennen.
-- Eigen biedbare kleur tonen.
-- SA overwegen bij gebalanceerde hand zonder fit.
+- Je telt HCP met Aas 4, Heer 3, Vrouw 2, Boer 1.
+- Je herkent een evenwichtige verdeling.
+- Je ziet waarom lengte in een kleur belangrijk is.
+- Je begrijpt Fit als samen minstens acht kaarten in een kleur.
+- Je maakt een eerste simpele keuze: pas, 1SA, of een kleur openen.
-Oefenhand:
+### Kernbegrippen
-- `response-new-suit-after-1h-001`
+HCP, Honneur, Evenwichtige verdeling, Fit, Fitpunten, Opening, Openingskracht, Regel van 20.
-Benodigde content:
+### Korte theorieblokken
-- Beslisboom: steun? eigen kleur? SA?
-- Uitleg dat een nieuwe kleur forcing/zoekend kan zijn, afhankelijk van systeemniveau.
-- Korte quiz met “wel/geen fit”.
+- HCP is de snelle krachtmeter. Aas is 4, Heer 3, Vrouw 2, Boer 1. Een hand met twee azen en een vrouw heeft dus 10 HCP.
+- Verdeling is het landschap van je hand. Een 5-3-3-2-hand voelt anders dan een 6-4-2-1-hand, zelfs met hetzelfde aantal HCP.
+- Fit betekent dat jij en partner samen minstens acht kaarten in een kleur hebben. Een Fit is fijn, omdat Troef dan vaker controle geeft.
+- Bij 15-17 HCP en een evenwichtige verdeling is 1SA in dit systeem de eerste kandidaat. Dat geldt ook als de evenwichtige hand een vijfkaart hoog heeft.
+- De Regel van 20 is een eerste blik op lichte openingen: HCP plus de lengtes van je twee langste kleuren. Dit is nog geen vrijbrief, maar een nuttige beginnerslamp.
-Reviewfeedback:
+### Interactieve biedvoorbeelden
-- Waarom nieuwe kleur tonen beter was dan partner direct steunen.
+- Tel en kies: Zuid heeft 15 HCP en een evenwichtige verdeling. Vraag: "Open je 1SA of een kleur?"
+- Vijfkaart maar toch SA: Zuid heeft 16 HCP, vijf schoppen en 5-3-3-2. Vraag waarom 1SA volgens deze app voorgaat.
+- Regel van 20: toon een hand met 11 HCP en twee lange kleuren. Laat de speler HCP + lengtes optellen.
+- Fit-detective: partner toont vijf harten, jij hebt drie harten. Vraag: "Hebben jullie samen een Fit?"
-Acceptatie:
+### Interactieve speelvoorbeelden op het bridge-bord
-- Speler begrijpt dat “geen fit” niet automatisch passen betekent.
+- Start `one-nt-opening-001` en laat de speler voor het bieden eerst HCP tellen.
+- Gebruik een bord met een duidelijke Fit en laat na Dummy reveal zien dat extra Troef controle geeft.
+- Laat in review zien hoeveel HCP Noord/Zuid samen ongeveer hadden en of dat paste bij het Contract.
-#### Les 6: Openingen in lage kleuren
+### Oefenvragen
-Leerdoelen:
+1. Hoeveel HCP telt Aas-Heer-Vrouw-Boer samen?
+2. Welke verdeling is evenwichtiger: 5-3-3-2 of 6-4-2-1?
+3. Wat is een Fit?
+4. Je hebt 12 HCP. Is dat meestal genoeg om te openen?
+5. Wat tel je op bij de Regel van 20?
+6. Waarom kan een lange kleur extra waarde hebben?
+7. Waarom kan 1SA soms voorgaan boven een vijfkaart hoog?
-- Lage-kleur opening als startpunt zien, niet als definitieve troefkeuze.
-- Na 1K/1R zoeken naar hoge kleuren.
-- Vierkaart hoog als antwoord herkennen.
+### Oefenhanden
-Oefenhand:
+- `one-nt-opening-001` - bestaand: 15-17 HCP en evenwichtige verdeling.
+- `opening-pass-001` - bestaand: te weinig Openingskracht.
+- `one-heart-opening-001` - bestaand: HCP plus vijfkaart hoog.
+- `lesson-02-rule-of-20-001` - voorstel: lichte Opening via Regel van 20.
-- `minor-opening-find-major-001`
+### Eindopdracht
-Benodigde content:
+Maak een "handpaspoort" van Zuid: HCP, verdeling, langste kleur, en je eerste biedidee in een zin.
-- “Lage kleur opent vaak de bieding, maar hoge kleuren blijven belangrijk.”
-- Herkenvraag: welke hoge kleur kan responder tonen?
+---
-Reviewfeedback:
+## Les 3 - Openen in Vijfkaart-Hoog
-- Waarom responder een hoge kleur toont in plaats van de lage kleur te steunen.
+1SA, 1 klaveren, 1 ruiten, 1 harten en 1 schoppen.
-Acceptatie:
+### Leerdoelen
-- Speler ziet dat een lage-kleur opening niet meteen betekent: we spelen klaveren/ruiten.
+- Je kent de basisvolgorde voor een Opening in Vijfkaart-Hoog.
+- Je opent 1SA met 15-17 HCP en een evenwichtige verdeling.
+- Je opent 1 harten of 1 schoppen met een vijfkaart hoog en openingskracht, behalve wanneer 1SA of een langere lage kleur volgens het systeem voorgaat.
+- Je gebruikt 1 ruiten als normale lage-kleuropening met ruitenlengte.
+- Je begrijpt dat 1 klaveren een vangnetopening kan zijn en dus niet altijd een lange klaverenkleur belooft.
-### Fase 3 - Contract, score en speelplan
+### Kernbegrippen
-Doel: de speler koppelt bieden aan contractdoel en leert planmatig spelen.
+Opening, Openaar, Openingskracht, Hoge kleuren, Lage kleuren, Sans-atout, Evenwichtige verdeling, Regel van 20.
-#### Les 7: Contractdoelen en score
+### Korte theorieblokken
-Leerdoelen:
+- Vijfkaart-Hoog geeft veel aandacht aan harten en schoppen. Hoge kleuren scoren prettig, want 4 harten en 4 schoppen zijn Manche.
+- 1SA is precieser dan veel beginners denken: 15-17 HCP en evenwichtige verdeling. In deze app gaat 1SA voor, ook met een 5-3-3-2-hand en een vijfkaart hoog.
+- 1 harten en 1 schoppen beloven minstens vijf kaarten. Open de langste kleur; met twee vijfkaarten open je de hoogste van de twee.
+- Een langere lage kleur kan voorgaan boven een vijfkaart hoog. Met vijf schoppen en zes klaveren open je in dit cursuscontract dus 1 klaveren.
+- 1 ruiten belooft meestal minstens vier ruiten. 1 klaveren kan kort zijn en is soms de vangnetopening als niets anders past.
+- Met lichte handen kijk je voorzichtig naar de Regel van 20. De app moet dit niet als universele waarheid verkopen, maar als Vijfkaart-Hoog-afspraak binnen dit profiel.
-- Contractniveau lezen.
-- Begrijpen hoeveel slagen nodig zijn.
-- Manchebonus herkennen, vooral kwetsbaar.
+### Interactieve biedvoorbeelden
-Oefenhand:
+- Sorteer de openingen: vier handen verschijnen. De speler kiest uit pas, 1SA, 1 harten, 1 schoppen, 1 klaveren of 1 ruiten.
+- "De vijfkaart hoog, tenzij...": toon 13 HCP met vijf schoppen en vier harten. Vraag: "Welke hoge kleur open je?"
+- "1SA gaat voor": toon 16 HCP met vijf schoppen en 5-3-3-2. Vraag waarom 1SA hier de systeemopening is.
+- "Langste kleur niet verstoppen": toon 12 HCP met vijf schoppen en zes klaveren. Vraag waarom 1 klaveren in beeld komt.
-- `game-bonus-vulnerable-001`
+### Interactieve speelvoorbeelden op het bridge-bord
-Benodigde content:
+- Start `one-heart-opening-001`; laat de speler eerst de opening kiezen en daarna zien welk Contract eruit kan groeien.
+- Start `one-spade-opening-001`; vergelijk het met de hartenhand: dezelfde logica, andere hoge kleur.
+- Start `minor-opening-find-major-001`; laat zien dat een lage-kleur Opening later alsnog een hoge kleur kan vinden.
-- “4H betekent 10 slagen.”
-- Waarom kwetsbaar gemaakte manche 620 kan scoren.
-- Miniquiz: hoeveel slagen nodig voor 2H, 3SA, 4H?
+### Oefenvragen
-Reviewfeedback:
+1. Welke kleuren heten Hoge kleuren?
+2. Wanneer past 1SA als Opening?
+3. Wat belooft 1 harten of 1 schoppen minimaal?
+4. Waarom kan 1 klaveren kort zijn?
+5. Wat doe je met 10 HCP en geen lange kleur?
+6. Waarom kan een langere lage kleur soms voorgaan boven een vijfkaart hoog?
+7. Wat check je eerst: genoeg kracht, speciale opening, of favoriete kleur? Leg je volgorde uit.
-- Contractdoel.
-- Gehaalde slagen.
-- Scoreopbouw.
+### Oefenhanden
-Acceptatie:
+- `one-nt-opening-001` - bestaand: 1SA-opening.
+- `one-heart-opening-001` - bestaand: 1 harten met vijfkaart, geen 1SA-prioriteit.
+- `one-spade-opening-001` - bestaand: 1 schoppen met vijfkaart, geen 1SA-prioriteit.
+- `minor-opening-find-major-001` - bestaand: lage-kleur Opening als startpunt.
-- Speler kan contractniveau naar benodigde slagen vertalen.
+### Eindopdracht
-#### Les 8: Spelen als leider: maak een plan
+Speel "openingsbingo": vind in vier oefenhanden minstens een keer pas, 1SA, een hoge-kleur Opening en een lage-kleur Opening.
-Leerdoelen:
+---
-- Winners/losers globaal herkennen.
-- Troeven trekken wanneer dat veilig en logisch is.
-- Speelplanpaneel gebruiken zonder te verdrinken in details.
+## Les 4 - Antwoorden op een Opening
-Oefenhand:
+Steun, nieuwe kleur en 1SA-Vuilnisbakkenbod.
-- `draw-trumps-001`
+### Leerdoelen
-Benodigde content:
+- Je herkent wanneer je partner kunt steunen.
+- Je weet dat steun in een hoge kleur vaak met drie kaarten al genoeg is.
+- Je toont een eigen nieuwe kleur wanneer steun ontbreekt en je hand daarvoor geschikt is.
+- Je gebruikt het 1SA-Vuilnisbakkenbod als rustige opvang voor handen zonder steun en zonder goed eenhoogtebod.
+- Je ziet dat passen na partners Opening niet de automatische veilige keuze is.
-- “Stop even na dummy: wat is troef, wat kan misgaan?”
-- Troeven trekken als basisidee.
-- Miniquiz: wanneer is troeven trekken vaak goed?
+### Kernbegrippen
-Reviewfeedback:
+Bijbod, Fit, Vuilnisbakkenbod, Hoge kleuren, Lage kleuren, Forcing, Minimum.
-- Welke planregel actief was.
-- Of kaartadvies het zichtbare plan volgde.
+### Korte theorieblokken
-Acceptatie:
+- Na partners Opening ben jij responder. Je eerste vraag is vriendelijk praktisch: "Kan ik partner steunen?"
+- Na 1 harten of 1 schoppen is driekaart steun vaak genoeg voor een Fit, omdat partner minstens vijf kaarten belooft.
+- Na 1 ruiten is steun meestal vanaf vier ruiten logisch. Na 1 klaveren vraagt steun vaker om vijf klaveren, omdat 1 klaveren kort kan zijn.
+- Een nieuwe kleur vertelt partner: "Hier heb ik ook iets." In beginnerslessen houden we dat kort en concreet.
+- Het 1SA-Vuilnisbakkenbod klinkt onaardig, maar is heel nuttig: 6-9 punten, geen steun, geen betere nieuwe kleur op eenhoogte. De vuilnisbak is hier gewoon netjes gesorteerd.
-- Speler gebruikt het speelplanpaneel als hulp, niet als ruis.
+### Interactieve biedvoorbeelden
-#### Les 9: Dummy en tempo
+- Partner opent 1 schoppen, jij hebt drie schoppen en 8 punten. Vraag: "2 schoppen of 1SA?"
+- Partner opent 1 harten, jij hebt vijf schoppen en geen hartensteun. Vraag: "Toon je schoppen?"
+- Partner opent 1 ruiten, jij hebt 7 punten, geen vierkaart hoog en geen ruitensteun. Vraag of 1SA-Vuilnisbakkenbod past.
+- Partner opent 1 klaveren, jij hebt vier klaveren en 7 punten. Vraag waarom 1SA soms eerlijker is dan klaveren steunen.
-Leerdoelen:
+### Interactieve speelvoorbeelden op het bridge-bord
-- Dummy als bron van slagen/entrees zien.
-- Een verliezer weggooien op een winnaar.
-- Timing begrijpen: kans eerst gebruiken voordat de tegenpartij aan slag komt.
+- Start `response-raise-after-1s-001`; laat de speler de driekaart steun vinden en later de Troef-fit zien.
+- Start `response-new-suit-after-1h-001`; laat zien dat het Contract soms anders eindigt dan partners eerste kleur.
+- Gebruik een voorstelhand voor 1SA-Vuilnisbakkenbod en laat in review zien waarom dit bod niet per se een prachtige SA-hand belooft.
-Oefenhand:
+### Oefenvragen
-- `discard-loser-on-winner-001`
+1. Partner opent 1 schoppen. Hoeveel schoppen heb je meestal nodig voor steun?
+2. Wat betekent Fit?
+3. Wanneer denk je aan een nieuwe kleur als antwoord?
+4. Wat is het 1SA-Vuilnisbakkenbod?
+5. Belooft 1SA-Vuilnisbakkenbod altijd goede Stoppers in alle kleuren?
+6. Waarom steun je 1 klaveren voorzichtiger dan 1 harten of 1 schoppen?
+7. Waarom is direct passen met 7 punten na partners Opening vaak te voorzichtig?
-Benodigde content:
+### Oefenhanden
-- Voorbeeld: verliezer in hand weg op hoge kaart in dummy.
-- Herkenvraag: welke verliezer kan verdwijnen?
+- `response-raise-after-1s-001` - bestaand: steun na 1 schoppen.
+- `response-new-suit-after-1h-001` - bestaand: nieuwe kleur na 1 harten.
+- `minor-opening-find-major-001` - bestaand: antwoord in hoge kleur na lage-kleur Opening.
+- `lesson-04-trash-1nt-response-001` - voorstel: 1SA-Vuilnisbakkenbod.
-Reviewfeedback:
+### Eindopdracht
-- Welke discard-kans er was.
-- Waarom timing belangrijk was.
+Speel "partnerpost": schrijf na je antwoordbod een ansichtkaart aan partner met precies een zin: "Ik bied ..., want ik heb ..."
-Acceptatie:
+---
-- Speler ziet dummy niet alleen als extra kaarten, maar als planonderdeel.
+## Les 5 - Herbiedingen van Openaar en responder
-### Fase 4 - Tegenspel en conventies
+Minimum, Maximum en Invite.
-Doel: speler leert basisverdediging en de eerste conventionele SA-vervolgen.
+### Leerdoelen
-#### Les 10: Basis tegenspel
+- Je herkent dat het eerste bod nog niet het hele verhaal vertelt.
+- Je begrijpt Minimum en Maximum als onder- en bovenkant van je beloofde range.
+- Je gebruikt een Invite om partner te vragen door te gaan met een Maximum.
+- Je ziet hoe Openaar en responder samen laag kunnen stoppen of naar Manche kunnen groeien.
+- Je houdt biedingen uitlegbaar: kracht, verdeling en Fit blijven de drie ankers.
-Leerdoelen:
+### Kernbegrippen
-- Uitkomen uit een honneurserie.
-- Tweede hand laag / derde hand hoog als basisidee herkennen.
-- Partner helpen met veilige, uitlegbare regels.
+Herbieding, Minimum, Maximum, Invite, Openaar, Bijbod, Fit, Manche.
-Oefenhand:
+### Korte theorieblokken
-- `lead-sequence-001`
+- De eerste biedronde is een begroeting, geen autobiografie. De Herbieding vertelt meer: minimum, extra lengte, steun of Sans-atout.
+- Met een Minimum rem je af. Met een Maximum mag je extra interesse tonen.
+- Een Invite is een beleefde vraag: "Partner, als jij aan de bovenkant zit, gaan we naar Manche; anders blijven we lager."
+- Openaar steunt partners nieuwe hoge kleur met vierkaart steun, herbiedt een eigen zeskaart, biedt Sans-atout met een evenwichtige hand of toont een tweede kleur met een echt tweekleurenspel.
+- Beginners hoeven nog niet elke route te kennen. Ze moeten vooral leren luisteren naar wat partner al beloofd heeft.
-Benodigde content:
+### Interactieve biedvoorbeelden
-- “Tegen kleurcontract: start liever uit een serie dan onder een losse honneur.”
-- Miniquiz: welke kaart uit HVB?
+- `1H - 1S - 2H`: vraag wat Openaar extra vertelt. Antwoord: meestal langere harten en geen sterke sprong.
+- `1S - 2S - 3S`: vraag of 3S een eindbod of Invite is.
+- Responder heeft 10-11 punten na partners 1SA-herbieding. Vraag: "pas, invite of Manche?"
-Reviewfeedback:
+### Interactieve speelvoorbeelden op het bridge-bord
-- Uitkomstregel die de app koos.
-- Waarom die uitkomst partner helpt.
+- Start een fit-hand waarin de bieding op 2 hoog stopt; laat zien dat laag stoppen soms volwassen bridge is.
+- Start een invite-hand en laat het eindcontract afhangen van partners Minimum of Maximum.
+- Speel een bord uit en laat in review de biedladder zien: Opening, antwoord, Herbieding, eindcontract.
-Acceptatie:
+### Oefenvragen
-- Speler begrijpt minstens een eenvoudige veilige uitkomstregel.
+1. Wat betekent Minimum in de bieding?
+2. Wat betekent Maximum?
+3. Wat probeert een Invite te bereiken?
+4. Partner nodigt uit en jij hebt een Maximum. Wat doe je meestal?
+5. Partner nodigt uit en jij hebt een Minimum. Waarom mag je passen?
+6. Wat kan Openaar met vierkaart steun voor responders hoge kleur doen?
+7. Waarom is een Herbieding vaak informatiever dan het eerste bod?
-#### Les 11: 1SA-vervolgen: Stayman en Jacoby
+### Oefenhanden
-Leerdoelen:
+- `response-raise-after-1s-001` - bestaand: simpele verhoging als basis.
+- `lesson-05-opener-minimum-rebid-001` - voorstel: Openaar remt af met Minimum.
+- `lesson-05-opener-maximum-accepts-001` - voorstel: Maximum accepteert Invite.
+- `lesson-05-responder-invite-001` - voorstel: responder nodigt uit na fit.
-- Stayman als vraag naar vierkaart hoog herkennen.
-- Jacoby-transfer als overdracht naar vijfkaart hoog herkennen.
-- Contractbetekenis scheiden van biedbetekenis: 2R kan harten betekenen.
+### Eindopdracht
-Oefenhand:
+Speel "thermostaat bieden": zet na elke bieding de meter op koud, lauw of warm. Koud is stoppen, warm is Manche zoeken.
-- `stayman-after-1nt-001`
+---
-Benodigde extra oefenhanden:
+## Les 6 - De hoge-kleurenfit vinden en naar Manche bieden
-- Een Jacoby-transfer naar harten.
-- Een Jacoby-transfer naar schoppen.
-- Een Stayman-hand met wel/geen fit.
+Fit in harten of schoppen, en wanneer 4 hoog dichtbij komt.
-Benodigde content:
+### Leerdoelen
-- Twee tegels: “vraag” vs “overdracht”.
-- Korte waarschuwing: het bod zegt niet altijd letterlijk de kleur.
-- Miniquiz: wat betekent 2K na 1SA? Wat betekent 2R na 1SA?
+- Je zoekt actief naar een Fit in harten of schoppen.
+- Je begrijpt waarom hoge-kleurmanches vaak aantrekkelijk zijn.
+- Je telt gezamenlijke kracht globaal met HCP en Fitpunten.
+- Je weet dat 4 harten en 4 schoppen meestal Manche zijn.
+- Je onderscheidt stoppen op 2 hoog, inviteren op 3 hoog en bieden naar 4 hoog.
-Reviewfeedback:
+### Kernbegrippen
-- Welke conventie gebruikt werd.
-- Wat het bod betekent, niet alleen welk contract geboden werd.
+Fit, Fitpunten, Manche, Hoge kleuren, Invite, Troef trekken, Contractpunten.
-Acceptatie:
+### Korte theorieblokken
-- Speler kan uitleggen dat sommige biedingen afspraken zijn.
+- Een hoge-kleurenfit is een beetje als goede wandelschoenen: de route wordt niet automatisch makkelijk, maar je hebt grip.
+- Met samen ongeveer 25 punten en een Fit kijk je vaak naar Manche in 4 harten of 4 schoppen.
+- Extra Troef en korte kleuren kunnen na een Fit meer waard worden. Daarom bestaan Fitpunten.
+- Na 1 harten of 1 schoppen is de beginnersladder: 2 hoog met 6-9 Fitpunten, 3 hoog als Invite met ongeveer 10-11 Fitpunten, 4 hoog met ongeveer 12+ Fitpunten.
+- Bied niet meteen de berg op. Soms is 2 hoog genoeg, soms nodig je uit, soms ga je naar 4 hoog.
-### Fase 5 - Integratie en zelfstandigheid
+### Interactieve biedvoorbeelden
-Doel: speler speelt hele spellen en gebruikt review om zelf te leren.
+- Partner opent 1 schoppen, jij hebt 6-9 punten en drie schoppen. Vraag: "2S, 3S of 4S?"
+- Partner opent 1 harten, jij hebt 12 punten en vier harten. Vraag waarom 4 harten in beeld komt.
+- Partner opent 1 schoppen, jij hebt steun maar ook een singleton. Laat de speler Fitpunten herwaarderen.
-#### Les 12: Reviewles: hele spellen
+### Interactieve speelvoorbeelden op het bridge-bord
-Leerdoelen:
+- Start `game-bonus-vulnerable-001`; laat zien hoe een Manchecontract een concreet slagendoel wordt.
+- Start `draw-trumps-001`; koppel de gevonden Fit aan Troef trekken.
+- Start een voorstelhand waarin te hoog bieden faalt; laat review rustig tonen dat 3 hoog genoeg was.
-- Hele hand spelen zonder stap-voor-stap instructie.
-- Review gebruiken om bieding, slagen en score terug te lezen.
-- Herhaalcode/feedback gebruiken wanneer iets onduidelijk is.
+### Oefenvragen
-Oefenhand:
+1. Waarom zijn harten en schoppen belangrijk in Vijfkaart-Hoog?
+2. Hoeveel kaarten samen heb je nodig voor een Fit?
+3. Welk contract is een Manche: 2 schoppen, 3 schoppen of 4 schoppen?
+4. Wat is het verschil tussen 2S en 3S na partners 1S-opening?
+5. Wanneer ga je met een Fit extra naar korte kleuren kijken?
+6. Hoeveel Fitpunten passen ongeveer bij direct 4 hoog na partners 1 hoog?
+7. Waarom is Troef trekken vaak nuttig in een hoge-kleurcontract?
-- `game-bonus-vulnerable-001`
+### Oefenhanden
-Benodigde content:
+- `response-raise-after-1s-001` - bestaand: Fit vinden.
+- `game-bonus-vulnerable-001` - bestaand: Manchebonus zichtbaar.
+- `draw-trumps-001` - bestaand: Troef trekken na Fit.
+- `lesson-06-major-fit-invite-001` - voorstel: invite naar 3 hoog.
-- Checklist voor na een bord:
- - Wat was het contract?
- - Wie was leider?
- - Hoeveel slagen waren nodig?
- - Hoeveel slagen zijn gemaakt?
- - Welke bieding of kaart was het meest leerzaam?
+### Eindopdracht
-Reviewfeedback:
+Geef je partnerschap een teamnaam nadat je een hoge-kleurenfit vindt. Bonuspunt als de naam iets zegt over Troef.
-- Geen lange nieuwe theorie; vooral terugwijzen naar reviewonderdelen.
+---
-Acceptatie:
+## Les 7 - Sans-atout
-- Speler kan na afloop zelfstandig de review lezen en een concrete vraag/feedback formuleren.
+1SA-opening, Stayman en Jacoby-transfer.
-## Implementatievolgorde
+### Leerdoelen
-Aanbevolen volgorde, klein en testbaar:
+- Je herkent de 1SA-opening: 15-17 HCP en evenwichtige verdeling.
+- Je gebruikt Stayman om een vierkaart hoge kleur te vragen.
+- Je gebruikt Jacoby-transfer met minstens een vijfkaart hoog.
+- Je scheidt het biedkaartje van de betekenis: 2 ruiten kan harten betekenen.
+- Je begrijpt waarom de sterke 1SA-hand vaak Leider blijft.
-1. Maak les 2 rijk zoals les 1: hoofdstukken, quiz, reviewfeedback.
-2. Daarna lessen 3-6 rijk maken, want die vormen de eerste biedbasis.
-3. Daarna lessen 7-9, omdat score en speelplan zichtbaar veel beginnerwaarde geven.
-4. Daarna les 10 en 11, met extra oefenhanden waar de huidige catalogus nog dun is.
-5. Sluit af met les 12 als integratieles en testerchecklist.
+### Kernbegrippen
-Niet alles tegelijk omzetten. Per les:
+Sans-atout, 1SA, Stayman, Jacoby-transfer, Conventioneel bod, Hoge kleuren, Fit, Leider.
-- update `scripts/learning/lessons.js`;
-- voeg ontbrekende oefenhand toe in `practice-hands/catalog/`;
-- voeg/werk unit tests bij;
-- draai `npm run test:unit`;
-- draai browser smoke als de lesson page of startflow verandert.
+### Korte theorieblokken
-## Benodigde nieuwe oefenhanden
+- 1SA is een nette visitekaart: "15-17 HCP, evenwichtig." Partner weet daardoor meteen veel.
+- Stayman is de vraag: "Partner, heb jij een vierkaart harten of schoppen?" In deze app gebruik je Stayman meestal vanaf ongeveer 8 HCP met een vierkaart hoog.
+- Jacoby-transfer is de overdracht: met vijf harten bied je 2 ruiten, zodat partner 2 harten biedt; met vijf schoppen bied je 2 harten, zodat partner 2 schoppen biedt. Het bod is dus Conventioneel.
+- Het slimme bij transfers: de sterke SA-hand wordt vaak Leider, en haar kaarten blijven verborgen voor de tegenpartij.
+- Na een Jacoby-transfer kan responder zwak passen, inviteren of met Manchekracht verder bieden. De eerste les hierover houdt het bij de herkenbare hoofdroutes.
-Waarschijnlijk nuttig:
+### Interactieve biedvoorbeelden
-- Les 2: extra 12-14 gebalanceerd, zodat speler ziet waarom niet 1SA openen.
-- Les 3: pas-hand met te weinig punten; 1S-opening naast 1H-opening.
-- Les 4: 3-kaart steun en 4-kaart steun na 1 hoog.
-- Les 5: geen fit maar eigen vier/vijfkaart.
-- Les 6: lage-kleur opening met responder vierkaart hoog.
-- Les 9: tweede discard/tempo-situatie.
-- Les 11: Jacoby-transfer naar harten en schoppen; Stayman met misfit.
-- Les 12: een neutraal volledig bord zonder speciale truc, voor eindtoets.
+- Na 1SA heb je 8 punten en 4-4 in de hoge kleuren. Vraag: "Gebruik je Stayman?"
+- Na 1SA heb je vijf harten. Vraag: "Welk Jacoby-transfer-bod gebruik je?"
+- Na 1SA heb je geen vierkaart hoog en genoeg voor Manche. Vraag: "3SA of eerst Stayman?"
-## Feedbackniveaus
+### Interactieve speelvoorbeelden op het bridge-bord
-### Tijdens normale game
+- Start `stayman-after-1nt-001`; laat de speler zien dat 2 klaveren een vraag is, geen klaverencontract.
+- Start `transfer-to-hearts-001`; laat de bieding eindigen in harten en wijs aan wie Leider wordt.
+- Start `transfer-to-spades-001`; vergelijk de overdracht naar schoppen met de hartenroute.
-- Minimaal.
-- Alleen turn, legaliteit, suggestie indien AI-suggesties aan staan.
+### Oefenvragen
-### Tijdens les
+1. Welke HCP-range hoort bij een gewone 1SA-opening?
+2. Wat vraagt Stayman?
+3. Wat belooft Jacoby-transfer meestal in de hoge kleur?
+4. Wat betekent 2 ruiten na partners 1SA in de transferafspraak?
+5. Wat betekent 2 harten na partners 1SA in de transferafspraak?
+6. Waarom is het vaak prettig dat de 1SA-openaar Leider wordt?
+7. Wat is een Conventioneel bod?
-- Korte missie bovenin.
-- Gerichte hints alleen voor het lesdoel.
-- Geen algemene bridgecollege-tekst naast de tafel.
+### Oefenhanden
-### Na afloop in review
+- `one-nt-opening-001` - bestaand: 1SA-opening.
+- `stayman-after-1nt-001` - bestaand: Stayman.
+- `transfer-to-hearts-001` - bestaand: Jacoby-transfer naar harten.
+- `transfer-to-spades-001` - bestaand: Jacoby-transfer naar schoppen.
-- Contract en score.
-- Lespunten.
-- Eventuele biedfeedback.
-- Kaartfeedback alleen als de regel betrouwbaar is.
+### Eindopdracht
-### Developer mode
+Speel "geheime boodschap": noteer bij elk conventioneel bod wat het kaartje zegt en wat het echt betekent.
-- Technische regel-id's, heuristieken en enginekeuzes.
-- Geschikt voor CP/Tungsten om gedrag te debuggen.
+---
-## Test- en acceptatiecriteria
+## Les 8 - Speelplan als Leider
-Per les:
+Troef trekken, Verliezers tellen en Aftroeven.
-- Les staat in `BridgeLessons.allLessons()` met unieke id.
-- `validateLessons(practiceHands)` blijft groen.
-- Alle `handIds` bestaan.
-- Hoofdstukken hebben titel, summary en geldige quizopties.
-- Oefenlink opent de juiste hand.
-- Review toont lespunten na afloop.
-- Geen harde feedbackclaim zonder enginebewijs.
+### Leerdoelen
-Voor de hele route:
+- Je stopt na Dummy reveal om een speelplan te maken.
+- Je telt Verliezers in een kleurcontract op beginnersniveau.
+- Je herkent wanneer Troef trekken logisch is.
+- Je ziet wanneer Aftroeven in Dummy juist eerst moet gebeuren.
+- Je gebruikt het speelplanpaneel als suggestie, niet als magisch orakel.
-- `npm run test:unit` groen.
-- Browser smoke groen als lesson navigation of startflow wijzigt.
-- Beginner kan les 1-3 doorlopen zonder uitleg buiten de app.
+### Kernbegrippen
-## Productnotities
+Leider, Dummy, Verliezers, Troef trekken, Aftroeven, Afgooien, Entree, Speelplan.
-- Les 1 is de kwaliteitslat: rustig, concreet, hoofdstukken + oefening.
-- Lessen 2-12 mogen eerst compact blijven, maar elke uitbreiding moet dezelfde structuur volgen.
-- De woordenlijst moet begrippen uit lessen ondersteunen, niet vervangen.
-- Lesfeedback moet later kunnen groeien naar foutgerichte feedback, maar nu vooral enginegedrag en lesdoel uitleggen.
-- Het lessenplan moet meegroeien met echte testerfeedback; concrete afhakers zijn belangrijker dan theoretische volledigheid.
+### Korte theorieblokken
-## Aanbevolen volgende stap
+- Na de Uitkomst komt Dummy open. Dat is het moment voor een korte pauze: "Wat is Troef? Welke Verliezers zie ik? Waar zitten mijn kansen?"
+- Troef trekken voorkomt vaak dat tegenstanders jouw hoge kaarten aftroeven.
+- Soms moet je juist eerst Aftroeven in Dummy, voordat je alle Troef weghaalt. Timing is het verschil tussen plan en paniek.
+- Een goede Leider hoeft niet alles te zien. Begin met een klein plan voor de eerstvolgende paar slagen.
-Werk les 2 volledig uit als sjabloon voor de rest:
+### Interactieve biedvoorbeelden
-- hoofdstukken voor honneurpunten, handverdeling en 1SA;
-- miniquiz over punten tellen;
-- reviewfeedback voor `one-nt-opening-001`;
-- eventueel een extra oefenhand met te weinig punten voor 1SA;
-- unit test dat les 2 hoofdstukken en quiz bevat.
+- Toon een bieding naar 4 schoppen. Vraag: "Wat is Troef en hoeveel slagen zijn nodig?"
+- Laat twee mogelijke Contracten zien: 3SA of 4 harten met Fit. Vraag welk contract waarschijnlijk makkelijker speelt.
+- Na een Fit-bieding vraagt de app: "Wat verwacht je straks als eerste te controleren: Troef of Sans-atout-stoppers?"
+
+### Interactieve speelvoorbeelden op het bridge-bord
+
+- Start `draw-trumps-001`; volg het zichtbare plan om eerst Troef te trekken.
+- Start `short-trump-ruff-001`; laat zien wanneer Dummy een korte kleur kan Aftroeven.
+- Start `discard-loser-on-winner-001`; laat een Verliezer verdwijnen op een winnaar.
+
+### Oefenvragen
+
+1. Wanneer maak je als Leider je eerste echte speelplan?
+2. Wat betekent Verliezers tellen?
+3. Waarom trek je vaak Troef?
+4. Wanneer kan Aftroeven in Dummy nuttig zijn?
+5. Wat is een Entree?
+6. Waarom moet je soms een planactie doen voordat je Troef trekt?
+
+### Oefenhanden
+
+- `draw-trumps-001` - bestaand: Troef trekken.
+- `short-trump-ruff-001` - bestaand: korte Troef in Dummy benutten.
+- `long-side-suit-ruff-001` - bestaand: lange zijkleur en Aftroeven.
+- `discard-loser-on-winner-001` - bestaand: Afgooien van een Verliezer.
+
+### Eindopdracht
+
+Noem je speelplan in maximaal vijf woorden, bijvoorbeeld "eerst Troef, dan klaveren". Als het langer wordt, is het nog geen plan maar een roman.
+
+---
+
+## Les 9 - Sans-atout spelen
+
+Werkkleur, Stopper, Ophouden en Entrees.
+
+### Leerdoelen
+
+- Je kiest een Werkkleur om extra slagen te ontwikkelen.
+- Je begrijpt Stopper als rem op een gevaarlijke tegenkleur.
+- Je gebruikt Ophouden om communicatie bij de tegenpartij te verstoren.
+- Je plant Entrees naar de hand met vrije kaarten.
+- Je ziet dat Sans-atout vaak draait om tempo: wie is eerder klaar?
+
+### Kernbegrippen
+
+Sans-atout, Werkkleur, Stopper, Ophouden, Entree, Vrijspelen, Lengteslagen, Gevaarlijke hand.
+
+### Korte theorieblokken
+
+- In Sans-atout is er geen Troef om je te redden. Je wint door hoge kaarten, Lengteslagen en goede timing.
+- Een Werkkleur is de kleur waar je extra slagen uit wilt persen. Meestal is dat een lange kleur met honneurs.
+- Een Stopper voorkomt dat de tegenpartij meteen een hele kleur opruimt.
+- Ophouden voelt tegennatuurlijk: je kunt nemen, maar doet het nog niet. Soms verbreek je zo de lijn tussen de tegenstanders.
+
+### Interactieve biedvoorbeelden
+
+- Na 1SA - 3SA vraagt de app: "Waarom kiezen we Sans-atout in plaats van een kleur?"
+- Toon een hand met geen hoge-kleurfit maar genoeg HCP. Vraag: "3SA of zoeken naar 4 harten?"
+- Laat een bieding naar 1SA zien en vraag welke informatie de 1SA-bieder al gaf: HCP en verdeling.
+
+### Interactieve speelvoorbeelden op het bridge-bord
+
+- Start `notrump-develop-long-suit-001`; laat de speler de Werkkleur kiezen.
+- Start `notrump-unblock-long-suit-001`; laat zien hoe een Blokkade kan ontstaan.
+- Gebruik een voorstelhand met Ophouden: de speler kiest of hij de eerste of tweede Slag neemt.
+
+### Oefenvragen
+
+1. Wat ontbreekt er in Sans-atout?
+2. Wat is een Werkkleur?
+3. Waarom zijn Entrees belangrijk?
+4. Wat doet een Stopper?
+5. Wanneer kan Ophouden slim zijn?
+6. Waarom kan een lange kleur later extra slagen opleveren?
+
+### Oefenhanden
+
+- `notrump-develop-long-suit-001` - bestaand: Werkkleur vrijspelen.
+- `notrump-unblock-long-suit-001` - bestaand: Blokkade en Entree.
+- `one-nt-opening-001` - bestaand: 1SA als contractbasis.
+- `lesson-09-hold-up-001` - voorstel: Ophouden met Stopper.
+
+### Eindopdracht
+
+Kies een Werkkleur en geef hem een bijnaam, zoals "de ruitenmachine". Daarna moet je uitleggen hoe die machine slagen gaat maken.
+
+---
+
+## Les 10 - Tegenspel
+
+Uitkomst, signaleren op beginnersniveau en Vrijspelen.
+
+### Leerdoelen
+
+- Je kiest een veilige Uitkomst op beginnersniveau.
+- Je herkent een Serie en waarom uitkomen uit een Serie partner helpt.
+- Je gebruikt simpele principes: tweede hand laag, derde hand hoog.
+- Je ziet dat tegenspelers ook kleuren kunnen Vrijspelen.
+- Je signaleert eenvoudig: aanmoedigen of liever niet, zonder ingewikkelde afspraken.
+
+### Kernbegrippen
+
+Tegenspelers, Uitkomst, Serie, Honneur, Tweede hand laag, Derde hand hoog, Vrijspelen, Signaleren.
+
+Let op: "tweede hand laag", "derde hand hoog" en "signaleren" staan nog niet allemaal als afzonderlijke glossary-termen. Gebruik ze wel consistent, maar overweeg later glossary-items toe te voegen zodra de lescopy wordt geimplementeerd.
+
+### Korte theorieblokken
+
+- Als tegenspeler ben je geen toeschouwer. Jij en partner proberen het Contract te verslaan.
+- Uitkomen uit een Serie, zoals Heer-Vrouw-Boer, is vaak vriendelijk voor partner: je vertelt iets en geeft minder snel een slag weg.
+- Tweede hand laag en derde hand hoog zijn beginnersregels, geen natuurwetten. Ze geven houvast wanneer je nog geen beter plan ziet.
+- Vrijspelen kan ook voor de verdediging: hoge kaarten eruit werken zodat lagere kaarten later winnen.
+
+### Interactieve biedvoorbeelden
+
+- Toon het eindcontract 4 harten door Zuid. Vraag: "Wie komt uit?"
+- Laat de bieding zien waarin de leider schoppen heeft geboden. Vraag welke kleur de verdediging misschien liever niet opent.
+- Toon een Contract in Sans-atout en vraag waarom een lange kleur als aanvalskleur aantrekkelijk kan zijn.
+
+### Interactieve speelvoorbeelden op het bridge-bord
+
+- Start `lead-sequence-001`; de speler kiest de Uitkomst uit een Serie.
+- Start `lead-avoid-unsupported-honor-001`; laat zien waarom onder een losse Honneur riskant kan zijn.
+- Start `defense-unblock-honor-001`; laat een eenvoudige partnerhulp zien.
+
+### Oefenvragen
+
+1. Wie komt uit tegen een Contract?
+2. Waarom is een Serie prettig om uit te komen?
+3. Wat betekent derde hand hoog?
+4. Wanneer is tweede hand laag vaak logisch?
+5. Kunnen Tegenspelers ook een kleur Vrijspelen?
+6. Waarom moet signaleren op beginnersniveau simpel blijven?
+
+### Oefenhanden
+
+- `lead-sequence-001` - bestaand: Uitkomst uit Serie.
+- `lead-singleton-001` - bestaand: korte kleur als Uitkomst-idee.
+- `lead-avoid-unsupported-honor-001` - bestaand: geen onnodig riskante Honneur.
+- `defense-unblock-honor-001` - bestaand: partner helpen door te deblokkeren.
+
+### Eindopdracht
+
+Speel "partnerfluisteraar": kies een kaart en zeg in een zin welke boodschap partner daar hopelijk uit haalt.
+
+---
+
+## Les 11 - Competitief bieden
+
+Volgbod, Informatiedoublet en Kwetsbaarheid.
+
+### Leerdoelen
+
+- Je begrijpt dat de tegenpartij soms opent voordat jij aan de beurt bent.
+- Je herkent een Volgbod als natuurlijk bod met eigen kleur.
+- Je herkent een Informatiedoublet als vraag aan partner, niet als straf.
+- Je ziet dat Kwetsbaarheid invloed heeft op risico.
+- Je leert dat competitief bieden klein en voorzichtig begint.
+
+### Kernbegrippen
+
+Volgbod, Informatiedoublet, Doublet, Biedplicht, Kwetsbaarheid, Openingskracht, Hoge kleuren, Lage kleuren.
+
+### Korte theorieblokken
+
+- Competitief bieden begint zodra beide paren meedoen. De tafel wordt drukker, dus de afspraken moeten juist simpeler en scherper zijn.
+- Een Volgbod zegt: "Ik heb een eigen kleur die ik wil noemen." In deze app is dat meestal een goede vijfkaart of langer: op eenniveau vanaf ongeveer 8 HCP, op tweeniveau meestal 10+ HCP.
+- Een 1SA-Volgbod is juist geen Vuilnisbakkenbod: het toont 15-17 HCP, evenwichtige verdeling en dekking in de kleur van de tegenpartij.
+- Een Informatiedoublet zegt meestal: "Partner, ik heb Openingskracht, kortheid in hun kleur en steun voor de ongeboden kleuren. Kies jij maar." Dat is iets anders dan straf.
+- Kwetsbaarheid is het waarschuwingslampje van de score. Down gaan kan duurder zijn, maar een gemaakte Manche levert ook meer op.
+
+### Interactieve biedvoorbeelden
+
+- Rechts opent 1 ruiten, Zuid heeft vijf schoppen en genoeg kracht. Vraag: "Is 1 schoppen als Volgbod logisch?"
+- Rechts opent 1 harten, Zuid heeft 16 HCP, evenwichtige verdeling en harten gedekt. Vraag waarom 1SA als Volgbod iets heel anders belooft dan het 1SA-Vuilnisbakkenbod.
+- Links opent 1 klaveren, partner doubleert, rechts past. Vraag waarom Zuid meestal moet bieden: Biedplicht.
+- Toon dezelfde hand kwetsbaar en niet-kwetsbaar. Vraag of de speler even enthousiast blijft over een dun Volgbod.
+
+### Interactieve speelvoorbeelden op het bridge-bord
+
+- Start `simple-overcall-001`; laat het Volgbod leiden tot een speelbaar kleurcontract.
+- Start `takeout-double-response-forced-001`; laat de speler na partners Informatiedoublet een kleur kiezen.
+- Start `takeout-double-response-notrump-001`; laat zien dat Sans-atout alleen past met de juiste hand en dekking.
+
+### Oefenvragen
+
+1. Wat is een Volgbod?
+2. Wat vraagt een Informatiedoublet aan partner?
+3. Waarom is een Informatiedoublet niet hetzelfde als een strafdoublet?
+4. Wat betekent Biedplicht na partners Informatiedoublet?
+5. Wat verandert Kwetsbaarheid aan je risico?
+6. Wat belooft 1SA als Volgbod?
+7. Waarom moet een competitief bod extra uitlegbaar zijn?
+
+### Oefenhanden
+
+- `simple-overcall-001` - bestaand: natuurlijk Volgbod.
+- `takeout-double-response-forced-001` - bestaand: verplichte kleur na Informatiedoublet.
+- `takeout-double-response-notrump-001` - bestaand: 1SA na Informatiedoublet.
+- `takeout-double-response-game-001` - bestaand: sterke reactie na Informatiedoublet.
+
+### Eindopdracht
+
+Doe de "drukke tafel"-challenge: na elke bieding zeg je hardop van welk paar het bod is en of het natuurlijk, vraagstellend of voorzichtig is.
+
+---
+
+## Les 12 - Sterkere afspraken
+
+Zwakke twee, Vierde-kleur-forcing, Azenvragen en Slemintro.
+
+### Leerdoelen
+
+- Je maakt kennis met Zwakke twee als preemptieve Opening.
+- Je begrijpt Vierde-kleur-forcing als kunstmatige vraag, niet als echte kleurbelofte.
+- Je ziet Azenvragen als stap richting Slem, niet als standaard trucje.
+- Je onderscheidt Manche, Kleinslem en Grootslem.
+- Je leert wanneer je sterker bieden rustig moet onderzoeken en wanneer je moet afzwaaien.
+
+### Kernbegrippen
+
+Zwakke twee, Preemptief bod, Vierde-kleur-forcing, Forcing, Azenvragen, Slem, Kleinslem, Grootslem, Manche, Conventioneel bod.
+
+### Korte theorieblokken
+
+- Zwakke twee is een opening van 2 ruiten, 2 harten of 2 schoppen met een goede zeskaart en beperkte kracht, meestal 6-10 HCP. Het doel is tegelijk beschrijven en de tegenpartij ruimte afpakken.
+- Vierde-kleur-forcing ontstaat nadat het partnerschap al drie echte kleuren heeft geboden. De vierde kleur is dan een kunstmatige vraag; in deze app is het Mancheforcing.
+- Azenvragen is in deze cursus klassiek 4SA met een afgesproken Troefkleur. Het gaat pas over Slem als er al genoeg gezamenlijke kracht en controle lijkt te zijn.
+- Slem is feestelijk, maar duur als je te optimistisch bent. Kleinslem vraagt twaalf slagen; Grootslem alle dertien.
+
+### Interactieve biedvoorbeelden
+
+- Openingskeuze: Zuid heeft zes schoppen en weinig HCP. Vraag of Zwakke twee in aanmerking komt.
+- Biedverloop met drie kleuren geboden: toon de vierde kleur en vraag waarom Vierde-kleur-forcing geen natuurlijke kleur hoeft te beloven.
+- Na sterke fit en veel HCP vraagt de speler met 4SA naar azen. Laat zien hoe Azenvragen naar 5-niveau kan leiden en waarom afzwaaien soms slim is.
+- Toon de klassieke antwoorden op 4SA: 5 klaveren is 0 of 4 azen, 5 ruiten is 1 aas, 5 harten is 2 azen en 5 schoppen is 3 azen.
+
+### Interactieve speelvoorbeelden op het bridge-bord
+
+- Start `small-slam-after-2nt-001`; laat zien hoeveel slagen Kleinslem vraagt.
+- Start `blackwood-after-2nt-transfer-001`; laat Azenvragen en afzwaaien zien in review.
+- Gebruik een voorstelhand voor Zwakke twee; laat zien hoe een lange Troef-kleur in het spelen werkt, maar ook kwetsbaar kan zijn.
+
+### Oefenvragen
+
+1. Wat belooft Zwakke twee in grote lijnen?
+2. Waarom heet een Preemptief bod storend?
+3. Wat vraagt Vierde-kleur-forcing?
+4. Wanneer is een bod Forcing?
+5. Hoeveel slagen vraagt Kleinslem?
+6. Wat vraagt 4SA in deze cursus wanneer er een Troefkleur is afgesproken?
+7. Waarom gebruik je Azenvragen niet zomaar zonder plan?
+
+### Oefenhanden
+
+- `small-slam-after-2nt-001` - bestaand: Kleinslem in Sans-atout.
+- `blackwood-after-2nt-transfer-001` - bestaand: Azenvragen en afzwaaien.
+- `lesson-12-weak-two-001` - voorstel: Zwakke twee openen.
+- `lesson-12-fourth-suit-forcing-001` - voorstel: Vierde-kleur-forcing als vraagbod.
+
+### Eindopdracht
+
+Speel de "slemthermometer": geef na de bieding een temperatuur van 1 tot 5. 1 is "stoppen met thee", 5 is "Slem onderzoeken".
+
+---
+
+## Implementatienotities
+
+Deze cursusstructuur is inhoudelijk. Implementatie kan per les klein gebeuren:
+
+1. Werk een les uit in `scripts/learning/lessons.js` met korte hoofdstukken en quiz.
+2. Voeg alleen ontbrekende oefenhanden toe die echt nodig zijn voor die les.
+3. Houd de kaart op `lessons.html` compact: titel, leerdoelen en een knop `Start les`.
+4. Koppel tafeloefeningen vanuit hoofdstukken met `chapter`, `return`, een compacte `tableTask` en alleen noodzakelijke `boardGuidance`.
+5. Kies voor korte tafelsituaties bij voorkeur 1 bod, 1 kaart, 1 slagmoment of 1 reviewcheck; gebruik `type: hand` alleen als de les echt een volledige hand vraagt.
+6. Houd normale gameplay rustig; uitgebreide tekst hoort in lesmodus, review, AI-suggesties of developer mode.
+7. Laat lesfeedback alleen hard corrigeren als de engine de regel betrouwbaar kan onderbouwen.
+8. Draai voor lesdata minimaal `npm run test:unit`; draai browser smoke wanneer lesson navigation, startflow, `tableTask` completion of bordbegeleiding wijzigt.
+
+## Acceptatiecriteria voor de hele cursus
+
+- Alle 12 lessen hebben een duidelijke opbouw en gebruiken geen jargon voordat het is uitgelegd.
+- Het lesoverzicht blijft compact: titel, leerdoelen en een enkele `Start les`-knop per geselecteerde les.
+- Alle kernbegrippen gebruiken de spelling uit `glossary.js`.
+- Alle biedafspraken volgen `docs/vijfkaart-hoog-systeem.md`.
+- Elke les bevat minimaal 6 oefenvragen en minimaal 4 oefenhanden of voorstelhanden.
+- Elke les bevat minstens een biedmoment en een speelvoorbeeld op het bestaande bridge-bord.
+- Elke hoofdstukstart naar het bridge-bord keert met `Terug naar les` terug naar hetzelfde hoofdstuk.
+- Korte tafelsituaties hebben een duidelijke `tableTask` completion en blokkeren of dempen de gewone flow na afronding.
+- Lesmodus overschrijft opgeslagen instellingen niet; developer mode, AI-suggesties en speelgeschiedenis blijven tijdelijk uit tijdens de tafelsituatie.
+- De toon blijft vriendelijk, helder en speels.
+- De cursus ondersteunt de huidige Vijfkaart-Hoog-afspraken zonder te doen alsof ze universeel zijn.
+- De route eindigt met lichtgevorderde herkenning, niet met de claim dat spelers alle conventies zelfstandig beheersen.
diff --git a/docs/vijfkaart-hoog-systeem.md b/docs/vijfkaart-hoog-systeem.md
new file mode 100644
index 0000000..19f750c
--- /dev/null
+++ b/docs/vijfkaart-hoog-systeem.md
@@ -0,0 +1,448 @@
+# Vijfkaart-Hoog Systeem Voor De Cursus
+
+Status: intern cursuscontract
+Scope: alle lessen, oefenhanden, AI-suggesties, reviewteksten en developer-uitleg die het huidige `fiveCardHigh` profiel gebruiken.
+
+Dit document legt vast welk Vijfkaart-Hoog biedsysteem deze cursus gebruikt. Het is geen volledige wedstrijdsysteemkaart. Het is de didactische norm voor de app: lessen mogen eenvoudiger uitleggen dan de engine redeneert, maar ze mogen niet een ander systeem aanleren.
+
+De huidige basis is het in de app geimplementeerde NBB/Barry's Vijfkaart Hoog-profiel, aangevuld met afspraken uit `Start met Bridge 1 & 2` waar die al in code en uitleg zijn verwerkt.
+
+Belangrijke codebronnen:
+
+- `rules/bidding/systems/five-card-high/`
+- `rules/bidding/systems/five-card-high/explanations-nl.js`
+- `scripts/learning/glossary.js`
+- `practice-hands/catalog/`
+- `tests/unit/vijfkaart-hoog-*.test.js`
+
+## Gebruik In De Cursus
+
+Alle lessen gebruiken hetzelfde conventieprofiel:
+
+- `1SA` in de app betekent hetzelfde als `1NT` in de code.
+- Nederlandse kleurafkortingen: `K` = klaveren, `R` = ruiten, `H` = harten, `S` = schoppen.
+- Symbolen in lescopy mogen: `1♣`, `1♦`, `1♥`, `1♠`, `1SA`.
+- HCP betekent honneurpunten: Aas 4, Heer 3, Vrouw 2, Boer 1.
+- Zodra een fit is gevonden, mag de app fitpunten gebruiken in plaats van alleen HCP.
+- Een biedkaartje kan een kunstmatige betekenis hebben. Voorbeeld: `2♦` na `1SA` betekent in dit systeem harten, niet letterlijk ruiten.
+
+Als code, uitleg en dit document uit elkaar lopen, moeten ze samen worden bijgewerkt. Nieuwe lessen mogen geen alternatieve afspraken introduceren zonder expliciet nieuw conventieprofiel.
+
+## Openingsbod: Basisvolgorde
+
+Voor beginners blijft de denkrichting:
+
+1. Heb ik genoeg om te openen?
+2. Heb ik een speciale SA-, sterke of preemptieve opening?
+3. Heb ik een vijfkaart hoog die ik natuurlijk moet openen?
+4. Anders open ik een lage kleur of pas ik.
+
+De engine hanteert deze praktische prioriteiten:
+
+| Opening | Betekenis in deze cursus | Beginnersuitleg |
+| --- | --- | --- |
+| Pas | Geen passende opening. | Te weinig kracht en geen geschikte lange kleur voor een zwakke opening. |
+| `1SA` | 15-17 HCP en een evenwichtige verdeling. | Begrensde opening: partner weet meteen je kracht en handtype. |
+| `1♥` / `1♠` | 12-19 HCP, of een lichte Regel-van-20-opening, met minstens een vijfkaart hoog. | Een opening in harten of schoppen belooft altijd minimaal vijf kaarten in die kleur. |
+| `1♦` | Meestal 12-19 HCP, minstens een vierkaart ruiten, geen betere `1SA` of hoge-kleuropening volgens de prioriteiten. | De normale lage-kleuroplossing met ruitenlengte. |
+| `1♣` | Meestal 12-19 HCP. Kan een vangnetopening zijn en dus vanaf een tweekaart klaveren voorkomen. | De laagste of veiligste lage-kleuropening als niets anders past. |
+| `2♣` | Sterke kunstmatige opening: ongeveer 20+ HCP of een zeer sterke speelslagenhand. | Later cursusmateriaal; beginners hoeven vooral te herkennen dat dit niet natuurlijk klaveren belooft. |
+| `2SA` | 20-22 HCP en een evenwichtige verdeling. | Sterke SA-opening. |
+| `2♦` / `2♥` / `2♠` | Zwakke twee: goede zeskaart en beperkte kracht, meestal 6-10 HCP. | Preemptief: je neemt biedruimte weg en beschrijft een lange kleur. |
+| `3♣` t/m `4♠` | Preemptief met een nog langere kleur en beperkte kracht. | Later cursusmateriaal. |
+
+### 1SA Gaat Voor
+
+`1SA` belooft 15-17 HCP en een evenwichtige verdeling: 4-3-3-3, 4-4-3-2 of 5-3-3-2.
+
+De app mag dus met een 5-3-3-2-hand en een vijfkaart hoog toch `1SA` openen als de hand precies 15-17 HCP heeft. In lessen moet dit rustig worden uitgelegd: `1♥` en `1♠` beloven wel een vijfkaart, maar niet elke vijfkaart hoog wordt automatisch met `1♥` of `1♠` geopend.
+
+Voorbeeld:
+
+- Zuid heeft 15 HCP, vijf schoppen, verder 3-3-2 en overal dekking.
+- Opening: `1SA`, omdat de hand evenwichtig is en in de 15-17-range valt.
+
+### Openen Met Een Vijfkaart Hoog
+
+`1♥` en `1♠` beloven minimaal een vijfkaart.
+
+Open de langste kleur. Met twee vijfkaarten open je de hoogste van de twee. Een langere lage kleur kan voorrang krijgen boven een vijfkaart hoog, omdat de app de langste kleur niet wil verbergen.
+
+Voorbeelden:
+
+- 13 HCP, vijf harten, geen `1SA`-verdeling: open `1♥`.
+- 12 HCP, vijf schoppen en vijf ruiten: open `1♠`, de hoogste van twee vijfkaarten.
+- 12 HCP, vijf schoppen en zes klaveren: open `1♣`, omdat de lage kleur langer is.
+
+### Lage-Kleuropeningen
+
+`1♣` en `1♦` zijn de openingen voor handen die niet als `1SA`, `1♥` of `1♠` worden behandeld.
+
+Voor beginners is de kern:
+
+- `1♦` belooft meestal minstens een vierkaart ruiten.
+- `1♣` kan kort zijn en is soms de vangnetopening.
+- Met meerdere vierkaarten open je de laagste geschikte kleur.
+- Met twee vijfkaarten open je de hoogste kleur.
+
+Voorbeelden:
+
+- 12 HCP, 4-4-3-2 met vier harten en vier ruiten, geen `1SA`: open `1♦`.
+- 13 HCP, 4-4-3-2 met vier harten, vier schoppen en slechts twee klaveren, geen `1SA`: open `1♣` als vangnet.
+- 14 HCP, vijf klaveren en vier ruiten: open `1♣`.
+
+## Openingskracht En Regel Van 20
+
+Met 12+ HCP open je meestal, tenzij een speciale reden anders zegt.
+
+Met 10-11 HCP mag je soms toch openen via de Regel van 20:
+
+```text
+HCP + lengte van je twee langste kleuren >= 20
+```
+
+De app vraagt daarbij ook dat de meeste punten in die lange kleuren zitten. Een lichte opening met losse punten in korte kleuren wordt dus niet automatisch geaccepteerd.
+
+Voorbeelden:
+
+- 11 HCP, vijf schoppen, vier harten, de honneurs vooral in schoppen en harten: `11 + 5 + 4 = 20`, dus open `1♠`.
+- 11 HCP, vijf schoppen, vier harten, maar de honneurs vooral in ruiten en klaveren: pas, want de lange kleuren zijn niet sterk genoeg.
+- 10 HCP, vijf ruiten en vijf klaveren met de punten in die kleuren: mag volgens de Regel van 20 een lage kleur openen.
+
+## Zwakke Twee En Preempts
+
+`2♦`, `2♥` en `2♠` zijn zwakke twee-openingen.
+
+Beginnersregel:
+
+- een goede zeskaart;
+- beperkte kracht, meestal 6-10 HCP;
+- geen gewone opening op eenniveau;
+- bedoeld om de tegenpartij biedruimte af te nemen.
+
+De engine kent extra randgevallen, zoals een "lelijke" 11-punter die de Regel van 20 niet haalt. Die nuance hoort niet in de eerste beginnersuitleg; in lescopy volstaat: "zeskaart, beperkte kracht".
+
+Voorbeelden:
+
+- 8 HCP met `KQJxxx` in ruiten en verder weinig: open `2♦`.
+- 9 HCP met goede zeskaart schoppen: open `2♠`.
+- 11 HCP met zes schoppen en genoeg verdeling om de Regel van 20 te halen: meestal geen zwakke twee, maar een lichte `1♠`-opening.
+
+Preemptieve openingen op drie- en vierniveau tonen een langere kleur en beperkte kracht. Die worden alleen uitgebreid behandeld wanneer een latere les daar expliciet over gaat.
+
+## Antwoorden Op Een KleurOpening
+
+Een antwoord op partners opening heet een bijbod. In deze cursus is het eerste bijbod eenvoudig en herkenbaar.
+
+Algemene basis:
+
+- Met minder dan 6 HCP pas je meestal.
+- Zoek een fit in partners hoge kleur vroeg.
+- Toon een eigen biedbare kleur als dat op het juiste niveau kan.
+- Als niets goed past, kan `1SA` het vuilnisbakkenbod zijn.
+
+### Na `1♥` Of `1♠`
+
+Omdat `1♥` en `1♠` een vijfkaart beloven, is driekaart steun al genoeg voor een achtkaartfit.
+
+| Antwoord | Betekenis |
+| --- | --- |
+| `2♥` / `2♠` | 6-9 fitpunten, minstens driekaart steun. |
+| `3♥` / `3♠` | Ongeveer 10-11 fitpunten, inviterend. |
+| `4♥` / `4♠` | Ongeveer 12+ fitpunten, manche. |
+| Nieuwe kleur op eenniveau | Minstens vierkaart, 6+ HCP, bijvoorbeeld `1♥ - 1♠`. |
+| Nieuwe kleur op tweeniveau | Minstens vierkaart en ongeveer 10+ HCP. |
+| `1SA` | Vuilnisbakkenbod: meestal 6-9 HCP, geen steun, geen geschikte eigen kleur op eenniveau. |
+| `2SA` | Ongeveer 10-11 HCP zonder betere fit of kleur. |
+| `3SA` | Manchekracht zonder betere fit of kleur. |
+
+Voorbeeld:
+
+- Partner opent `1♠`. Jij hebt 7 HCP en drie schoppen. Antwoord `2♠`, want er is samen minstens een 5-3 fit.
+- Partner opent `1♥`. Jij hebt 7 HCP, twee harten en vier schoppen. Antwoord `1♠`, want dat kan nog op eenniveau.
+- Partner opent `1♠`. Jij hebt 7 HCP, twee schoppen en geen kleur die je goed kunt bieden. Antwoord `1SA`.
+
+### Na `1♣` Of `1♦`
+
+Na een lage-kleuropening zoekt de cursus eerst een hoge-kleurfit als dat rustig kan.
+
+| Situatie | Afspraak |
+| --- | --- |
+| Na `1♣` | `1♦`, `1♥` of `1♠` kan vanaf een vierkaart en 6+ HCP. Met gelijke vierkaarten kiest de app laag genoeg om ruimte te houden. |
+| Na `1♦` | `1♥` of `1♠` kan vanaf een vierkaart en 6+ HCP. |
+| `1♦ - 2♣` | Vierkaart klaveren en ongeveer 10+ HCP. |
+| Steun voor `1♣` | Meestal vijfkaart steun, omdat `1♣` kort kan zijn. |
+| Steun voor `1♦` | Meestal vierkaart steun. |
+| `1SA` | Vuilnisbakkenbod: meestal 6-9 HCP, geen steun, geen geschikte hoge kleur op eenniveau. |
+| `2SA` / `3SA` | Inviterend of manche met een passende SA-hand en geen betere hoge-kleurfit. |
+
+Voorbeeld:
+
+- Partner opent `1♣`. Jij hebt 6 HCP en vier harten: bied `1♥`.
+- Partner opent `1♦`. Jij hebt 8 HCP, geen vierkaart hoog en vier ruiten: bied `2♦`.
+- Partner opent `1♣`. Jij hebt 7 HCP, geen vierkaart ruiten/harten/schoppen en maar vier klaveren: bied `1SA`, niet `2♣`.
+
+### Het Vuilnisbakkenbod `1SA`
+
+`1SA` als bijbod na partners kleuropening is geen belofte van een mooie sans-atouthand.
+
+Het betekent meestal:
+
+- 6-9 HCP;
+- geen steun voor partners kleur;
+- geen eigen kleur die je op eenniveau kunt bieden;
+- geen genoeg kracht voor een nieuwe kleur op tweeniveau.
+
+Voorbeeld:
+
+- `1♠ - 1SA`: antwoorder heeft vaak 6-9 HCP, minder dan drie schoppen en geen hand die sterk genoeg is om op tweeniveau een eigen kleur te bieden.
+
+## Openaars Herbieding En Tweede Bijbod
+
+Na het eerste antwoord beschrijft openaar zijn hand verder.
+
+Basisprioriteiten voor openaar:
+
+- Steun partners nieuwe hoge kleur met vierkaart steun.
+- Herbied een eigen zeskaart.
+- Bied SA met een evenwichtige hand.
+- Toon een tweede kleur met een echt tweekleurenspel.
+- Na partners verhoging: pas met minimum, invite met extra waarden, bied manche met genoeg gezamenlijke kracht.
+
+Basisprioriteiten voor antwoorder bij het tweede bijbod:
+
+- 6-9 HCP: houd het laag, geef preferentie of pas.
+- 10-11 HCP: inviteer, vaak met `2SA` of een verhoging.
+- 12+ HCP: zoek of bied de manche.
+- Als drie echte kleuren zijn geboden en er is nog geen duidelijk eindcontract: gebruik vierde-kleur-forcing.
+
+Voorbeeld:
+
+```text
+1♥ - 1♠
+2♦ - ?
+```
+
+Met 6-9 HCP geeft antwoorder vaak preferentie naar `2♥` als dat het minst misleidend is. Met 10-11 HCP kan `2SA` inviterend zijn. Met 12+ HCP en geen duidelijk contract kan `3♣` vierde-kleur-forcing zijn.
+
+## Stayman Na `1SA`
+
+`2♣` na `1SA` is Stayman.
+
+Betekenis:
+
+- vraagt openaar naar een vierkaart hoog;
+- zoekt een 4-4 fit in harten of schoppen;
+- wordt in de app gebruikt vanaf ongeveer 8 HCP met een vierkaart hoog.
+
+Antwoorden van openaar:
+
+| Antwoord | Betekenis |
+| --- | --- |
+| `2♦` | Geen vierkaart harten of schoppen. |
+| `2♥` | Vierkaart harten. |
+| `2♠` | Vierkaart schoppen. |
+
+Als openaar beide hoge vierkaarten heeft, toont de huidige regel eerst harten.
+
+Vervolg door antwoorder:
+
+- Met fit en 8-9 HCP: inviteer op drieniveau.
+- Met fit en 10+ HCP: bied de hoge-kleurmanche.
+- Zonder fit en 8-9 HCP: `2SA`.
+- Zonder fit en 10+ HCP: `3SA`.
+
+Voorbeeld:
+
+```text
+1SA - 2♣
+2♠ - 4♠
+```
+
+Antwoorder vroeg met Stayman, openaar toonde een vierkaart schoppen, en antwoorder koos met genoeg kracht de manche in de gevonden fit.
+
+## Jacoby-Transfers Na `1SA`
+
+Jacoby-transfer betekent dat antwoorder de kleur onder zijn echte hoge kleur biedt.
+
+| Bod na `1SA` | Betekenis |
+| --- | --- |
+| `2♦` | Vraagt openaar `2♥` te bieden. Antwoorder toont minstens een vijfkaart harten. |
+| `2♥` | Vraagt openaar `2♠` te bieden. Antwoorder toont minstens een vijfkaart schoppen. |
+
+Waarom:
+
+- de sterke `1SA`-hand wordt meestal leider;
+- antwoorder kan met zwakke handen toch zijn lange hoge kleur laten spelen;
+- met sterkere handen kan antwoorder daarna inviteren of de manche bieden.
+
+Voorbeelden:
+
+```text
+1SA - 2♦
+2♥ - pas
+```
+
+Antwoorder heeft harten en is zwak genoeg om in `2♥` te stoppen.
+
+```text
+1SA - 2♥
+2♠ - 3SA
+```
+
+Antwoorder heeft meestal precies vijf schoppen en manchekracht. Openaar mag met driekaart schoppen nog naar `4♠` corrigeren.
+
+```text
+1SA - 2♦
+2♥ - 3♥
+```
+
+Antwoorder heeft een zeskaart of langer in harten en inviterende kracht.
+
+Vervolgdetails zoals twee hoge kleuren na transfer worden wel door de engine herkend, maar horen niet bij de eerste uitleg. Ze kunnen in een latere les of developer-uitleg worden genoemd.
+
+## Na `2SA`
+
+Na een natuurlijke `2SA`-opening gebruikt de app dezelfde familie afspraken een niveau hoger:
+
+- `3♣` is Stayman.
+- `3♦` vraagt `3♥`.
+- `3♥` vraagt `3♠`.
+
+Omdat `2SA` al 20-22 HCP toont, is minder kracht bij antwoorder nodig om naar de manche te gaan. Dit is geen beginnerskern, maar lessen mogen het gebruiken zodra `1SA`-vervolgen bekend zijn.
+
+## Sterke `2♣`
+
+`2♣` is kunstmatig en sterk.
+
+Basis:
+
+- niet natuurlijk klaveren;
+- ongeveer 20+ HCP, of een hand met zeer veel speelslagen;
+- partner mag dit niet behandelen als een gewone lage-kleuropening.
+
+Antwoorden:
+
+- `2♦` is afwachtend, meestal 0-7 HCP.
+- Een positief kleurantwoord toont ongeveer 8+ HCP en een goede vijfkaart met minstens twee tophonneurs.
+- `2SA` kan een positief antwoord zonder geschikte kleur zijn.
+
+Na een `2SA`-herbieding door de `2♣`-openaar gelden Stayman en transfers alsof er een sterke SA-hand is getoond.
+
+Voor beginners wordt sterke `2♣` vooral als herkenpunt behandeld. De volledige vervolgstructuur wordt uitgesteld.
+
+## Vierde-Kleur-Forcing
+
+Vierde-kleur-forcing is mancheforcing in deze app.
+
+Het ontstaat wanneer het partnerschap al drie echte kleuren heeft geboden en antwoorder de vierde, nog niet geboden kleur biedt als kunstmatig vraagbod.
+
+Betekenis:
+
+- kunstmatig, niet per se lengte in de vierde kleur;
+- vraagt openaar zijn hand verder te beschrijven;
+- belooft genoeg kracht om minstens de manche te bereiken;
+- hoort in uitleg als conventioneel en alertbaar te worden behandeld.
+
+Voorbeeld:
+
+```text
+1♥ - 1♠
+2♦ - 3♣
+```
+
+`3♣` is hier vierde-kleur-forcing. Het zegt niet: "ik wil klaveren spelen". Het vraagt openaar om extra informatie.
+
+Antwoorden van openaar, in gewone taal:
+
+- toon driekaart steun voor antwoorders eerste kleur als die er is;
+- bied SA met een stop in de vierde kleur;
+- herbied je openingskleur met extra lengte;
+- herbied je tweede kleur als dat het beste beschikbare omschrijvende bod is.
+
+Daarna kiest antwoorder een manche.
+
+## `4SA` Azenvragen
+
+In deze cursus is `4SA` klassiek azenvragen wanneer er een troefkleur is afgesproken.
+
+Dit volgt de glossary-definitie:
+
+| Antwoord | Betekenis |
+| --- | --- |
+| `5♣` / `5K` | 0 of 4 azen. |
+| `5♦` / `5R` | 1 aas. |
+| `5♥` / `5H` | 2 azen. |
+| `5♠` / `5S` | 3 azen. |
+
+Voorbeeld:
+
+```text
+1SA - 2♥
+2♠ - 4SA
+5♥ - 5♠
+```
+
+Na de transfer is schoppen de afgesproken troefkleur. `4SA` vraagt azen. `5♥` toont twee azen. Als de vrager weet dat er samen twee azen ontbreken, zwaait hij af in `5♠`.
+
+Voor beginners:
+
+- Gebruik `4SA` alleen als azenvraag met een duidelijke troefkleur.
+- Leg nog geen Roman Keycard Blackwood, herenvragen, controlebiedingen of kwantitatieve `4SA` uit.
+
+## Competitief Bieden
+
+De beginnerscursus hoeft competitief bieden niet vroeg te behandelen. Als een oefenhand of AI-suggestie toch competitie bevat, gebruikt de app deze beperkte afspraken.
+
+Huidige basis:
+
+- Een eenvoudig volgbod toont een goede vijfkaart of langer.
+- Op eenniveau kan een volgbod vanaf ongeveer 8 HCP.
+- Op tweeniveau vraagt een volgbod meestal 10+ HCP.
+- Kwetsbaarheid kan de eisen verhogen.
+- `1SA` als volgbod toont 15-17 HCP, evenwichtige verdeling en dekking in de kleur van de tegenpartij.
+- Een informatiedoublet toont openingskracht, kortheid in de kleur van de tegenpartij en aansluiting in de ongeboden kleuren.
+- Na partners informatiedoublet moet je bieden als de rechtertegenstander past; `1SA` na zo'n doublet belooft 6-9 HCP, SA-verdeling, dekking en geen betere ongeboden vierkaart.
+- Tegen zwakke twee- en preemptieve openingen gebruikt de app eenvoudige volgboden, SA met dekking en informatiedoubletten.
+
+Voor beginners geldt: behandel competitie pas als het lesdoel dat vraagt. Normale openings- en antwoordlessen blijven ongestoord.
+
+## Bewust Uitgesteld
+
+Deze details worden bewust niet zwaar gemaakt in de beginnerscursus, ook als de engine er soms al een eenvoudige regel voor heeft:
+
+- volledige vervolgstructuur na sterke `2♣`;
+- volledige antwoorden op zwakke twee- en preemptieve openingen;
+- alle transfervervolgen met 5-4 of 5-5 in de hoge kleuren;
+- slem bieden buiten klassiek `4SA` azenvragen;
+- directe SA-slems op basis van gezamenlijke HCP;
+- competitief bieden na meerdere biedrondes;
+- kwetsbaarheidsafwegingen bij elk competitief bod;
+- betekenis van alerts buiten Stayman, transfers, vierde-kleur-forcing en `4SA` azenvragen.
+
+Deze afspraken worden voorlopig niet als cursusstof gebruikt en mogen niet stilzwijgend in beginnerslessen opduiken:
+
+- negative doubles;
+- supportdoubletten;
+- responsive doubles;
+- balancing;
+- cue-bids;
+- Michaels;
+- Unusual NT;
+- Lebensohl;
+- strafpas- en cue-bid-vervolgen na partners informatiedoublet;
+- Roman Keycard Blackwood en herenvragen;
+- conventieprofielen of persoonlijke biedafspraken.
+
+## Didactische Checklist Voor Nieuwe Lessen
+
+Gebruik deze checklist bij nieuwe biedlessen of oefenhanden:
+
+- Noem alleen de afspraak die de speler nu nodig heeft.
+- Houd normale gameplay compact; plaats extra uitleg in lesmodus, review, AI-suggesties of developer mode.
+- Scheid het biedkaartje van de betekenis bij kunstmatige biedingen.
+- Gebruik dezelfde puntengrenzen en betekenissen als dit document.
+- Toon voorbeelden met `1SA`, `1♥`, `1♠`, `1♣` en `1♦` voordat competitief bieden wordt geintroduceerd.
+- Voeg bij nieuwe biedregels ook uitleg en testfixtures toe.
+- Maak claims niet sterker dan de engine kan waarmaken.
+
diff --git a/index.html b/index.html
index cbf68e5..dd84fda 100644
--- a/index.html
+++ b/index.html
@@ -93,6 +93,36 @@