'de Stationsstraat afsluiten voor een festival' is geen OV-nieuws, maar
scored wel (familie \bstation\w*\b, gewicht 3; via `stations`+suffix
dingt `station\w*\b` op 'stationsstraat'). Regex-uitbreiding faalt op de
dubbele s (stations+straat): elke naamvorm vraagt opnieuw regex-herrie.
Daarom MATCH_FILTER_BLACKLIST: exact gematchte woorden die geen OV-waarde
hebben (straatnamen rond stations: stationsstraat/weg/laan/plein/... plus
treinstraat/treinweg) tellen niet meer mee. De genitief-s-vorm dekt zowel
'Stationsstraat' als 'Stationsweg' etc. Zwartgelijste woorden blokkeren de
familie niet: een echt station-/trein-woord ernaast scoort gewoon.
Filter is nu vast in code (MATCH_FILTER_FAMILIES + MATCH_FILTER_THRESHOLD):
doorlaten als 2x(titelfamiliescore) + 1x(samenvattingscore) >= 3.
Sterk(3): vervoerders, spoorinfra, station, voertuig-samenstellingen, trein.
Medium(2): tram, metro, dienst, vervoersbewijs/staking/pont.
Zwak(1): losse bus/kaartje/rails - moet combineren met ander OV-woord.
Weert 'VW-bus'/'schoolbus', woningbrand-leads met 'bussen rijden om' en
figuratief 'op de rails', zonder bushalte/overweg/NS/trein-berichten te raken.
Gewogen per familie ipv per cluster dicht ook het 'bus x3 in lead'-gat.
!rss set-filter en !rss filter zijn read-only geworden (tonen het vaste filter);
config-keys match_filter/allow_filter verwijderd uit do_update.
V1.7.0 gedeployed op nextcloud (instance rss, enabled+started, run-log actief).
_setup_run_log ruimde handlers alleen op via het instance-attribuut
self._run_logger; bij een maubot-reload is dat op de nieuwe instance weer
None, terwijl de geregistreerde logger (zelfde naam) de oude handler behield.
Elke reload voegde zo een handler toe, waardoor elke poll-run N× werd
gelogd. Fix: logger altijd op naam opruimen.
Regel C: doorlaten bij (titel-match >= 1) of (totaalscore >= 3).
Een treffer in de titel is een sterke OV-intentie (score 2 volstaat);
treffers alleen in de samenvatting moeten dubbel bevestigd worden.
Weert bv. woningbrand-berichten die via 'bussen rijden om'/'busverkeer'
in de lead binnenkwamen, zonder de 112/trein/staking-berichten te raken.
Gevalideerd op 30d kamerhistorie: 96 doorlaat -> 7 geblokkeerd (allemaal ruis).
Deze feeds dragen geen paywall-marker (<premium>/<dpp:paid>); premium-artikelen
leven onder /ps/. Gedeelde helper _is_paywalled_link voor RSS- en JSON-parsing.
- losse 1-hit in summary volstaat niet meer: 'ns-trein' in een
rechtszaak-artikel (stenengooier) telt als 1 cluster en wordt geblokkeerd
- cluster-aware teller: aaneengesloten matches (NS-trein, openbaar vervoer,
pdf) samenvoegen
- bus(?:sen)? suffix: 'Meer bussen naar TU' komt terug
- root-cause config-corruptie: re.sub-replacement de-escaped \\b naar \b
(YAML-backspace); nu regel-bewerking zonder escape-processing
- parse_feed: expliciete aiohttp ClientTimeout(total=20) zodat een hangende
feed nooit de poll blokkeert (sessie had geen total-timeout; feeds bleven
open en semaphore-sloten raakten bezet)
- poll_parallelism_limit: 0 in instance-config (alle feeds parallel)
- RTV Oost-feed vervangen door directe URL (rss/index.xml, geen redirect)
- match_filter is nu instance-config (geldt voor ALLE feeds), niet per
subscription: !rss set-filter <regex> zet het globale filter en slaat
config op; !rss subscriptions toont het globale filter
- v7-migratie: per-subscription kolom match_filter verwijderd
- filter scant titel + HTML-ontdaan summary
- plugin id nl.eddydevink.rss, module buzzrss (uniek, voorkomt botsing met
xyz.maubot.rss die dezelfde 'rss'-module importeert)
- match_filter (v6-migratie, hernoemd van title_exclude_filter): post wordt
alleen verstuurd als de regex matcht op titel OF (HTML-ontdaan) summary
- config-default whitelist voor ov-only: gvb/ebs/connexxion/transdev/keolis/
ret/gvu/bus/metro/tram/trein(verwanten)/ov/ov-staking/staking
- set-filter: lege filter valt terug op config-default