- Strip de filter terug tot: (1) sterk signaal in de titel -> door; (2) score van unieke semantische groepen >= 3 met titel-signaal -> door; (3) anders weg. Geen whitelist (82 termen), geen blacklist, geen span-merge, geen dienststoring-titelanker meer; woordgrenzen/lookbehinds weren de bekende botsingen structureel (schoolbus/VW-bus/stationsstraat/stationair/ treinstraat/treinweg). - Lijsten 49 families + 82 whitelist + 2 blacklist = 133 -> 16 sterk + 14 ambigu = 30 groepen; filterzone 524 -> ~292 regels; match-methodes 4 -> 2. - Vijf historische uitzonderings-families geschrapt (busongeluk, sein, breng, hermes, inchecken, kaartje, rails, staking, e.d.) — die woorden leveren nu 0 signalen op en de bekende false positives blijven geweerd. - Completheids-audit ving de Maaslijn/Nedersaksenlijn/Kamperlijn/waterbus- regressie op (hersteld); resterende zero-hit-kandidaten geen wijziging. - validate_filter.py: invarianten 1-3 + 113 regressie-cases (90 onveranderd groen + 23 nieuw); prompt-matrix 27/27. - Gedragswijziging op 45 productiedagen: uitsluitend false positives extra geweerd (buitenlandse veerboot-rampen, Zwitsers busongeluk, delftopzondag tram+halte, Cox/RET, tram-blokkade); 0 recalls verloren. - README/AGENTS.md/vault bijgewerkt.
33 lines
No EOL
2.5 KiB
Markdown
33 lines
No EOL
2.5 KiB
Markdown
# buzz-rss — verplichte regels bij elke wijziging (wordt automatisch bij sessiestart geladen)
|
|
|
|
Maubot-plugin `nl.eddydevink.rss` (RSS → Matrix + WhatsApp), met een OV-nieuwsfilter dat **vast in code** staat.
|
|
|
|
## Verplicht vóór elke filterwijziging
|
|
1. Lees het **volledige classificatiebeleid** in `buzzrss/bot.py` — het blok BOVEN `MATCH_FILTER_STRONG`
|
|
(drie regels: sterk signaal in de titel → door; score van unieke semantische groepen ≥ 3 mét
|
|
titel-signaal → door; anders wegfilteren. Sterk=2, ambigu=1/2, drempel 3; geen whitelist/blacklist —
|
|
woordgrenzen weren de botsingen. Werkwijze voor nieuwe woorden = beleidsblok).
|
|
2. Draai **`python3 validate_filter.py`** (repo-root) — de filter-invarianten en regressie-cases MOETEN groen
|
|
zijn voordat filtercode gecommit/gedeployed wordt.
|
|
3. **Compleetheids-audit (verplicht, besluit 2026-09-12):** check bij elke filterwijziging óók of de
|
|
woordenlijsten compleet zijn — draai de OV-gap-scan over de afgewezen artikelen van de
|
|
OV-specialist-feeds (SpoorPro.nl / Treinreiziger.nl / Mobiliteit, query op `entry` in schema `mbp_rss`),
|
|
klasseer nieuwe kandidaten volgens het beleid (minimaal één extra LLM; enige stem TWIJFEL/NIET-OV => zwak)
|
|
en vul de families desgevraagd aan. Exacte procedure = stap (e) in het beleidsblok in `buzzrss/bot.py`.
|
|
4. Precision-first (gebruikersbesluit 2026-09-10): **liever een OV-bericht te veel gefilterd dan een
|
|
niet-OV-bericht te veel doorgelaten.** Bij twijfel over een woord: ambigu maken (eigen groep), nooit
|
|
sterk.
|
|
|
|
## Niet doen
|
|
- **NOOIT** maubot `reload` gebruiken. Deploy = mbp bouwen uit de VOLLEDIGE bron
|
|
(incl. `base-config.yaml`, anders `BaseMissingError`), upload met `allow_override=true`,
|
|
daarna container-restart. Exacte procedure: `skill://maubot`.
|
|
- **NOOIT** de wwebjs-container of WhatsApp-sessies (her)starten/beëindigen — meerdere bots delen die sessies.
|
|
- Productie draait het **geïnstalleerde mbp**, niet deze werkdirectory: een commit is pas actief na build+upload+restart.
|
|
|
|
## Bekend — NIET onderzoeken
|
|
- Na een deploy (upload + container-restart) staan er 2 verse `run complete`-regels in de run-log
|
|
binnen enkele seconden: maubot herstart de instance bij een nieuwe plugin-versie (upstream) én de
|
|
container-restart start opnieuw, elke start doet direct één poll. Dat is géén handler-lek en hoort
|
|
niet onderzocht te worden (besluit 2026-09-11). Alleen verdubbeling op élke poll-run is een
|
|
probleem. Zie `skill://maubot` → Veelgemaakte fouten. |