# Matching- en scoringengine ## 1. Beslisvolgorde ```text normalisatie -> harde uitsluitingen -> deterministische features -> optionele AI-features (alleen aanvulling) -> gewogen score -> confidence -> recommendation -> append-only ScoreRun ``` Harde uitsluitingen hebben absolute voorrang. Een score van 99 kan een uitgesloten verplichte skill of regio niet overrulen. ## 2. Harde regels Ondersteund of gepland: - uitgesloten titelterm; - uitgesloten/geen toegestane contractvorm; - uitgesloten regio/gemeente; - afstand boven maximum, behalve remote; - uitgesloten verplichte skill; - expliciete rijbewijs-/reis-/taalvereisten wanneer betrouwbaar geëxtraheerd; - verlopen of niet-actieve vacature buiten de ranking. Iedere uitsluiting bewaart een concrete reden. `unknown_is_insufficient` kan later per regel bepalen of ontbrekende data naar review gaat; veilige standaard is onbekend niet automatisch uitsluiten. ## 3. Componenten Standaardgewichten, totaal 100: | Component | Gewicht | Kernsignalen | |---|---:|---| | Content | 25 | titelovereenkomst, taken, weinig ongewenste support | | Skills | 20 | gewenste skills in expliciete velden/tekst | | Locatie | 15 | afstand, remote/hybrid, voorkeursregio | | Voorwaarden | 10 | toegestane contract-/werkvorm | | Werkgever | 10 | directe bron versus recruiter | | Senioriteit | 10 | gevraagde ervaring versus profiel | | Voorkeuren | 10 | publieke sector en andere soft signals | Bij aangepaste gewichten worden componentbijdragen genormaliseerd op de totale som. - AI-boost is opt-in via profielinstelling en telt alleen mee als profielgewicht > 0. - De AI-component is softwarematig begrensd (maximale bijdrage via `ai`-gewicht) om dominantie te vermijden. ## 4. Confidence Confidence is niet hetzelfde als score. Een vacature kan inhoudelijk sterk lijken maar lage confidence hebben door ontbrekende werkgever, locatie of beschrijving. Baselineformule in MVP: ```text confidence = 0.65 * extraction_confidence + 0.35 * field_completeness ``` Uitbreidingen mogen rekening houden met: - provenancekwaliteit per veld; - overeenstemming tussen aliassen; - geocodingconfidence; - parserspecifieke drift; - AI-/deterministische featureconsistentie. ## 5. Recommendations - `strong` — score ≥ topmatchthreshold en confidence ≥ 0,65; - `possible` — score ≥ recommendationthreshold; - `weak` — lager maar niet hard uitgesloten; - `hidden` — minstens één harde uitsluiting. Drempels zijn profielconfiguratie. De UI toont score en confidence apart. ## 6. Evidence en explainability Een score bewaart: - exacte componentbijdragen; - positives; - concerns; - hard exclusions; - afstand/evidence; - profielversie; - optionele model- en promptversie. - AI-status (`ok`, `disabled`, `timeout`, `invalid`, `error`) en foutcategorie; - gewichten (gevraagde vs. effectief toegepast, zodat cap zichtbaar is). Copyregels: - zeg "niet teruggevonden" in plaats van "ontbreekt" wanneer brondata onvolledig is; - label inference als inference; - toon maximaal enkele kernredenen bovenaan en volledige details uitklapbaar; - geef geen kanspercentage op aanwerving zonder gevalideerd model. ## 7. Feedbackleren Feedback kan alleen begrensde soft weights aanpassen. Learning staat standaard uit tot `learning_enabled` actief is. Regels: - learning kan uit; - delta per feedbackactie klein en gelimiteerd; - weight binnen 0..40; - iedere wijziging maakt een profielrevisie; - harde regels en bronpolicy worden nooit geleerd; - een enkele actie leidt niet tot grote verschuiving (minimale sample-criteria per feature); - gebruiker kan resetten en verschil bekijken. - hidden feedback met reden en non-relevant categorieën wordt apart gelogd. Feedbackregels worden als metadata op de feedback opgeslagen (`feedback.metadata["learning"]` met status, reden, feature, delta, sample count). Offline evaluatie is beschikbaar via `scripts/feedback_learning_report.py` met feedbackcounts, churn en non-learning categorieën. ## 8. AI-rol Toegestaan: - support-/consultancy-/travelratio schatten; - senioritylabel; - korte Nederlandse samenvatting; - evidencefragmenten selecteren; - ambiguïteitswarnings. Niet toegestaan: - harde uitsluiting toevoegen zonder deterministisch verifieerbaar signaal; - vacature verwijderen; - URL bezoeken of tools aanroepen; - source policy wijzigen; - e-mail of sollicitatie verzenden; - profiel zelfstandig herschrijven. AI-input staat tussen duidelijke datamarkers, output volgt JSON-schema, temperatuur is 0 en alle waarden worden gevalideerd/geclamped. Uitval is een normale fallback, geen pipelinefout. - AI-status en evidence worden altijd opgeslagen in `ScoreRun.evidence` en vallen nooit terug op hard-exclusions of sourcepolicywijzigingen.