Grote regelingen (bv Besluit activiteiten leefomgeving met 2780 chunks)
produceerden een te grote single-PUT payload naar Qdrant, wat tot
writetimeout leidde. De volledige regeling kreeg dan 0 punten.
Oplossing: de punten in batches van QDRANT_UPLOAD_BATCH=200 uploaden.
Dit houdt elke PUT rond ~1MB en voorkomt timeouts zonder een
merkbare performance-impact (14 PUTs × 150ms ipv 1 × 3s).
Tijdens de full 40k run faalde alleen BWBR0041330 op deze manier.
Die is via een ad-hoc script al nageïndexeerd (2780 punten).
Kwaliteits- en betrouwbaarheidsverbeteringen zodat een full re-index
van alle Nederlandse regelingen veilig en observeerbaar draait.
- Deterministische Qdrant point_id via SHA-256 → idempotente re-runs
zonder duplicaten, resumable bij gedeeltelijke fout
- Chunking voor lange artikelen (>1800 chars) met 200-char overlap op
paragraaf-grenzen (hard-split fallback), voorkomt informatieverlies
voor lange wetsartikelen
- Retry + exponential backoff op Mistral en Meilisearch (4 pogingen,
respecteert Retry-After header, netwerkfouten apart van HTTP-fouten)
- Mistral batch_size 10 → 32 (~3x minder API-calls voor ~400k chunks)
- Meilisearch buffered uploads (5000 docs/batch over regelingen heen)
- Progress logging met rate/ETA in beide indexers (elke 100 regelingen)
+ --limit flag voor test-runs op subset
- Nieuwe CLI: `wetgit reindex --target all|meili|qdrant [--limit N]`
- WetGit-PRD-v1.0 in docx en pdf (Product Requirements Document)
- CLAUDE.md met stack/endpoints/deploy/troubleshooting voor
AI-assistenten die met de repo werken
- Meilisearch v1.12 + Qdrant v1.13 toegevoegd aan docker-compose
- Env vars voor MEILI_URL/QDRANT_URL/MISTRAL_API_KEY/FORGEJO_API_TOKEN
- Nieuwe web vhost (wetgit.nl) via wetgit-web.conf.j2
- Systemd service-paden:
- wetgit.service → uvicorn wetgit.api.app:app
- wetgit-celery.service → celery -A wetgit.tasks
- WETGIT_GIT_REPOS_DIR verplaatst naar {{ app_dir }}/app
(data leeft op /opt/wetgit/app/rijk/)
- Nieuwe vault-secrets: meili_master_key, qdrant_api_key, mistral_api_key
- Artikel nr zoekt nu alleen in <kop> of direct child (niet recursief)
- Voorkomt "Artikel Artikel" bij items met <li.nr>=Artikel
- Lijst-parser verzamelt content correct (geen leading whitespace)
- CSS: overflow-wrap en pre overflow voor lange regels
- Homepage: geen Grondwet-hoofdstukken meer, wel duidelijke links
naar volledige tekst, AI-samenvatting, en historie
- Disclaimer op homepage: neutraal (geen "AI-verrijkt")
- Disclaimer op /grondwet: "automatisch omgezet van XML naar Markdown"
- /grondwet: blauwe banner met link naar AI-samenvatting
- Statistieken herordend (regelingen eerst)
- alerts.py: detecteert wetswijzigingen, genereert AI change-summary,
stuurt e-mail via AgentMail API
- Mistral Large voor begrijpelijke samenvatting van de diff
- AgentMail endpoint: /inboxes/{addr}/messages/send
- Test: gesimuleerde Grondwet art. 13 wijziging succesvol verstuurd
Sluit #38
Server-rendered HTML via Jinja2 templates in FastAPI:
- Homepage: zoekbalk, statistieken, inhoudsopgave Grondwet
- /grondwet: volledige tekst als leesbare pagina
- /grondwet/samenvatting: AI-samenvatting (B1-niveau)
- /zoeken: keyword (Meilisearch) + semantisch (Qdrant)
- /historie: tijdlijn van versies
- /diff: visuele vergelijking tussen twee versies
- Sober, responsive CSS (overheidsstijl)
- Disclaimer op elke pagina
flake.nix: jinja2 + markdown packages toegevoegd
Sluit #39
- summarize.py: genereert B1-niveau samenvattingen per hoofdstuk
- Mistral Large API met lage temperature (0.3)
- Disclaimer en metadata in elk summary.md bestand
- Getest: Grondwet — 8 hoofdstukken samengevat in begrijpelijk Nederlands
Sluit #36