Full project audit: refactor + test-suite optimalisatie #86

Closed
opened 2026-04-20 22:40:59 +02:00 by Ghost · 7 comments
Ghost commented 2026-04-20 22:40:59 +02:00 (Migrated from codeberg.org)

Na v2.18.0 (#80 afgerond) willen we een complete audit van het project — niet beperkt tot de daily/bonus-paden.

Scope

1. Code-audit

Doel: inventariseren waar corners zijn afgesneden, waar duplicatie zit, en wat vereenvoudigd kan worden. Concreet aandachtsgebied:

  • index.html (~2500 regels): is er een natuurlijke splitsing mogelijk (bv. map-rendering / polygon-layer-management / quiz-state / screens / feedback)? Zo ja: in modules of gewoon duidelijkere secties.
  • polygon-layer register (polygonTypes): de drie types (province/water/country) delen veel code maar ook duidelijke verschillen. Kan het generieker zonder dat de afterHighlight-strategie onleesbaar wordt?
  • buildPolygonLayer: _isMixed-tak dupliceert logica uit de normale tak — mogelijk samen te trekken.
  • set-configuratie in cities.js: SETS-object heeft velden die niet elke set gebruikt (bounds, fitOnStart, clickCorrectKm, phases, daily, bonus, mastery). Is hier een schonere vorm mogelijk (varianten, typed config)?
  • progress / sessionStorage: saveProgress() + dailyAnswerKey() + backwards-compat voor oude bonus-string[]-shape — kan dat nu weg?
  • setHighlight vs setHighlightPolygon: twee aparte codepaths voor marker vs polygon. Logisch, maar de call-sites zijn verspreid.
  • dev-menu + URL-deep-link + screen-navigatie: drie systemen die naast elkaar leven; kan één authoritative router.

2. Test-suite-audit

Doel: snellere, minder flaky tests zonder functionele dekking te verliezen.

  • CI-tijd (nu ~3min voor Playwright, 236 tests): fixture die 1× de app laadt en dan state reset i.p.v. 236× page.goto('/')?
  • waitForTimeout(N) occurrences inventariseren en migreren naar waitForFunction / waitForSelector — flaky-bron.
  • Overlap tussen test.js (unit, 1362) en tests/*.spec.js: wat wordt op beide niveaus getest? Unit is goedkoper — verplaats alles waar geen DOM nodig is.
  • playwright.config.js: retries, workers, parallelisatie — optimaal voor GitHub runners?
  • Flaky-tests-lijst: welke tests hebben de laatste 20 CI-runs >1 failure? Ofwel fixen ofwel quarantine.
  • Per-set specs (tests/set54.spec.js t/m tests/set89.spec.js): veel kopie-plak. Kan parametrized i.p.v. één file per set.

3. Werkwijze (belangrijk)

Dit is eerst analyse, dan prioriteren, dan pas wijzigen. Niet in één sessie alles tegelijk:

  1. Een inventaris-rapport (gecommit als AUDIT.md of in het issue zelf) met:
    • per onderwerp een lijst van observaties met file + regelnummer
    • geschatte impact (LOC-reductie / CI-tijd-winst / onderhoudsverlies-voorkomen)
    • voorgestelde volgorde (quick wins eerst)
  2. De gebruiker kiest wat wel/niet gebeurt.
  3. Per gekozen refactor: aparte PR-loop (branch → dev-preview → staging), met harde eis "alle tests groen vóór en na, geen functionaliteitswijziging".

4. Niet in scope

  • Nieuwe features of sets.
  • Visuele redesign.
  • Breaking changes in URL-deep-links of sessionStorage-keys (zonder migration-plan).

Niet urgent. Pak op als er een rustig moment is tussen feature-releases door.

Na v2.18.0 (#80 afgerond) willen we een **complete audit** van het project — niet beperkt tot de daily/bonus-paden. ## Scope ### 1. Code-audit Doel: inventariseren waar corners zijn afgesneden, waar duplicatie zit, en wat vereenvoudigd kan worden. Concreet aandachtsgebied: - **`index.html`** (~2500 regels): is er een natuurlijke splitsing mogelijk (bv. map-rendering / polygon-layer-management / quiz-state / screens / feedback)? Zo ja: in modules of gewoon duidelijkere secties. - **polygon-layer register** (`polygonTypes`): de drie types (province/water/country) delen veel code maar ook duidelijke verschillen. Kan het generieker zonder dat de afterHighlight-strategie onleesbaar wordt? - **`buildPolygonLayer`**: `_isMixed`-tak dupliceert logica uit de normale tak — mogelijk samen te trekken. - **set-configuratie** in `cities.js`: SETS-object heeft velden die niet elke set gebruikt (`bounds`, `fitOnStart`, `clickCorrectKm`, `phases`, `daily`, `bonus`, `mastery`). Is hier een schonere vorm mogelijk (varianten, typed config)? - **progress / sessionStorage**: `saveProgress()` + `dailyAnswerKey()` + backwards-compat voor oude bonus-string[]-shape — kan dat nu weg? - **`setHighlight` vs `setHighlightPolygon`**: twee aparte codepaths voor marker vs polygon. Logisch, maar de call-sites zijn verspreid. - **dev-menu + URL-deep-link + screen-navigatie**: drie systemen die naast elkaar leven; kan één authoritative router. ### 2. Test-suite-audit Doel: snellere, minder flaky tests zonder functionele dekking te verliezen. - **CI-tijd** (nu ~3min voor Playwright, 236 tests): fixture die 1× de app laadt en dan state reset i.p.v. 236× `page.goto('/')`? - **`waitForTimeout(N)`** occurrences inventariseren en migreren naar `waitForFunction` / `waitForSelector` — flaky-bron. - **Overlap tussen `test.js` (unit, 1362) en `tests/*.spec.js`**: wat wordt op beide niveaus getest? Unit is goedkoper — verplaats alles waar geen DOM nodig is. - **`playwright.config.js`**: retries, workers, parallelisatie — optimaal voor GitHub runners? - **Flaky-tests-lijst**: welke tests hebben de laatste 20 CI-runs >1 failure? Ofwel fixen ofwel quarantine. - **Per-set specs** (`tests/set54.spec.js` t/m `tests/set89.spec.js`): veel kopie-plak. Kan parametrized i.p.v. één file per set. ### 3. Werkwijze (belangrijk) Dit is **eerst analyse, dan prioriteren, dan pas wijzigen**. Niet in één sessie alles tegelijk: 1. Een **inventaris-rapport** (gecommit als `AUDIT.md` of in het issue zelf) met: - per onderwerp een lijst van observaties met file + regelnummer - geschatte impact (LOC-reductie / CI-tijd-winst / onderhoudsverlies-voorkomen) - voorgestelde volgorde (quick wins eerst) 2. De gebruiker kiest wat wel/niet gebeurt. 3. Per gekozen refactor: aparte PR-loop (branch → dev-preview → staging), met harde eis **"alle tests groen vóór en na, geen functionaliteitswijziging"**. ### 4. Niet in scope - Nieuwe features of sets. - Visuele redesign. - Breaking changes in URL-deep-links of sessionStorage-keys (zonder migration-plan). --- Niet urgent. Pak op als er een rustig moment is tussen feature-releases door.
Ghost commented 2026-04-20 22:48:09 +02:00 (Migrated from codeberg.org)

Audit-bevindingen — analyse (geen executie)

Twee parallelle audits gedraaid: één op index.html + cities.js, één op tests/ + test.js. Bevindingen hieronder gestructureerd per impact/risico. Dit is de analyse-stap — prioritering en executie komen daarna, in aparte issues/branches.

Metrics (baseline)

  • index.html: ~2500 regels monoliet (HTML+CSS+JS)
  • cities.js: 1 groot SETS-object + data-arrays
  • Unit tests (test.js): 1362 regels
  • Playwright: 28 spec-files, 228 tests, ~3014 LOC, ~3 min CI
  • page.goto('/'): 145× — fixture-kandidaat
  • waitForTimeout(N): (4 arbitrair, 1 gemotiveerd)

A. Quick wins (laag risico, directe winst)

# Waar Wat Winst
A1 playwright.config.js retries: 2 (CI), fullyParallel: true, timeout: 60_000 Minder CI-ruis; geen functionaliteitsverlies
A2 tests/*.spec.js Page-fixture: 1× page.goto('/') + sessionStorage.clear() i.p.v. 145× goto ~10–20s CI per run
A3 tests/daily-bonus.spec.js regel 20–53, 124–130 Pure-logic tests (dailyPool, dateSeed) verhuizen naar test.js ~3–5s CI, sneller TDD-loop
A4 waitForTimeout in tests/set89.spec.js + anderen Migreer naar waitForFunction/waitForSelector Minder flaky
A5 index.html ~2392 startQuiz rAF-fallback Nu met if (_set.daily||_set.bonus) return — documenteer waarom Future-proofing

Geschat: ~30–45s CI-besparing, flakiness omlaag, geen gedragswijziging.


B. Medium-term refactors (beperkt risico, goede ROI)

# Waar Wat Risico
B1 tests/set54.spec.jsset89.spec.js (21 files) Parametriseren — één spec met for (const setId of GEOBAS_7_8_SETS) Laag; per-set specificiteit in fixtures
B2 index.html distractorPool() ~1479 Signatuur distractorPool(city) i.p.v. globaal currentCity lezen Laag; call-sites wel aanpassen
B3 index.html buildPolygonLayer _isMixed-tak Samentrekken met normale tak; shared filter-predicate Midden; visuele regressietest nodig
B4 index.html screen-navigatie Drie routers (dev-menu + deep-link + screen-nav) → één authoritative router Midden; sessionStorage-migratie overwegen
B5 index.html progress/sessionStorage dailyAnswerKey() + backwards-compat voor oude string[]-shape kan weg na 2–3 releases Laag; check of gebruikers nog oude state hebben

Geschat: ~950 LOC weg (parametrisatie), 20–30s extra CI-winst, duidelijker routing-verhaal.


C. Long-term (groot, aparte feature-branch)

# Waar Wat Opmerking
C1 index.html splitsing Module-boundary kandidaten: quiz-state.js, map-render.js, polygon-layer.js, screens.js, feedback.js Breekt monoliet-voordelen (één-file-deploy); ES modules of bundle-stap nodig
C2 polygonTypes register Generieker maken zonder afterHighlight-strategie onleesbaar te maken Onderzoeken of het überhaupt loont — drie types met echte verschillen
C3 SETS-schema in cities.js Typed config met varianten (normaal/daily/bonus/mastery) i.p.v. losse optional velden Waarschijnlijk alleen de moeite bij >2× meer variatie

D. Pijnpunten uit audits die we NIET aanraden

  • setHighlight vs setHighlightPolygon samenvoegen: twee paths lijken duplicaat maar reflecteren echt verschillende Leaflet-APIs (marker vs geoJson-layer). Samenvoegen = abstractie over dunne lijn.
  • Unit↔Playwright overlap volledig wegsnijden: sommige dubbele dekking is bewust (logic + integratie). Alleen pure-logic-tests in Playwright (A3) verhuizen.

Aanbevolen volgorde voor executie (later)

  1. Sprint 1 (quick wins, 1–2u): A1 + A2 + A3 + A4
  2. Sprint 2 (test-parametrisatie, halve dag): B1
  3. Sprint 3 (distractorPool signatuur, 1–2u): B2
  4. Sprint 4 (buildPolygonLayer dedup, halve dag): B3
  5. Sprint 5 (router-consolidatie, 1 dag): B4 + B5
  6. Later / misschien nooit: C1–C3 afhankelijk van hoe groot index.html verder groeit

Elke sprint = eigen branch, eigen dev-preview, eigen release. Harde eis: alle tests groen vóór + na, geen gedragswijziging.


Status: analyse klaar. Wacht op jouw keuze welke sprints we oppakken en wanneer.

## Audit-bevindingen — analyse (geen executie) Twee parallelle audits gedraaid: één op `index.html` + `cities.js`, één op `tests/` + `test.js`. Bevindingen hieronder gestructureerd per impact/risico. Dit is de **analyse-stap** — prioritering en executie komen daarna, in aparte issues/branches. ### Metrics (baseline) - `index.html`: ~2500 regels monoliet (HTML+CSS+JS) - `cities.js`: 1 groot SETS-object + data-arrays - Unit tests (`test.js`): 1362 regels - Playwright: 28 spec-files, 228 tests, ~3014 LOC, ~3 min CI - `page.goto('/')`: **145×** — fixture-kandidaat - `waitForTimeout(N)`: **5×** (4 arbitrair, 1 gemotiveerd) --- ### A. Quick wins (laag risico, directe winst) | # | Waar | Wat | Winst | |---|------|-----|-------| | A1 | `playwright.config.js` | `retries: 2` (CI), `fullyParallel: true`, `timeout: 60_000` | Minder CI-ruis; geen functionaliteitsverlies | | A2 | `tests/*.spec.js` | Page-fixture: 1× `page.goto('/')` + `sessionStorage.clear()` i.p.v. 145× goto | ~10–20s CI per run | | A3 | `tests/daily-bonus.spec.js` regel 20–53, 124–130 | Pure-logic tests (`dailyPool`, `dateSeed`) verhuizen naar `test.js` | ~3–5s CI, sneller TDD-loop | | A4 | 4× `waitForTimeout` in `tests/set89.spec.js` + anderen | Migreer naar `waitForFunction`/`waitForSelector` | Minder flaky | | A5 | `index.html` ~2392 `startQuiz` rAF-fallback | Nu met `if (_set.daily\|\|_set.bonus) return` — documenteer waarom | Future-proofing | **Geschat**: ~30–45s CI-besparing, flakiness omlaag, geen gedragswijziging. --- ### B. Medium-term refactors (beperkt risico, goede ROI) | # | Waar | Wat | Risico | |---|------|-----|--------| | B1 | `tests/set54.spec.js`–`set89.spec.js` (21 files) | Parametriseren — één spec met `for (const setId of GEOBAS_7_8_SETS)` | Laag; per-set specificiteit in fixtures | | B2 | `index.html` `distractorPool()` ~1479 | Signatuur `distractorPool(city)` i.p.v. globaal `currentCity` lezen | Laag; call-sites wel aanpassen | | B3 | `index.html` `buildPolygonLayer` `_isMixed`-tak | Samentrekken met normale tak; shared filter-predicate | Midden; visuele regressietest nodig | | B4 | `index.html` screen-navigatie | Drie routers (dev-menu + deep-link + screen-nav) → één authoritative router | Midden; sessionStorage-migratie overwegen | | B5 | `index.html` progress/sessionStorage | `dailyAnswerKey()` + backwards-compat voor oude string[]-shape **kan weg** na 2–3 releases | Laag; check of gebruikers nog oude state hebben | **Geschat**: ~950 LOC weg (parametrisatie), 20–30s extra CI-winst, duidelijker routing-verhaal. --- ### C. Long-term (groot, aparte feature-branch) | # | Waar | Wat | Opmerking | |---|------|-----|-----------| | C1 | `index.html` splitsing | Module-boundary kandidaten: `quiz-state.js`, `map-render.js`, `polygon-layer.js`, `screens.js`, `feedback.js` | Breekt monoliet-voordelen (één-file-deploy); ES modules of bundle-stap nodig | | C2 | `polygonTypes` register | Generieker maken zonder afterHighlight-strategie onleesbaar te maken | Onderzoeken of het überhaupt loont — drie types met echte verschillen | | C3 | SETS-schema in `cities.js` | Typed config met varianten (normaal/daily/bonus/mastery) i.p.v. losse optional velden | Waarschijnlijk alleen de moeite bij >2× meer variatie | --- ### D. Pijnpunten uit audits die we NIET aanraden - **`setHighlight` vs `setHighlightPolygon`** samenvoegen: twee paths lijken duplicaat maar reflecteren echt verschillende Leaflet-APIs (marker vs geoJson-layer). Samenvoegen = abstractie over dunne lijn. - **Unit↔Playwright overlap volledig wegsnijden**: sommige dubbele dekking is bewust (logic + integratie). Alleen pure-logic-tests in Playwright (A3) verhuizen. --- ### Aanbevolen volgorde voor executie (later) 1. **Sprint 1** (quick wins, 1–2u): A1 + A2 + A3 + A4 2. **Sprint 2** (test-parametrisatie, halve dag): B1 3. **Sprint 3** (distractorPool signatuur, 1–2u): B2 4. **Sprint 4** (buildPolygonLayer dedup, halve dag): B3 5. **Sprint 5** (router-consolidatie, 1 dag): B4 + B5 6. **Later / misschien nooit**: C1–C3 afhankelijk van hoe groot `index.html` verder groeit Elke sprint = eigen branch, eigen dev-preview, eigen release. Harde eis: alle tests groen vóór + na, geen gedragswijziging. --- **Status**: analyse klaar. Wacht op jouw keuze welke sprints we oppakken en wanneer.
Ghost commented 2026-04-21 13:16:47 +02:00 (Migrated from codeberg.org)

Sprint 1 — klaar op `feature/sprint-1-test-opt`

  • A1 playwright.config.js: retries:2 (CI), fullyParallel:true, timeout:60_000
  • A3 2 Playwright-tests verwijderd die test.js al dekt (dailyPool determinisme + per-group seed)
  • A4 waitForTimeout(300/400)waitForFunction op score-teller state
  • A2 ⏭️ uitgesteld — page-fixture reset-helper kost + state-bleed risico > ROI nu fullyParallel aan staat. Heroverwegen in latere sprint na suite-metingen.

Resultaat lokaal: 226 Playwright ✓, 1362 unit ✓. Suite 1:31 → 1:24 (-7s). CI-winst waarschijnlijk groter dankzij retries (eliminates infra-flake re-runs).

Wachtend op CF preview-akkoord vóór merge naar dev.

## Sprint 1 — klaar op \`feature/sprint-1-test-opt\` - **A1** ✅ `playwright.config.js`: `retries:2` (CI), `fullyParallel:true`, `timeout:60_000` - **A3** ✅ 2 Playwright-tests verwijderd die `test.js` al dekt (`dailyPool` determinisme + per-group seed) - **A4** ✅ 4× `waitForTimeout(300/400)` → `waitForFunction` op score-teller state - **A2** ⏭️ uitgesteld — page-fixture reset-helper kost + state-bleed risico > ROI nu fullyParallel aan staat. Heroverwegen in latere sprint na suite-metingen. **Resultaat lokaal**: 226 Playwright ✓, 1362 unit ✓. Suite 1:31 → 1:24 (-7s). CI-winst waarschijnlijk groter dankzij retries (eliminates infra-flake re-runs). Wachtend op CF preview-akkoord vóór merge naar `dev`.
Ghost commented 2026-04-21 13:23:35 +02:00 (Migrated from codeberg.org)

Sprint 1 gereleased in v2.18.1 — pipeline groen, productie gedeployed. Sprints 2–5 nog te doen.

Sprint 1 gereleased in [v2.18.1](https://github.com/jelmerkk/topoquiz/releases/tag/v2.18.1) — pipeline groen, productie gedeployed. Sprints 2–5 nog te doen.
Ghost commented 2026-04-21 14:04:38 +02:00 (Migrated from codeberg.org)

Sprint 2 B1 — parametrize per-set smoke tests — shipped in v2.18.2.

  • New tests/set-smoke.spec.js with single parametrized fixture (SETS array, 19 entries)
  • Generates 88 smoke tests via loop (menu-visible, mode-select, phase-1 vraag/label/qtot/zoom)
  • 19 individual set*.spec.js files trimmed to only set-specific regression/data-integrity tests
  • LOC reduction across set-specs: 2255 → 1709 (-546, -24%)
  • Full Playwright suite: 235 passed in 1:38
  • Pipeline groen, gedeployed naar productie

Issue blijft open voor resterende sprints (A2 coverage-floor, B2 daily-bonus split, etc.).

Sprint 2 B1 — parametrize per-set smoke tests — shipped in v2.18.2. - New `tests/set-smoke.spec.js` with single parametrized fixture (SETS array, 19 entries) - Generates 88 smoke tests via loop (menu-visible, mode-select, phase-1 vraag/label/qtot/zoom) - 19 individual `set*.spec.js` files trimmed to only set-specific regression/data-integrity tests - LOC reduction across set-specs: 2255 → 1709 (-546, -24%) - Full Playwright suite: 235 passed in 1:38 - Pipeline groen, gedeployed naar productie Issue blijft open voor resterende sprints (A2 coverage-floor, B2 daily-bonus split, etc.).
Ghost commented 2026-04-21 14:32:06 +02:00 (Migrated from codeberg.org)

Sprint 2 B2 — unit-test migration — shipped in v2.18.3.

  • 11 set-specs deleted (pure data-validation): set76/77/78/79/81/82/83/84/85/86/87/88
  • 4 set-specs trimmed to UI-only: set58/74/75/89
  • 72 new unit tests in test.js (1365 → 1437)
  • 58 Playwright tests removed (235 → 166)
  • LOC: -1180 / +245
  • Pipeline groen, gedeployed naar productie
Sprint 2 B2 — unit-test migration — shipped in v2.18.3. - 11 set-specs deleted (pure data-validation): set76/77/78/79/81/82/83/84/85/86/87/88 - 4 set-specs trimmed to UI-only: set58/74/75/89 - 72 new unit tests in `test.js` (1365 → 1437) - 58 Playwright tests removed (235 → 166) - LOC: -1180 / +245 - Pipeline groen, gedeployed naar productie
Ghost commented 2026-04-21 15:13:48 +02:00 (Migrated from codeberg.org)

Audit-rapport: AUDIT.md (commit 759d679)

Volledige code-audit gedaan — scope 1 uit deze issue. Uitkomst: 7 topics geïnventariseerd met file+regelnummer, LOC-impact-schatting, en 9-item prioriteitenlijst. Samenvatting:

Refactor-backlog — in prioriteit-volgorde

  • #90 — buildPolygonLayer _isMixed-tak dedup (E1 / I2 / R1)
  • #91 — string[]-backwards-compat slopen in initLevel (E1 / I1 / R1, 1 week oud)
  • #98 — CSS-extractie per scherm (shared met #89, E2 / I2 / R1)
  • #95 — pure-logica extract naar src/game/ + build-stap (E3 / I3 / R2)
  • #92polygonTypes generiek + setHighlight unified (E2 / I3 / R2)
  • #93 — SETS → discriminated union + factories (E3 / I3 / R3)
  • #94 — centrale router + scherm-switcher (E4 / I4 / R4)
  • #96 — scherm-rendering naar eigen modules (E3 / I2 / R2)

E = effort (dagen), I = impact, R = risico, telkens 1-4.

Scope 2 (test-suite-audit): al voltooid

  • v2.18.2 (#86 sprint 2 B1) — parametrize per-set smoke tests: 12 bestanden → 1, 119 LOC.
  • v2.18.3 (#86 sprint 2 B2) — unit vs Playwright overlap: 72 nieuwe unit-tests, ~50× sneller.
  • CI-tijd + waitForTimeout-migratie + fixture-sharing: nog open, niet los uitgesplitst (volgt in sprint 3).
## Audit-rapport: AUDIT.md (commit 759d679) Volledige code-audit gedaan — scope 1 uit deze issue. Uitkomst: 7 topics geïnventariseerd met file+regelnummer, LOC-impact-schatting, en 9-item prioriteitenlijst. Samenvatting: ### Refactor-backlog — in prioriteit-volgorde - [ ] #90 — buildPolygonLayer `_isMixed`-tak dedup *(E1 / I2 / R1)* - [ ] #91 — string[]-backwards-compat slopen in initLevel *(E1 / I1 / R1, 1 week oud)* - [ ] #98 — CSS-extractie per scherm *(shared met #89, E2 / I2 / R1)* - [ ] #95 — pure-logica extract naar `src/game/` + build-stap *(E3 / I3 / R2)* - [ ] #92 — `polygonTypes` generiek + `setHighlight` unified *(E2 / I3 / R2)* - [ ] #93 — SETS → discriminated union + factories *(E3 / I3 / R3)* - [ ] #94 — centrale router + scherm-switcher *(E4 / I4 / R4)* - [ ] #96 — scherm-rendering naar eigen modules *(E3 / I2 / R2)* *E = effort (dagen), I = impact, R = risico, telkens 1-4.* ### Scope 2 (test-suite-audit): al voltooid - v2.18.2 (#86 sprint 2 B1) — parametrize per-set smoke tests: 12 bestanden → 1, 119 LOC. - v2.18.3 (#86 sprint 2 B2) — unit vs Playwright overlap: 72 nieuwe unit-tests, ~50× sneller. - CI-tijd + waitForTimeout-migratie + fixture-sharing: nog open, niet los uitgesplitst (volgt in sprint 3).
Ghost commented 2026-04-22 13:14:07 +02:00 (Migrated from codeberg.org)

Audit-scope afgerond. Child-issues die hieruit voortkwamen zijn allemaal afgerond of doorgezet:\n\n- #90 buildPolygonLayer dedup → done\n- #91 string[]-backwards-compat opruim → done\n- #93 SETS discriminated union refactor → done (v2.25.3)\n- #94 centrale router → done\n- #95 pure-logica extract → done (v2.25.x)\n- #96 scherm-rendering extract → done 4/6, rest in #120\n- #116/#119 polygon-zoom defensive cap → done\n\nVolgende audit-ronde krijgt een nieuw issue — dit ticket is als scope-parent klaar.

Audit-scope afgerond. Child-issues die hieruit voortkwamen zijn allemaal afgerond of doorgezet:\n\n- #90 buildPolygonLayer dedup → done\n- #91 string[]-backwards-compat opruim → done\n- #93 SETS discriminated union refactor → done (v2.25.3)\n- #94 centrale router → done\n- #95 pure-logica extract → done (v2.25.x)\n- #96 scherm-rendering extract → done 4/6, rest in #120\n- #116/#119 polygon-zoom defensive cap → done\n\nVolgende audit-ronde krijgt een nieuw issue — dit ticket is als scope-parent klaar.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jelmer/topoquiz#86
No description provided.