@@ -1,6 +1,6 @@
|
||||
schema_version: 1
|
||||
project: VacatureRadar
|
||||
updated_at: '2026-07-21'
|
||||
updated_at: '2026-07-22'
|
||||
execution_policy:
|
||||
order: file-order, then first ready task whose dependencies are done
|
||||
no_product_questions: true
|
||||
@@ -961,7 +961,8 @@ tasks:
|
||||
- Dashboard, vacatures, detail, pipeline, profiel, bronnen, systeem en login gebruiken echte backenddata en acties.
|
||||
- Externe auto-apply, nepmetrics, onbewezen werkgeverinzichten en onbetrouwbare activiteitenfeeds zijn niet overgenomen.
|
||||
- Zes doelviewports hebben één h1, geen horizontale overflow en werkende mobiele navigatie.
|
||||
- Stitch-bronnen, integratieplan, screenshots en verificatierapport zijn traceerbaar maar niet onderdeel van de productiecontainer.
|
||||
- Stitch-bronnen, integratieplan, screenshots en verificatierapport zijn traceerbaar maar niet onderdeel van de
|
||||
productiecontainer.
|
||||
verification:
|
||||
- uv run pytest tests/e2e tests/integration/test_views.py tests/integration/test_tasks_and_more_views.py
|
||||
- ./scripts/codex_verify.sh
|
||||
@@ -977,9 +978,341 @@ tasks:
|
||||
completed_at: '2026-07-21'
|
||||
note: Stitch-visuele taal geïntegreerd in CSP-veilige Django-templates; dark/light, responsive shell, pipeline,
|
||||
broninteracties en browservalidatie toegevoegd zonder functionele scope-uitbreiding of fictieve data.
|
||||
- id: VR-119
|
||||
title: Stitch-schermcompositie dominant doorvoeren
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-050
|
||||
- PR-051
|
||||
- NFR-008
|
||||
depends_on:
|
||||
- VR-118
|
||||
summary: Herwerk de cockpit na productfeedback zodat de aangeleverde Stitch-frontend niet alleen de visuele tokens
|
||||
maar ook de schermcompositie, informatiedichtheid en interactiehiërarchie bepaalt, met behoud van echte Django-data,
|
||||
toegankelijke server-rendered flows en alle bestaande veiligheidsgrenzen.
|
||||
acceptance_criteria:
|
||||
- De gedeelde shell, utilitybar en navigatie volgen aantoonbaar de Stitch-compositie op desktop en mobiel.
|
||||
- Dashboard, vacatureoverzicht en detail nemen de primaire Stitch-layouts vrijwel volledig over met uitsluitend
|
||||
aantoonbare databasevelden en bestaande veilige acties.
|
||||
- Pipeline, profiel, bronnen, systeem en login gebruiken dezelfde dichte cockpit-hiërarchie en componentvormen.
|
||||
- Lege, fout- en een-itemtoestanden behouden de bedoelde compositie zonder grote onverklaarde lege vlakken.
|
||||
- Zes doelviewports hebben één h1, geen pagina-brede horizontale overflow en werkende toetsenbordnavigatie.
|
||||
- Geen auto-apply, externe assets, fictieve metrics of onbewezen intelligence wordt toegevoegd.
|
||||
verification:
|
||||
- uv run pytest tests/e2e tests/integration/test_views.py tests/integration/test_tasks_and_more_views.py
|
||||
- ./scripts/codex_verify.sh
|
||||
- Browsercontrole op 1440x900, 1280x800, 1024x768, 768x1024, 390x844 en 360x800
|
||||
primary_paths:
|
||||
- apps/core/context_processors.py
|
||||
- apps/core/views.py
|
||||
- apps/jobs/views.py
|
||||
- templates/
|
||||
- static/css/app.css
|
||||
- static/js/app.js
|
||||
- docs/design/STITCH_INTEGRATION_PLAN.md
|
||||
- docs/design/validation/
|
||||
result:
|
||||
completed_at: '2026-07-21'
|
||||
note: Stitch-schermcompositie dominant doorgevoerd in shell, dashboard, vacaturefeed/detail, pipeline, profieleditor,
|
||||
bronnen en systeem; geverifieerd met 146 tests, 82,02% coverage en browsermatrix op zes viewports, dark/light
|
||||
en mobiele navigatie.
|
||||
- id: VR-120
|
||||
title: Begeleid zoekprofiel en functionele livebronnen opleveren
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-001
|
||||
- PR-002
|
||||
- PR-005
|
||||
- PR-011
|
||||
- PR-017
|
||||
- PR-018
|
||||
- PR-022
|
||||
depends_on:
|
||||
- VR-119
|
||||
summary: Verwerk de functionele productfeedback door thuislocatie tot postcode te vereenvoudigen, technische JSON-invoer
|
||||
door selectielijsten en checkboxes te vervangen en minimaal twee actuele publieke werkgeversfeeds end-to-end
|
||||
te valideren.
|
||||
acceptance_criteria:
|
||||
- Het profiel vraagt alleen een viercijferige thuispostcode en leidt gemeente/coördinaten af wanneer lokale geodata
|
||||
eenduidig beschikbaar is.
|
||||
- Functietitels, skills, contractvormen, werkmodellen en regio's zijn begeleide keuzevelden die bestaande waarden
|
||||
veilig behouden.
|
||||
- Minimaal twee echte werkgeverfeeds hebben een actuele policyreview, parserfixtures en twee succesvolle livecycli.
|
||||
- Demobronnen zijn niet zichtbaar in het normale bronoverzicht en actuele vacatures stromen door naar ranking.
|
||||
- Profiel-, adapter-, pipeline-, view- en browsertests plus de volledige verificatiegate slagen.
|
||||
verification:
|
||||
- uv run pytest tests/integration/test_profile_preferences.py tests/integration/test_seed_sources.py tests/integration/test_pipeline.py
|
||||
tests/unit/test_ats_adapters.py
|
||||
- Volg docs/operations/SOURCE_ONBOARDING.md en controleer twee livecycli per geactiveerde bron
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/profiles/
|
||||
- templates/profiles/
|
||||
- apps/sources/
|
||||
- config-data/seed_sources.yaml
|
||||
- docs/operations/SOURCE_ONBOARDING.md
|
||||
result:
|
||||
completed_at: '2026-07-21'
|
||||
note: Postcode-only profiel, begeleide checkboxkeuzes, gereviewde VITO- en Deliverect-feeds met twee livecycli,
|
||||
employeridentiteit, broninventaris en robotsredirecthardening; 155 tests geslaagd, 2 optioneel overgeslagen,
|
||||
82,94% coverage en volledige codex_verify-gate groen.
|
||||
- id: VR-121
|
||||
title: Regionale werkgevers- en platformalertdekking uitbreiden
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-011
|
||||
- PR-012
|
||||
- PR-017
|
||||
- PR-018
|
||||
- PR-032
|
||||
depends_on:
|
||||
- VR-120
|
||||
summary: Breid de livebroncatalogus uit met publieke werkgeversfeeds in Limburg en aangrenzende Belgische werkregio's,
|
||||
maak gedeelde ATS-hosts first-class en documenteer de veilige alertingress voor VDAB en Indeed.
|
||||
acceptance_criteria:
|
||||
- Minimaal acht bijkomende publieke bronnen hebben een actuele policyreview, parserdekking en twee succesvolle
|
||||
livecycli voordat ze actief worden.
|
||||
- De catalogus bevat aantoonbaar regionale dekking voor Hasselt/Genk en aanvullende IT-werkgevers in Brussel,
|
||||
Gent of Leuven.
|
||||
- Meerdere werkgevers op één publieke ATS-host kunnen naast elkaar bestaan zonder bronrecords te overschrijven.
|
||||
- Corda Campus-vacaturekaarten worden deterministisch uitgelezen en off-domain links worden verworpen.
|
||||
- Indeed en VDAB worden uitsluitend via officiële vacaturealerts/mailimport of handmatige import gebruikt en blijven
|
||||
op de directe-fetchdenylist.
|
||||
verification:
|
||||
- uv run pytest tests/unit/test_regional_adapters.py tests/unit/test_ats_adapters.py tests/unit/test_source_models.py
|
||||
tests/integration/test_seed_sources.py
|
||||
- Voer twee livecycli uit voor iedere nieuwe bron en controleer source health, parserwarnings en inventaristelling
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/sources/
|
||||
- config-data/seed_sources.yaml
|
||||
- fixtures/pages/corda-campus-jobs.html
|
||||
- fixtures/ats/smartrecruiters-public-postings.json
|
||||
- docs/operations/LIVE_SOURCE_CATALOG.md
|
||||
result:
|
||||
completed_at: '2026-07-21'
|
||||
note: Acht extra gereviewde livebronnen, gedeelde ATS-hostidentiteit, Corda-adapter en veilige VDAB/Indeed-alertingress
|
||||
toegevoegd; twee livecycli per bron, 159 tests, 82,91% coverage en in-app-browsercontrole geslaagd.
|
||||
- id: VR-122
|
||||
title: Dagelijkse officiële VDAB-ingang operationaliseren
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-012
|
||||
- PR-016
|
||||
- PR-018
|
||||
- PR-064
|
||||
depends_on:
|
||||
- VR-121
|
||||
summary: Verwerk officiële VDAB-jobalerts eenmaal per dag via de bestaande dedicated mailbox, met herkenbare provenance,
|
||||
begrensde verwerking en een duidelijke route naar de contractueel toegankelijke VDAB Vacature API.
|
||||
acceptance_criteria:
|
||||
- De IMAP-ingang draait standaard eenmaal per dag op een configureerbaar tijdstip en blijft idempotent bij replay.
|
||||
- VDAB-alertmails worden als VDAB-provenance herkend en vacatures stromen zonder automatische linkfetch door de
|
||||
bestaande normalisatie-, dedupe- en rankingpipeline.
|
||||
- De mailboxpoll is begrensd op aantal en berichtgrootte; oversized of onleesbare berichten stoppen de batch niet.
|
||||
- De bronpagina toont de dagelijkse planning, configuratiestatus, laatste VDAB-import en het onderscheid tussen
|
||||
jobalertingang en de officiële API waarvoor VDAB-goedkeuring vereist is.
|
||||
- Directe VDAB-scraping, platformlogin en niet-goedgekeurde API-toegang blijven geblokkeerd en dit is getest en
|
||||
operationeel gedocumenteerd.
|
||||
verification:
|
||||
- uv run pytest tests/unit/test_email_adapter.py tests/integration/test_email_import_notifications.py tests/integration/test_tasks_and_more_views.py
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/sources/adapters/email_alert.py
|
||||
- apps/sources/services/email_import.py
|
||||
- apps/sources/services/imap_import.py
|
||||
- apps/sources/tasks.py
|
||||
- config/settings.py
|
||||
- templates/sources/list.html
|
||||
- docs/architecture/adrs/0005-email-alerts-as-platform-ingress.md
|
||||
result:
|
||||
completed_at: '2026-07-21'
|
||||
note: Dagelijkse configureerbare VDAB-jobalertimport met expliciete provenance, begrensde foutgeisoleerde IMAP-poll,
|
||||
beveiligde handmatige inplanning en heldere officiele API-route; 164 tests, 2 optioneel overgeslagen, 83,55%
|
||||
coverage en desktop/390px Codex-browsercontrole groen.
|
||||
- id: VR-123
|
||||
title: Platformmailboxen veilig in de UI koppelen en frequent synchroniseren
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-012
|
||||
- PR-016
|
||||
- PR-018
|
||||
- PR-064
|
||||
depends_on:
|
||||
- VR-122
|
||||
summary: Vervang de globale dagelijkse IMAP-configuratie door gebruikersgescopeerde mailboxkoppelingen per vacatureplatform,
|
||||
met versleutelde app-wachtwoorden en een eigen frequent synchronisatie-interval.
|
||||
acceptance_criteria:
|
||||
- Een ingelogde gebruiker kan voor VDAB en Indeed afzonderlijk een Gmail-, Outlook- of aangepaste IMAP-mailbox
|
||||
koppelen, wijzigen, pauzeren en direct laten synchroniseren.
|
||||
- App-wachtwoorden worden met een afzonderlijke roteerbare sleutel versleuteld opgeslagen, nooit teruggetoond
|
||||
en nooit in logs of taakresultaten opgenomen.
|
||||
- Iedere mailbox heeft een interval van 5 tot 360 minuten; de scheduler plant alleen verschuldigde actieve mailboxen
|
||||
en is concurrency- en replayveilig.
|
||||
- Mailimport bewaart mailbox- en platformprovenance, is per mailbox idempotent en laat een fout in één mailbox
|
||||
de andere mailboxen niet blokkeren.
|
||||
- Alle mutaties zijn login-, user-scope- en CSRF-beveiligd; negatieve tests dekken cross-user toegang, ontbrekende
|
||||
encryptiesleutel, ongeldige host/poort en secretlekken.
|
||||
- Bronpagina, runbook, threat model, configuratie en migratiedocumentatie zijn bijgewerkt; directe platformfetch
|
||||
en platformlogin blijven uitgesloten.
|
||||
verification:
|
||||
- uv run pytest tests/unit/test_mailbox_credentials.py tests/integration/test_mailbox_connections.py tests/integration/test_email_import_notifications.py
|
||||
- uv run python manage.py makemigrations --check --dry-run
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/sources/models.py
|
||||
- apps/sources/forms.py
|
||||
- apps/sources/services/mailbox_connections.py
|
||||
- apps/sources/services/imap_import.py
|
||||
- apps/sources/tasks.py
|
||||
- apps/sources/views.py
|
||||
- templates/sources/list.html
|
||||
- config/settings.py
|
||||
result:
|
||||
completed_at: '2026-07-22'
|
||||
note: 'Per-platform VDAB/Indeed-mailboxen met versleutelde app-wachtwoorden, intervallen van 5-360 minuten,
|
||||
leases, user-scoped UI, securitytests en documentatie; volledige gate: 178 passed, 2 skipped, 83.56%.'
|
||||
- id: VR-124
|
||||
title: LinkedIn en Belgische jobboards via veilige jobalertmail toevoegen
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-012
|
||||
- PR-016
|
||||
- PR-021
|
||||
- NFR-001
|
||||
- NFR-003
|
||||
depends_on:
|
||||
- VR-123
|
||||
summary: Breid de platformmailboxingang uit met LinkedIn, ictjob.be, Jobat, StepStone, EuroBrussels en BrusselsJobs
|
||||
en beperk iedere parserrun tot vacaturelinks van het expliciet gekozen jobboard.
|
||||
acceptance_criteria:
|
||||
- De mailbox-UI biedt naast VDAB en Indeed ook LinkedIn, ictjob.be, Jobat, StepStone, EuroBrussels en BrusselsJobs
|
||||
met een actuele officiele jobalertlink en dezelfde afzonderlijke mailbox-, interval-, pauze- en syncflow.
|
||||
- Gesaneerde fixtures en adaptertests bewijzen per nieuw platform titel-, link- en provenance-extractie zonder
|
||||
live netwerkcall.
|
||||
- Een platformgebonden mail importeert alleen HTTPS-vacaturelinks op het verwachte jobboarddomein; externe, tracking-,
|
||||
account-, privacy- en uitschrijflinks worden genegeerd.
|
||||
- Mailboxrecords, bronprovenance, idempotentie, user scoping, encryptie, leases en foutisolatie blijven voor alle
|
||||
platformkeuzes behouden.
|
||||
- Bronbeleid, catalogus, threat model, onboarding, traceability en UI-copy vermelden dat directe platformlogin
|
||||
en jobboardscraping uitgesloten blijven.
|
||||
verification:
|
||||
- uv run pytest tests/unit/test_email_adapter.py tests/integration/test_email_import_notifications.py tests/integration/test_mailbox_connections.py
|
||||
- uv run python manage.py makemigrations --check --dry-run
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/sources/models.py
|
||||
- apps/sources/adapters/email_alert.py
|
||||
- apps/sources/services/email_import.py
|
||||
- templates/sources/list.html
|
||||
- fixtures/emails/
|
||||
- docs/operations/LIVE_SOURCE_CATALOG.md
|
||||
result:
|
||||
completed_at: '2026-07-22'
|
||||
note: LinkedIn, ictjob.be, Jobat, StepStone, EuroBrussels en BrusselsJobs toegevoegd aan platformmailboxen;
|
||||
domeingebonden HTTPS-parser, zes fixtures, denylist, UI en docs; 192 passed, 2 skipped, 83.61%, desktop/390px
|
||||
browser groen.
|
||||
- id: VR-125
|
||||
title: Brusselse dekking vervangen door regionale werkgevers en Belgische jobplatformen
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-011
|
||||
- PR-012
|
||||
- PR-017
|
||||
- PR-018
|
||||
- PR-021
|
||||
- NFR-001
|
||||
- NFR-003
|
||||
depends_on:
|
||||
- VR-124
|
||||
summary: Verwijder de expliciete Brusselse jobboards en werkgevers uit de actieve radar, voeg brede Belgische
|
||||
jobalertplatformen toe en activeer veilige publieke vacaturelijsten van werkgevers rond Hasselt-Genk.
|
||||
acceptance_criteria:
|
||||
- EuroBrussels en BrusselsJobs zijn niet meer configureerbaar of actief; bestaande koppelingen worden veilig uitgeschakeld
|
||||
en verborgen zonder historische provenance te verwijderen.
|
||||
- Careerjet, Randstad en Robert Half zijn beschikbaar via hun officiele e-mailalerts en blijven op de directe-fetchdenylist.
|
||||
- Werkgeversbronnen buiten de regionale scope worden gedeactiveerd en verborgen; bestaande vacaturehistoriek blijft
|
||||
bewaard.
|
||||
- Minstens vier lokale werkgeverspagina's uit de kern Hasselt-Genk worden met host- en padgebonden adapters, gesaneerde
|
||||
fixtures, actuele bronreview en twee succesvolle livecycli toegevoegd.
|
||||
- Tot een thuispostcode is ingevuld, vermeldt de catalogus expliciet dat Hasselt-Genk als omkeerbaar centrum voor
|
||||
de 40-km-selectie is gebruikt; ranking blijft de exacte profielafstand toepassen zodra die bekend is.
|
||||
- Bronbeleid, threat model, onboarding, traceability en gebruikerscopy blijven duidelijk over e-mailingress, robots,
|
||||
SSRF, off-domain afwijzing en het verbod op platformlogin en scraping.
|
||||
verification:
|
||||
- .venv/Scripts/python.exe -m pytest tests/unit/test_regional_adapters.py tests/unit/test_email_adapter.py tests/integration/test_seed_sources.py
|
||||
tests/integration/test_email_import_notifications.py
|
||||
- .venv/Scripts/python.exe manage.py makemigrations --check --dry-run
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/sources/adapters/regional.py
|
||||
- apps/sources/platforms.py
|
||||
- apps/sources/management/commands/seed_sources.py
|
||||
- config-data/seed_sources.yaml
|
||||
- fixtures/pages/
|
||||
- fixtures/emails/
|
||||
- docs/operations/LIVE_SOURCE_CATALOG.md
|
||||
result:
|
||||
completed_at: '2026-07-22'
|
||||
note: Brusselse mailboxen en zeven buitenregionale bronnen veilig geretired; Careerjet, Randstad en Robert Half
|
||||
toegevoegd; ACA, Xplore, UHasselt, PXL en ZOL na host/padreview en twee livecycli actief; 200 passed, 2 skipped,
|
||||
83.90%, browser desktop/390px groen.
|
||||
- id: VR-126
|
||||
title: Werkgeversradar herankeren op postcode 2400 Mol
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-002
|
||||
- PR-011
|
||||
- PR-017
|
||||
- PR-018
|
||||
- PR-021
|
||||
- NFR-001
|
||||
- NFR-003
|
||||
depends_on:
|
||||
- VR-125
|
||||
summary: Vervang de tijdelijke Hasselt-Genk-aanname door postcode 2400 Mol en voeg veilige publieke vacaturelijsten
|
||||
toe van relevante werkgevers binnen ongeveer 40 km, met nadruk op infrastructuur-, systeem- en netwerkfuncties.
|
||||
acceptance_criteria:
|
||||
- De actieve profielruntime bewaart postcode 2400 en een maximale afstand van 40 km; ontbrekende gelicenseerde
|
||||
coördinatendata blijft expliciet zichtbaar als extern restpunt en wordt niet stil ingevuld.
|
||||
- De broncatalogus en UI noemen Mol als centrum en maken onderscheid tussen geografisch gereviewde bronnen en
|
||||
exacte vacatureafstand die pas na geocoding kan worden berekend.
|
||||
- Minstens vijf werkgevers uit Mol, Geel, Westerlo of Turnhout met regelmatig gepubliceerde eigen vacatures worden
|
||||
host- en padgebonden toegevoegd, inclusief relevante IT-/infrastructuurwerkgevers.
|
||||
- Iedere nieuwe bron heeft een gesaneerde fixture, positieve adaptertest, off-domain/route-negatie en minstens
|
||||
twee geslaagde livecycli zonder parserwarnings voor activering.
|
||||
- Bestaande regionale bronnen blijven alleen actief wanneer hun primaire vestiging of vacaturelocatie indicatief
|
||||
binnen 40 km van Mol valt; historische vacatures en provenance worden bij retirement behouden.
|
||||
- Bronbeleid, threat model, livecatalogus, onboarding, traceability en gebruikerscopy documenteren robots-, SSRF-,
|
||||
sanitization- en locatiegrenzen; login, sollicitatie-endpoints en platformscraping blijven uitgesloten.
|
||||
verification:
|
||||
- .venv/Scripts/python.exe -m pytest tests/unit/test_regional_adapters.py tests/integration/test_seed_sources.py
|
||||
tests/integration/test_profile_preferences.py tests/security/test_policy.py
|
||||
- .venv/Scripts/python.exe manage.py makemigrations --check --dry-run
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- apps/sources/adapters/regional.py
|
||||
- apps/sources/management/commands/seed_sources.py
|
||||
- config-data/seed_sources.yaml
|
||||
- fixtures/pages/
|
||||
- templates/sources/list.html
|
||||
- docs/operations/LIVE_SOURCE_CATALOG.md
|
||||
result:
|
||||
completed_at: '2026-07-22'
|
||||
note: Profielruntime op postcode 2400 en 40 km gezet; SCK CEN, Cipal Schaubroeck, VanRoey, NTX en Thomas More
|
||||
met fail-closed Mol-regioadapter, fixtures, docs en twee livecycli geactiveerd; 206 passed, 2 skipped, 84.12%,
|
||||
browser desktop/360px groen.
|
||||
- id: VR-201
|
||||
title: Concrete live-bronnen inventariseren en juridisch/operationeel reviewen
|
||||
status: blocked-external
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- PR-011
|
||||
@@ -1001,8 +1334,11 @@ tasks:
|
||||
- config-data/seed_sources.local.yaml
|
||||
- Source admin
|
||||
- docs/operations/SOURCE_ONBOARDING.md
|
||||
external_blocker: Vereist persoonlijke werkgeverskeuzes en een actuele menselijke bronvoorwaardenreview. Commit
|
||||
lokale bronlijst niet wanneer die persoonlijke informatie bevat.
|
||||
result:
|
||||
completed_at: '2026-07-22'
|
||||
note: Gemeente Mol en zeven Kempen-werkgevers na actuele menselijke review, fail-closed fixtures/tests en twee
|
||||
livecycli geactiveerd; twaalf interessante regionale werkgevers als niet-scanbare waaklijst toegevoegd; TLS
|
||||
gebruikt strikt de gepinde certifi-bundel zonder bypass.
|
||||
- id: VR-202
|
||||
title: Live IMAP- en SMTP-credentials configureren
|
||||
status: blocked-external
|
||||
@@ -1015,18 +1351,23 @@ tasks:
|
||||
depends_on:
|
||||
- VR-111
|
||||
- VR-115
|
||||
summary: Configureer een dedicated vacaturemailbox, app-password en digestrecipient; test read-only import en
|
||||
mailverzending zonder credentials in Git/logs.
|
||||
- VR-123
|
||||
- VR-124
|
||||
summary: Configureer de gewenste afzonderlijke platformmailboxen via de beveiligde UI, de Fernet-secretkey en
|
||||
digestrecipient; test read-only import en mailverzending zonder credentials in Git/logs.
|
||||
acceptance_criteria:
|
||||
- IMAP gebruikt TLS, dedicated mailbox en mark-seen standaard uit tijdens acceptatie.
|
||||
- Dezelfde live testmail importeert idempotent.
|
||||
- Iedere platformmailbox gebruikt TLS, een dedicated account/app-wachtwoord en read-only mailboxselectie.
|
||||
- Dezelfde live testmail importeert per mailbox idempotent en alle geconfigureerde intervallen worden door de
|
||||
scheduler gerespecteerd.
|
||||
- SMTP verstuurt één testdigest en outboxstatus klopt.
|
||||
- Credentials zijn geroteerbaar en alleen in productie-secretstore/.env aanwezig.
|
||||
- De encryptiesleutel staat alleen in de productie-secretstore/.env; app-wachtwoorden zijn als ciphertext in de
|
||||
database aanwezig en sleutelrotatie is live getest.
|
||||
verification:
|
||||
- Volg Unraid mailboxchecklist
|
||||
- Inspecteer logs op afwezigheid van secret/payload
|
||||
primary_paths:
|
||||
- /mnt/user/appdata/vacatureradar/config/.env
|
||||
- Bronnen -> Platformmailboxen
|
||||
external_blocker: Vereist mailbox-/SMTP-account en app-password van de gebruiker.
|
||||
- id: VR-203
|
||||
title: Productiedomein, TLS en reverse proxy activeren
|
||||
@@ -1078,7 +1419,7 @@ tasks:
|
||||
external_blocker: Vereist registrykeuze, account en credentials.
|
||||
- id: VR-205
|
||||
title: Gelicenseerde Belgische geodatabron laden
|
||||
status: blocked-external
|
||||
status: done
|
||||
priority: P1
|
||||
requirement_ids:
|
||||
- PR-002
|
||||
@@ -1098,7 +1439,11 @@ tasks:
|
||||
primary_paths:
|
||||
- lokale geodatafile
|
||||
- config-data/geodata/README.local.md
|
||||
external_blocker: Vereist een actuele datasetkeuze/licentiecheck; bulkdata hoort niet automatisch in de project-ZIP.
|
||||
result:
|
||||
completed_at: '2026-07-22'
|
||||
note: GeoNames België postcodedataset 2026-04-03 onder CC BY 4.0 gereviewd, checksums vastgelegd, 2781 unieke
|
||||
rijen gevalideerd en 5562 lookuprecords geïmporteerd; 2400 Mol opgelost naar 51.1919, 5.1166 en actieve profielscores
|
||||
herberekend.
|
||||
- id: VR-301
|
||||
title: Multi-tenant SaaS, teams en billing
|
||||
status: deferred
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Projectstatus
|
||||
|
||||
- Laatst bijgewerkt: 2026-07-21
|
||||
- Repositoryversie: 0.2.1 Stitch Intelligence Cockpit
|
||||
- Laatst bijgewerkt: 2026-07-22
|
||||
- Repositoryversie: 0.2.10 Kempen-werkgeversradar en GeoNames
|
||||
- Uitvoeringsmodus: autonome backlog
|
||||
- Eerste uitvoerbare taak: controleer met `python scripts/backlog.py next`
|
||||
|
||||
@@ -41,6 +41,93 @@ VR-118-herverificatie op 2026-07-21:
|
||||
- taakledger geldig met 36 taken: 28 done, 5 blocked-external, 3 deferred en 0 ready;
|
||||
- geïntegreerde browservalidatie op zes viewports en beide thema's geslaagd.
|
||||
|
||||
VR-119-herverificatie op 2026-07-21:
|
||||
|
||||
- 146 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; uitgebreide HTML/a11y-fallback geslaagd;
|
||||
- 82,02% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd;
|
||||
- geïntegreerde browsercontrole op alle kernroutes, zes doelviewports, dark/light en mobiele drawer geslaagd zonder pagina-overflow of consolefouten;
|
||||
- taakledger geldig met 37 taken: 29 done, 5 blocked-external, 3 deferred en 0 ready.
|
||||
|
||||
VR-120-herverificatie op 2026-07-21:
|
||||
|
||||
- 155 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback en in-app-browsercontrole geslaagd;
|
||||
- 82,94% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via de volledige `scripts/codex_verify.sh`-gate;
|
||||
- VITO leverde 37 vacatures in twee geslaagde cycli; Deliverect leverde 26 vacatures en verwerkte de tweede cyclus correct als HTTP 304;
|
||||
- taakledger geldig met 38 taken: 30 done, 5 blocked-external, 3 deferred en 0 ready.
|
||||
|
||||
VR-121-herverificatie op 2026-07-22:
|
||||
|
||||
- 159 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 82,91% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- acht nieuwe bronnen passeerden elk twee livecycli zonder parserwarnings; de lokale inventaris telt 10 actieve bronnen en 145 actieve vacatures;
|
||||
- in-app-browsercontrole bevestigde 10 bronkaarten, de VDAB/Indeed-alertingress, geen horizontale overflow en geen consolefouten;
|
||||
- taakledger bevat 39 taken; na afronding van VR-121 blijven alleen 5 `blocked-external` en 3 `deferred` taken over.
|
||||
|
||||
VR-122-herverificatie op 2026-07-22:
|
||||
|
||||
- 164 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 83,55% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- de dagelijkse mailboxingang is configureerbaar, idempotent en begrensd; VDAB-mails krijgen expliciete provenance zonder platformlinks automatisch te volgen;
|
||||
- Codex-browsercontrole bevestigde de VDAB-/API-uitleg, desktop en 390 px zonder horizontale overflow en zonder consolefouten;
|
||||
- taakledger bevat 40 taken; na afronding van VR-122 blijven alleen 5 `blocked-external` en 3 `deferred` taken over.
|
||||
|
||||
VR-123-herverificatie op 2026-07-22:
|
||||
|
||||
- 178 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 83,56% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- VDAB en Indeed hebben afzonderlijke gebruikersgescopeerde mailboxkoppelingen met eigen provider, account, app-wachtwoord en interval van 5 tot 360 minuten;
|
||||
- app-wachtwoorden zijn versleuteld met roteerbare MultiFernet-sleutels; schedulerleases, per-mailbox-idempotentie, SSRF-validatie en foutisolatie zijn regressiegedekt;
|
||||
- Codex-browsercontrole bevestigde de platformmailboxformulieren, desktop en 390 px zonder horizontale overflow en zonder consolefouten;
|
||||
- taakledger bevat 41 taken; na afronding van VR-123 blijven alleen 5 `blocked-external` en 3 `deferred` taken over.
|
||||
|
||||
VR-124-herverificatie op 2026-07-22:
|
||||
|
||||
- 192 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 83,61% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- platformmailboxen ondersteunen naast VDAB en Indeed ook LinkedIn, ictjob.be, Jobat, StepStone, EuroBrussels en BrusselsJobs met afzonderlijke accounts, intervallen en status;
|
||||
- zes gesaneerde jobboardfixtures bewijzen platformprovenance en de afwijzing van externe, HTTP-, tracking-, account-, help-, privacy- en uitschrijflinks;
|
||||
- alle acht jobboardgroepen staan op de directe-fetchdenylist; platformlogin en scraping blijven uitgesloten;
|
||||
- Codex-browsercontrole bevestigde acht keuzelijstopties en alertkaarten, desktop en 390 px zonder horizontale overflow en zonder consolefouten;
|
||||
- taakledger bevat 42 taken; na afronding van VR-124 blijven alleen 5 `blocked-external` en 3 `deferred` taken over.
|
||||
|
||||
VR-125-herverificatie op 2026-07-22:
|
||||
|
||||
- 200 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 83,90% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- EuroBrussels en BrusselsJobs zijn uit de configureerbare mailboxcatalogus verwijderd; Careerjet, Randstad en Robert Half gebruiken dezelfde versleutelde platformmailboxflow;
|
||||
- Deliverect, YPTO, adesso, Monizze, Qover, SFEIR en ARHS zijn buiten de regionale scope uitgeschakeld en verborgen zonder vacaturehistoriek of provenance te wissen;
|
||||
- ACA Group, Xplore Group, UHasselt, PXL en ZOL passeerden ieder twee livecycli zonder parserwarnings; de acht zichtbare actieve bronnen bevatten 162 vacature-aliassen;
|
||||
- Codex-browsercontrole bevestigde exact acht regionale bronkaarten, negen platformkeuzes, geen Brusselse kaarten, desktop en 390 px zonder horizontale overflow en zonder consolefouten;
|
||||
- taakledger bevat 43 taken; na afronding van VR-125 blijven alleen 5 `blocked-external` en 3 `deferred` taken over.
|
||||
|
||||
VR-126-herverificatie op 2026-07-22:
|
||||
|
||||
- 206 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 84,12% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- het actieve profiel bewaart postcode 2400 en 40 km; ontbrekende gelicenseerde coördinatendata blijft zichtbaar en wordt niet geschat;
|
||||
- SCK CEN, Cipal Schaubroeck, VanRoey, NTX en Thomas More passeerden twee livecycli zonder parserwarnings; de dertien actieve bronnen bevatten 210 vacature-aliassen;
|
||||
- Codex-browsercontrole bevestigde 13 bronkaarten, de Mol/40-km-status, desktop en 360 px zonder horizontale overflow en zonder consolefouten;
|
||||
- taakledger bevat 44 taken; na afronding van VR-126 blijven alleen 5 `blocked-external` en 3 `deferred` taken over.
|
||||
|
||||
VR-201/VR-205-herverificatie op 2026-07-22:
|
||||
|
||||
- 215 geslaagde tests en 2 optioneel overgeslagen pytest-Playwrightvarianten; HTML/a11y-fallback geslaagd;
|
||||
- 84,42% branch-aware codedekking;
|
||||
- Ruff, Django system check, migratiecontrole, taakledger en repositoryvalidatie geslaagd via `scripts/codex_verify.sh`;
|
||||
- GeoNames België 2026-04-03 is onder CC BY 4.0 met checksums gedocumenteerd, 2.781 unieke invoerrijen zijn gevalideerd en 2400 Mol is opgelost naar het benaderende postcodecentrum 51.1919, 5.1166;
|
||||
- Gemeente Mol en zeven bijkomende Kempen-werkgevers passeerden elk twee livecycli zonder parserwarnings; samen leverden zij 53 kaarten per cyclus;
|
||||
- twaalf regionale werkgevers staan afzonderlijk als niet-scanbare waaklijst in de UI, ook wanneer zij momenteel geen vacature hebben;
|
||||
- Codex-browsercontrole bevestigde 21 actieve bronnen, 12 waaklijstkaarten, de GeoNames-status, één `h1`, geen horizontale overflow op desktop of 390 px en geen consolefouten;
|
||||
- taakledger bevat 44 taken: 38 `done`, 3 `blocked-external`, 3 `deferred` en 0 `ready`.
|
||||
|
||||
## Deploymentstatus
|
||||
|
||||
- `main` is via de bestaande Gitea-SSH-sleutel naar `NuklearRabbit/VacatureRadar` gepusht.
|
||||
@@ -51,6 +138,71 @@ VR-118-herverificatie op 2026-07-21:
|
||||
|
||||
## Laatste uitgevoerde backlogtaak
|
||||
|
||||
- 2026-07-22: `VR-201` en `VR-205` voltooid.
|
||||
- De officiële GeoNames-postcodedataset lost postcode 2400 op naar Mol en levert indicatieve postcodecentrumafstanden; licentie, versie, reviewdatum en twee SHA-256-checksums zijn vastgelegd.
|
||||
- Gemeente Mol, Ziekenhuis Geel, lokaal bestuur Geel, Stad Turnhout, Group Renotec, Ravago, Sanofi Geel en DAF Trucks Westerlo zijn na fixtures, negatieve routechecks en twee livecycli actief.
|
||||
- Johnson & Johnson Beerse, Nike Laakdal, AZ Turnhout, Cartamundi, Nyrstar, Aurubis, Estée Lauder, Soudal, H.Essers, Cegeka, IOK en Jessa staan als interessante niet-scanbare werkgeverswaaklijst in de applicatie.
|
||||
- HTTP, robots en IMAP gebruiken een strikte gepinde CA-bundel; de eerdere lokale Windows-CA-fout bij Gemeente Mol en Ziekenhuis Geel was geen geldige reden voor een bypass.
|
||||
- Volgende taak: geen uitvoerbare `ready` taak; alleen `VR-202`, `VR-203` en `VR-204` blijven `blocked-external` voor productiecredentials/-infrastructuur.
|
||||
|
||||
- 2026-07-22: `VR-126` voltooid.
|
||||
- Het actieve lokale profiel bewaart postcode 2400 en een straal van 40 km; gemeente en coördinaten blijven leeg tot de gelicenseerde geodata uit `VR-205` beschikbaar is.
|
||||
- De catalogus is herankerd op Mol en uitgebreid met SCK CEN, Cipal Schaubroeck, VanRoey, NTX/Netropolix en Thomas More.
|
||||
- Exacte host-, pad-, plaats- en CVWarehouse-GUID-filters weigeren off-domain, andere vestigingen en kandidaat-/sollicitatieroutes.
|
||||
- Gemeente Mol en Ziekenhuis Geel zijn niet geactiveerd wegens falende TLS-certificaatvalidatie; er is geen bypass toegepast.
|
||||
- Volgende taak: geen uitvoerbare `ready` taak; `VR-205` blijft `blocked-external` voor de gelicenseerde geocodedataset en `VR-202` voor productie-mailboxcredentials.
|
||||
|
||||
- 2026-07-22: `VR-125` voltooid.
|
||||
- De regionale catalogus gebruikt voorlopig Hasselt-Genk als omkeerbaar centrum voor de indicatieve 40-km-selectie omdat het actieve profiel nog geen postcode bevat; de profielafstand wordt exact zodra die postcode is ingevuld.
|
||||
- Careerjet, Randstad en Robert Half vervangen de expliciete Brusselse nicheboards in de platformmailboxflow; alle brede jobboards blijven op de directe-fetchdenylist.
|
||||
- ACA Group, Xplore Group, Universiteit Hasselt, Hogeschool PXL en Ziekenhuis Oost-Limburg worden via host- en padgebonden publieke lijstparsers ingelezen; alle vijf slaagden tweemaal live zonder warnings.
|
||||
- Zeven werkgeversbronnen buiten de regionale scope zijn gedeactiveerd en verborgen, maar hun historische aliassen, documenten en provenance blijven intact.
|
||||
- Volgende taak: geen uitvoerbare `ready` taak; `VR-201` en `VR-202` blijven `blocked-external` voor persoonlijke postcode-/bronreview en productiecredentials.
|
||||
|
||||
- 2026-07-22: `VR-124` voltooid.
|
||||
- LinkedIn, ictjob.be, Jobat, StepStone, EuroBrussels en BrusselsJobs zijn toegevoegd aan dezelfde versleutelde platformmailboxflow als VDAB en Indeed.
|
||||
- De bronpagina toont per jobboard een actuele officiële alertingang; ieder platform behoudt een eigen mailbox, interval, status, pauze- en syncactie.
|
||||
- De mailparser accepteert per koppeling uitsluitend gelabelde HTTPS-links op het gekozen jobboarddomein en verwerpt externe en administratieve links.
|
||||
- Alle brede jobboards blijven directe-fetchdenylistbronnen; VacatureRadar logt alleen in op het mailboxaccount en nooit op een jobboard.
|
||||
- Volgende taak: `VR-202` blijft `blocked-external` voor productieconfiguratie en live validatie met de gewenste afzonderlijke alertmailboxen.
|
||||
|
||||
- 2026-07-22: `VR-123` voltooid.
|
||||
- Een ingelogde gebruiker kan VDAB en Indeed elk aan een afzonderlijke Gmail-, Outlook- of aangepaste IMAP-mailbox koppelen, wijzigen, pauzeren en direct synchroniseren.
|
||||
- Iedere koppeling heeft een eigen interval van 5 minuten tot 6 uur; de scheduler verwerkt alleen verschuldigde mailboxen met leases en foutisolatie.
|
||||
- App-wachtwoorden worden nooit teruggetoond en zijn versleuteld met afzonderlijke roteerbare sleutels; mailboxmutaties zijn login-, gebruikersscope- en CSRF-beveiligd.
|
||||
- Mailimport bewaart platform- en mailboxprovenance en is idempotent per mailbox en Message-ID; directe platformfetch en platformlogin blijven uitgesloten.
|
||||
- Volgende taak: `VR-202` blijft `blocked-external` voor productieconfiguratie en live validatie met de afzonderlijke VDAB- en Indeed-mailboxaccounts.
|
||||
|
||||
- 2026-07-22: `VR-122` voltooid.
|
||||
- Officiële VDAB-jobalerts worden standaard dagelijks om 06:15 Europe/Brussels via de dedicated IMAP-mailbox verwerkt; planning en batchlimieten zijn configureerbaar.
|
||||
- De mailadapter bewaart VDAB-provenance, replay blijft idempotent en een oversized of fout bericht stopt de rest van de batch niet.
|
||||
- De bronpagina toont mailboxstatus, laatste VDAB-import, een beveiligde handmatige inplanknop en de contractueel afgeschermde officiële VDAB Vacature API als afzonderlijke route.
|
||||
- Directe VDAB-scraping, platformlogin en niet-goedgekeurde API-toegang blijven geblokkeerd.
|
||||
- Volgende taak: `VR-202` blijft `blocked-external` voor het invullen en live valideren van mailbox-/SMTP-credentials.
|
||||
|
||||
- 2026-07-22: `VR-121` voltooid.
|
||||
- Corda Campus, RPM Europe Logistics, YPTO, adesso Belgium, Monizze, Qover, SFEIR Belgium en ARHS Belgium zijn na actuele review en twee succesvolle cycli geactiveerd.
|
||||
- De catalogus omvat nu regionale Hasselt/Genk-dekking en aanvullende Belgische IT-werkgevers in Brussel en Leuven.
|
||||
- Bronnen op gedeelde ATS-hosts worden uniek per exacte feed-URL bewaard; per-origin leases en rate limits blijven gezamenlijk gelden.
|
||||
- De Corda-adapter bewaart werkgever en titel van publieke jobkaarten en weigert off-domain links.
|
||||
- VDAB en Indeed blijven op de directe-fetchdenylist en worden in de UI via officiële e-mailalerts naar de bestaande beveiligde mailboxingress geleid.
|
||||
- Volgende taak: `VR-201` blijft `blocked-external` voor verdere persoonlijke bronkeuzes en periodieke menselijke voorwaardenreview.
|
||||
|
||||
- 2026-07-21: `VR-120` voltooid.
|
||||
- Thuislocatie is teruggebracht tot een viercijferige postcode; gemeente en coördinaten worden alleen uit lokale geodata afgeleid.
|
||||
- Alle profieltaxonomie gebruikt begeleide checkboxgroepen met dynamisch behoud van bestaande waarden.
|
||||
- VITO en Deliverect zijn na actuele policy-/robotsreview en twee livecycli geactiveerd; samen leverden ze 63 actuele vacaturealiases.
|
||||
- Recruitee- en Leverresponsevormen, employeridentiteit, direct-employerstatus, 304-inventaristelling en robotsredirectvalidatie zijn functioneel hersteld.
|
||||
- De fixturebron is uit het normale bronoverzicht verborgen; browserhandoff staat op de vernieuwde profieleditor.
|
||||
- Volgende taak: `VR-201` blijft `blocked-external` voor verdere persoonlijke werkgevers- en overheidsdekking.
|
||||
|
||||
- 2026-07-21: `VR-119` voltooid.
|
||||
- Stitch bepaalt nu de dominante schermcompositie: utilityzoeker, brede matchfeed, vaste radar-/actierails, dichte resultaatkaarten, intelligence-strip, kanban, profielpreview, compacte bronimport en echte systeemtelemetrie.
|
||||
- Vacaturelijstscores worden gebruikersgescopeerd uit de laatste `ScoreRun` geannoteerd; er is geen fictieve frontenddata toegevoegd.
|
||||
- Nederlandstalige profielvelden, lokale favicon en aanvullende HTML/a11y-regressieasserties zijn toegevoegd.
|
||||
- Browserbewijs en exact verificatierapport staan onder `docs/design/validation/` met prefix `vr119-`.
|
||||
- Volgende taak: `VR-201` (`blocked-external`).
|
||||
|
||||
- 2026-07-21: `VR-118` voltooid.
|
||||
- Alle kernroutes delen nu één responsive Intelligence Cockpit-shell met lokale SVG-iconen en CSP-veilige assets.
|
||||
- Stitch-dark en een volwaardige light variant zijn gekoppeld aan echte Django-data; externe quick apply, nepmetrics en onbewezen intelligence zijn bewust geweerd.
|
||||
@@ -156,13 +308,13 @@ Een toekomstige agent moet altijd de actuele waarheid opnieuw bepalen met:
|
||||
|
||||
## Nog te bouwen
|
||||
|
||||
Momenteel staan er geen `ready` taken meer over; de volgende te behandelen item is `VR-201` als `blocked-external` (bronreview).
|
||||
Momenteel staan er geen `ready` taken meer over; het volgende te behandelen item is `VR-202` als `blocked-external` voor live mailbox-/SMTP-credentials en echte jobalertmails van de gekozen platformen.
|
||||
|
||||
## Externe blokkades
|
||||
|
||||
Deze blokkeren onafhankelijke code niet:
|
||||
|
||||
- concrete werkgevers-/bronnenkeuze en actuele menselijke bronreview;
|
||||
- verdere persoonlijke werkgevers-/bronnenkeuze en actuele menselijke review buiten de actieve VITO-/Deliverect-startercatalogus;
|
||||
- live IMAP/SMTP-account en app-password;
|
||||
- Unraid-domein, DNS, TLS en reverse proxy;
|
||||
- containerregistry en credentials;
|
||||
@@ -171,7 +323,7 @@ Deze blokkeren onafhankelijke code niet:
|
||||
|
||||
## Bekende verificatiebeperking van de aangeleverde basis
|
||||
|
||||
De Pythonapplicatie, Dockerimage en PostgreSQL/Redis/Unraid-stack zijn geverifieerd. De optionele pytest-Playwrightvarianten vallen lokaal terug op de HTML/a11y-probe; VR-118 is aanvullend handmatig met de geïntegreerde browser op zes viewports uitgevoerd. Een publieke HTTPS-smoke blijft afhankelijk van domein-, DNS- en reverse-proxyconfiguratie.
|
||||
De Pythonapplicatie, Dockerimage en PostgreSQL/Redis/Unraid-stack zijn geverifieerd. De optionele pytest-Playwrightvarianten vallen lokaal terug op de HTML/a11y-probe; VR-119 is aanvullend met de geïntegreerde browser op alle kernroutes uitgevoerd, VR-120 op het begeleide profiel en de live vacaturefeed en VR-124 op de acht platformmailboxen en alertkaarten. Een publieke HTTPS-smoke blijft afhankelijk van domein-, DNS- en reverse-proxyconfiguratie.
|
||||
|
||||
## Hervatten
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ Verplichte stappen:
|
||||
5. response status/contenttype/grootte controleren;
|
||||
6. alleen allowlisted headers bewaren.
|
||||
|
||||
Webfetches, robotsrequests en IMAP-TLS gebruiken expliciet de bij de release vastgelegde `certifi`-CA-bundel. Hostnaamcontrole en `CERT_REQUIRED` blijven verplicht. Een verouderde Windows-rootstore is daarom geen reden voor `verify=False`; werk de gepinde bundel en lockfile gecontroleerd bij en voer de TLS-negatietests opnieuw uit.
|
||||
|
||||
Geen adapter of view mag dit pad omzeilen.
|
||||
|
||||
## 3. SSRF
|
||||
@@ -51,11 +53,13 @@ Resterend risico: klassieke DNS rebinding tussen resolutie en socketconnectie. P
|
||||
|
||||
## 5. E-mail
|
||||
|
||||
- dedicated mailbox;
|
||||
- een dedicated mailbox per platform;
|
||||
- attachments worden genegeerd;
|
||||
- message identity voorkomt dubbele verwerking;
|
||||
- platformgebonden import accepteert alleen gelabelde HTTPS-links op het expliciet gekozen jobboarddomein;
|
||||
- externe tracking-, account-, help-, privacy- en uitschrijflinks worden niet als vacature opgeslagen;
|
||||
- links worden niet automatisch gevolgd tenzij later door bronpolicy goedgekeurd;
|
||||
- mailboxcredentials alleen environment/secret;
|
||||
- mailbox-app-wachtwoorden versleuteld in de database met een afzonderlijke, roteerbare environmentkey;
|
||||
- raw mail korte retentie;
|
||||
- log geen volledige onderwerp/body wanneer daarin PII kan staan.
|
||||
|
||||
|
||||
@@ -47,8 +47,10 @@ Voor e-mail:
|
||||
|
||||
1. MIME decode zonder attachments;
|
||||
2. linkextractie met unsubscribe/privacyfilter;
|
||||
3. platformalias bewaren;
|
||||
4. oorspronkelijke werkgever proberen te resolveren in een aparte begrensde taak.
|
||||
3. bij een platformmailbox uitsluitend gelabelde HTTPS-links op het gekozen jobboarddomein aanvaarden;
|
||||
4. externe tracking-, account-, help-, privacy- en uitschrijflinks verwerpen;
|
||||
5. platformalias en provenance bewaren;
|
||||
6. oorspronkelijke werkgever proberen te resolveren in een aparte begrensde taak.
|
||||
|
||||
## 3. Minimumvelden
|
||||
|
||||
@@ -153,8 +155,20 @@ Automatisch herstel mag veilige selectorvarianten proberen, maar nieuwe logica m
|
||||
| SmartRecruiters | `*.smartrecruiters.com` | gespecialiseerd listing+detail parser | geen interne API-auth nodig; stop bij CAPTCHA/anti-bot | 30 requests/min per domein |
|
||||
| Workable | `apply.workable.com` | gespecialiseerd listing+detail parser | alleen publieke vacaturepagina/JSON; geen private endpoints | 30 requests/min per domein |
|
||||
|
||||
Gedeelde ATS-hosts zijn geen bronidentiteit: meerdere werkgevers mogen hetzelfde providerdomein gebruiken zolang iedere bron een unieke publieke `base_url` heeft. De scheduler blijft per origin coördineren, zodat deze extra bronrecords de providerlimiet niet omzeilen.
|
||||
|
||||
Voor Corda Campus is een begrensde regionale listingadapter beschikbaar. Die leest uitsluitend de expliciete `/jobs/`-kaarten, bewaart de vermelde werkgever en weigert iedere joblink buiten `cordacampus.com`. Vacaturedetail en sollicitatie-URL's worden niet automatisch gevolgd.
|
||||
|
||||
Voor elke provider-adapter:
|
||||
- `supports()` kijkt eerst op host/marker om andere pagina's niet te matchen;
|
||||
- listingpayloads produceren kandidaten zonder fetch van detail;
|
||||
- detailpayloads vullen een enkele vacaturestructuur;
|
||||
- elke veldafklaring krijgt veld-evidence met method-labels en confidence.
|
||||
|
||||
## Regionale Mol-adapter (VR-126)
|
||||
|
||||
`MolRegionEmployerAdapter` verwerkt uitsluitend vijf vooraf gereviewde HTTPS-lijstroutes rond postcode 2400: SCK CEN, Cipal Schaubroeck, VanRoey, NTX/Netropolix en Thomas More. De adapter doet geen netwerkrequests en accepteert alleen same-host vacaturelinks. Cipal, NTX en Thomas More vereisen een expliciete lokale marker; bij Thomas More wordt bovendien de vaste publieke werkgever-GUID gecontroleerd. VanRoey-detailpaden zijn door robots uitgesloten en worden daarom nooit door VacatureRadar gefetcht; alleen de toegestane overzichtspagina dient als bron.
|
||||
|
||||
## Kempen-werkgeversadapter (VR-201)
|
||||
|
||||
`KempenEmployerAdapter` voegt zeven gereviewde werkgeversroutes toe voor Ziekenhuis Geel, lokaal bestuur Geel, Stad Turnhout, Group Renotec, Ravago, Sanofi en DAF Trucks Westerlo. Iedere route heeft een vaste HTTPS-host en een toegestaan lijstpad; vacaturelinks moeten same-host zijn. Voor gedeelde of landelijke lijsten blijft alleen een kaart met de expliciete gereviewde vestiging over. Gemeente Mol wordt via de officiële same-host RSS-feed verwerkt. Interessante werkgevers zonder stabiele fail-closed parser blijven als niet-scanbare waaklijstbron zichtbaar.
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
- Status: accepted
|
||||
- Datum: 2026-07-20
|
||||
- Aangevuld door: ADR-0009
|
||||
|
||||
## Context
|
||||
|
||||
@@ -9,11 +10,16 @@ Vacatureplatformen bieden nuttige zoekalgoritmes en alerts, terwijl directe scra
|
||||
|
||||
## Besluit
|
||||
|
||||
Gebruik een dedicated IMAP-mailbox en idempotente MIME/linkextractie. Bewaar platformlinks als bronalias. Volg een link alleen wanneer bronpolicy dat later toestaat; probeer bij voorkeur een oorspronkelijke werkgeverspagina te vinden.
|
||||
Gebruik per vacatureplatform een dedicated IMAP-mailbox en idempotente MIME/linkextractie. Iedere mailbox heeft een eigen interval en kan vanuit de bronpagina afzonderlijk worden gepauzeerd of ingepland. Bewaar platformlinks als bronalias. Volg een link alleen wanneer bronpolicy dat later toestaat; probeer bij voorkeur een oorspronkelijke werkgeverspagina te vinden.
|
||||
|
||||
De gereviewde mailboxcatalogus omvat VDAB, Indeed, LinkedIn, ictjob.be, Jobat, StepStone, Careerjet, Randstad en Robert Half. De gebruiker activeert de officiële jobalert zelf. VacatureRadar logt alleen in op het opgegeven mailboxaccount, beperkt extractie tot gelabelde HTTPS-links op het gekozen platformdomein en gebruikt geen jobboardaccount, zoekbot of directe crawl. Expliciet Brusselse nicheboards zijn in VR-125 uit de configureerbare catalogus verwijderd omdat ze buiten de regionale productscope vallen.
|
||||
|
||||
Voor VDAB bestaan twee officiële routes. Door de gebruiker ingestelde [jobalerts](https://www.vdab.be/jobs/job-alerts) mogen onmiddellijk via deze mailboxingang worden verwerkt. De [VDAB Vacature API](https://extranet.vdab.be/api-center-excellence-coe/vacatures-ophalen-met-de-vacatures-api) mag pas als fetchbron worden geactiveerd nadat VDAB het partnership heeft goedgekeurd en de samenwerkingsovereenkomst en credentials beschikbaar zijn. Deze ADR staat geen scraping of gebruik van een verborgen/onbevoegd endpoint toe.
|
||||
|
||||
## Gevolgen
|
||||
|
||||
- gebruiker stelt alerts eenmalig in;
|
||||
- parser moet variërende e-mailsjablonen verdragen;
|
||||
- dedicated mailbox en retentie nodig;
|
||||
- parser moet variërende e-mailsjablonen verdragen en een onbekende wijziging fail-closed als geen herkenbare vacaturelink behandelen;
|
||||
- batches en berichtgrootte zijn begrensd en één fout bericht stopt de rest niet;
|
||||
- dedicated mailbox per platform en retentie nodig;
|
||||
- geen platformcredentials in VacatureRadar.
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# ADR-0009 — Versleutelde platformmailboxen in de applicatie
|
||||
|
||||
- Status: accepted
|
||||
- Datum: 2026-07-22
|
||||
|
||||
## Context
|
||||
|
||||
Alerts van VDAB, Indeed, LinkedIn en andere gereviewde jobboards komen in verschillende mailboxaccounts binnen en moeten vaker dan eenmaal per dag verwerkt kunnen worden. Alleen globale environmentcredentials bieden geen bruikbare beheerflow in het platform. Mailbox-app-wachtwoorden zijn secrets en mogen niet leesbaar in de database, logs, taakresultaten of HTML terechtkomen.
|
||||
|
||||
## Besluit
|
||||
|
||||
- Bewaar één gebruikersgescopeerde `MailboxConnection` per vacatureplatform.
|
||||
- Ondersteun Gmail, Outlook / Microsoft 365 en een gecontroleerde aangepaste publieke IMAP-host, uitsluitend via IMAP over TLS.
|
||||
- Versleutel app-wachtwoorden met Fernet/MultiFernet en een afzonderlijke `MAILBOX_CREDENTIAL_KEYS`-sleutellijst. De eerste sleutel versleutelt; volgende sleutels zijn alleen voor decryptie tijdens rotatie.
|
||||
- Laat de scheduler elke vijf minuten verschuldigde mailboxen selecteren. Iedere mailbox kiest zelf 5, 15, 30, 60, 180 of 360 minuten.
|
||||
- Gebruik een databaselease per mailbox, idempotentie per mailbox + Message-ID en foutisolatie per mailbox/bericht.
|
||||
- Alle UI-mutaties zijn login-, user-scope- en CSRF-beveiligd. Het wachtwoordveld wordt nooit opnieuw gevuld.
|
||||
- Valideer de IMAP-host als publieke host voor de verbinding. Platformlinks uit mail worden niet automatisch gevolgd.
|
||||
|
||||
## Sleutelrotatie
|
||||
|
||||
1. Voeg de nieuwe sleutel vóór de oude toe aan `MAILBOX_CREDENTIAL_KEYS`.
|
||||
2. Herstart web, worker en scheduler.
|
||||
3. Draai `python manage.py rotate_mailbox_credentials`.
|
||||
4. Verwijder de oude sleutel pas nadat de opdracht slaagt en een mailboxsync is getest.
|
||||
|
||||
## Gevolgen
|
||||
|
||||
- `cryptography` is een productieafhankelijkheid en staat exact gepind in de lockfile.
|
||||
- Een databasedump bevat ciphertext en blijft gevoelig; de encryptiesleutel wordt apart in de secretstore/back-up bewaard.
|
||||
- Zonder expliciete sleutel is mailboxbeheer in productie fail-closed. Alleen DEBUG gebruikt een lokale sleutel afgeleid van de development `SECRET_KEY`.
|
||||
- Dit is een mailboxlogin, geen login bij een jobboard en geen toestemming voor directe platformfetch.
|
||||
@@ -6,6 +6,19 @@ Deze integratie vertaalt het Stitch-project **VacatureRadar Intelligence Cockpit
|
||||
|
||||
De volledige ontvangen referentie staat in `docs/design/stitch-reference/`. Deze map en de validatiescreenshots zijn uitgesloten van de productiecontainer via `.dockerignore`; er worden geen externe Tailwind-, font-, icoon-, afbeelding- of JavaScript-CDN's aan de applicatie toegevoegd.
|
||||
|
||||
## VR-119: compositie als primaire bron
|
||||
|
||||
Na productfeedback is de integratie aangescherpt: Stitch bepaalt nu niet alleen kleur, vorm en typografie, maar ook de dominante schermcompositie en informatiedichtheid. Alleen aantoonbaar onveilige of fictieve onderdelen worden vervangen door een functioneel equivalent met echte repositorydata.
|
||||
|
||||
- De utilitybar neemt de brede zoekbalk en directe profielactie over.
|
||||
- Het dashboard gebruikt een enkelkoloms matchfeed met vaste radar-/actierail; één resultaat blijft daardoor een volwaardig primair signaal.
|
||||
- De vacaturelijst toont een dichte intelligencefeed met de laatste gebruikersgescopeerde score via databaseannotaties.
|
||||
- Het detail combineert scorehero, drie echte kernmetingen, analyse en een vaste menselijke actierail.
|
||||
- Pipeline, profieleditor, bronkaarten en systeemtelemetrie volgen de Stitch-kolommen en panelhiërarchie.
|
||||
- Handmatige import blijft volledig beschikbaar, maar staat compact achter een disclosure zodat brongezondheid visueel voorrang krijgt.
|
||||
|
||||
De bedoelde “circa 90% Stitch” slaat hiermee op overgenomen visuele structuur en interactiehiërarchie, niet op het kopiëren van fictieve content, externe assets, auto-apply of routes waarvoor het domeinmodel geen betrouwbare data bezit.
|
||||
|
||||
## Visuele richting
|
||||
|
||||
- Donkere cockpit als standaard: diep marineblauw, tonale panelen, fijne slate-randen, signaalcyaan voor primaire interactie, emerald voor aantoonbaar gezonde status en koraal/amber voor fouten of aandacht.
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# VR-119 browservalidatie
|
||||
|
||||
Datum: 2026-07-21
|
||||
|
||||
## Scope
|
||||
|
||||
De tweede Stitch-pass is gecontroleerd tegen dashboard, vacaturelijst, vacaturedetail, sollicitatiepipeline, profieloverzicht/editor, bronnen en systeemstatus met de lokale `visualtest`-fixture. Alle weergegeven cijfers en acties kwamen uit de lokale Django-database; er is geen fictieve frontenddata toegevoegd.
|
||||
|
||||
## Resultaten
|
||||
|
||||
- Dashboardmatrix geslaagd op 1440×900, 1280×800, 1024×768, 768×1024, 390×844 en 360×800.
|
||||
- Iedere gecontroleerde kernroute had exact één `h1`, zichtbare inhoud en geen pagina-brede horizontale overflow.
|
||||
- De pipeline gebruikt bewust een intern horizontaal scrollgebied voor zes statuskolommen; de pagina zelf overflowt niet.
|
||||
- Mobiele navigatie opent op 390×844, verplaatst focus naar de drawer en houdt de pagina binnen de viewport.
|
||||
- Dark en light renderen met dezelfde informatiehiërarchie; de themawissel gaf geen consolefout.
|
||||
- Externe vacaturelinks behouden `noopener`; er werden geen browserconsolefouten gevonden.
|
||||
- Lokale CSS, JavaScript, iconsprite en favicon laden zonder externe productie-assets.
|
||||
|
||||
## Bewijs
|
||||
|
||||
Nieuwe screenshots gebruiken het prefix `vr119-` in deze map. De oudere VR-118-screenshots blijven bewaard als visuele voor/na-historie.
|
||||
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 103 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 72 KiB |
@@ -76,7 +76,7 @@ Een hersteltest is pas geslaagd wanneer:
|
||||
- een score en digest kunnen worden aangemaakt;
|
||||
- geen live mailbox of bron onbedoeld wordt gepolld in de testomgeving.
|
||||
|
||||
Gebruik in een hersteltest `IMAP_ENABLED=0`, `CELERY_TASK_ALWAYS_EAGER=1`, consolemail en geen live source polling.
|
||||
Pauzeer in een hersteltest alle `MailboxConnection`-records, gebruik `CELERY_TASK_ALWAYS_EAGER=1`, consolemail en geen live source polling. Bewaar `MAILBOX_CREDENTIAL_KEYS` afzonderlijk van de databaseback-up; zonder minstens één bijbehorende sleutel zijn opgeslagen app-wachtwoorden niet herstelbaar.
|
||||
|
||||
## Verwijdering en privacy
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# Geodata import voor Belgische locaties
|
||||
|
||||
Deze module gebruikt lokaal beheerde postcode/gemeentedata om locatiecoördinaten te kunnen afleiden.
|
||||
De actuele lokale keuze is GeoNames Postal Codes BE, versie 2026-04-03 onder CC BY 4.0. Bron,
|
||||
checksums, reviewdatum en steekproef staan in `config-data/geodata/README.local.md`.
|
||||
|
||||
## CLI
|
||||
|
||||
@@ -34,3 +36,9 @@ python manage.py import_geodata <pad-naar-geodata.csv> \
|
||||
## Fallback
|
||||
|
||||
Zonder geïmporteerde geodata blijft afstandsafleiding op "onbekend".
|
||||
|
||||
## Nauwkeurigheid en privacy
|
||||
|
||||
Een postcodepunt is een geschat centrum en geen routeafstand of exact adres. VacatureRadar bewaart
|
||||
voor het thuisprofiel alleen de ingevoerde postcode en het bijbehorende lookup-punt. De dataset bevat
|
||||
geen namen, adressen, contactgegevens of andere persoonsgegevens.
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# Livebroncatalogus
|
||||
|
||||
Reviewdatum: 2026-07-22
|
||||
Review vervalt: uiterlijk 2026-10-20
|
||||
|
||||
Deze catalogus bevat alleen publieke vacaturepagina's, officiële RSS-feeds en gedocumenteerde publieke ATS-feeds. Iedere actieve bron gebruikt uitsluitend `GET`, passeert bronbeleid, robotscontrole, TLS-controle en SSRF-validatie en benadert geen sollicitatie- of kandidaatendpoint.
|
||||
|
||||
## Regionale scope
|
||||
|
||||
Het actieve profiel gebruikt **postcode 2400**, gemeente **Mol**, en een maximale straal van **40 km**. Op 2026-07-22 is de officiële Belgische GeoNames-postcodedataset van 2026-04-03 lokaal geladen onder CC BY 4.0. Postcode 2400 is daarmee opgelost naar het benaderende postcodecentrum **51.1919, 5.1166**. Afstanden zijn bruikbaar voor regionale filtering, maar blijven indicatief omdat een postcodecentrum geen exact adres is.
|
||||
|
||||
## Actieve werkgeversbronnen
|
||||
|
||||
| Bron | Regionale reden en publieke ingang | Parser | Livevalidatie |
|
||||
|---|---|---|---|
|
||||
| Gemeente Mol | Mol; [officiële RSS-feed](https://jobs.gemeentemol.be/rss/vacatures.rss) | `rss` | 4 vacatures; twee geslaagde cycli, idempotent. |
|
||||
| VITO | Mol; [eigen jobsite](https://jobs.vito.be/l/nl) | `ats-recruitee` | Bestaande bron; twee geslaagde cycli. |
|
||||
| SCK CEN | Mol; [eigen vacaturelijst](https://www.sckcen.be/nl/carriere/vacatures) | `regional-mol-employers` | 6 kaarten; twee geslaagde cycli. |
|
||||
| Ziekenhuis Geel | Geel; [eigen vacaturelijst](https://ziekenhuisgeel.careersite.be/nl/vacatures) | `regional-kempen-employers` | 14 kaarten; twee geslaagde cycli. |
|
||||
| Lokaal bestuur Geel | Geel; [eigen jobsite](https://geel.hro.be/) | `regional-kempen-employers` | 2 kaarten; twee geslaagde cycli. |
|
||||
| Group Renotec | Geel; [publieke vacaturelijst](https://jobs.renotec.be/) | `regional-kempen-employers` | 7 expliciet Geelse kaarten; twee geslaagde cycli. |
|
||||
| Ravago | Arendonk/Olen; [publieke vacaturelijst](https://ravago.softgarden.io/en/vacancies) | `regional-kempen-employers` | 22 regionale kaarten; twee geslaagde cycli. |
|
||||
| Sanofi | Geel; [Belgische carrièrepagina](https://jobs.sanofi.com/en/belgium) | `regional-kempen-employers` | 1 expliciet Geelse kaart; twee geslaagde cycli. |
|
||||
| DAF Trucks | Westerlo; [publieke vacaturelijst](https://www.daf.be/nl-be/over-daf/werken-bij-daf-trucks/vacatures) | `regional-kempen-employers` | 1 expliciet Westerlose kaart; twee geslaagde cycli. |
|
||||
| Cipal Schaubroeck | Westerlo/Geel; [publieke werkgeverlijst](https://cipalschaubroeck.teamtailor.com/jobs) | `regional-mol-employers` | 12 regionale kaarten; tweede cyclus correct als HTTP 304. |
|
||||
| VanRoey | Turnhout/Geel; [eigen IT-vacaturelijst](https://www.vanroey.be/en/job-overview/) | `regional-mol-employers` | 23 kaarten; twee geslaagde cycli. |
|
||||
| NTX (Netropolix) | Geel; [publieke werkgeverpagina](https://netropolix.recruitee.com/) | `regional-mol-employers` | 2 Geelse kaarten; twee geslaagde cycli. |
|
||||
| Thomas More | Geel/Turnhout/Vorselaar; [publieke vacaturelijst](https://jobpage.cvwarehouse.com/?companyGuid=eab9ca13-ee10-4504-8a87-a785d0b037ef&lang=nl-BE) | `regional-mol-employers` | 5 regionale kaarten; twee geslaagde cycli. |
|
||||
| Stad Turnhout | Turnhout; [eigen jobsite](https://jobs.turnhout.be/) | `regional-kempen-employers` | 2 kaarten; twee geslaagde cycli. |
|
||||
| Universiteit Hasselt | Hasselt/Diepenbeek; [eigen vacaturelijst](https://www.uhasselt.be/vacatures) | `regional-local-employers` | 10 kaarten; twee geslaagde cycli. |
|
||||
| Hogeschool PXL | Hasselt/Diepenbeek; [publieke jobsite](https://ses.pxl.be/) | `regional-local-employers` | 15 kaarten; twee geslaagde cycli. |
|
||||
| Ziekenhuis Oost-Limburg | Genk/Lanaken/Maaseik; [publieke jobsite](https://ziekenhuis-oost-limburg.cvw.io/?lang=nl-BE) | `regional-local-employers` | 63 kaarten; twee geslaagde cycli. |
|
||||
| Corda Campus werkgevers | Hasselt; [publieke Corda-joblijst](https://www.cordacampus.com/jobs/) | `regional-corda-campus` | Bestaande bron; twee geslaagde cycli. |
|
||||
| RPM Europe Logistics NV | Genk; [publieke carrièrepagina](https://rpmeuropelogisticsnv.recruitee.com/) | `ats-recruitee` | Bestaande bron; twee geslaagde cycli. |
|
||||
| ACA Group | Hasselt; [eigen vacaturelijst](https://acagroup.be/en/jobs) | `regional-local-employers` | 10 kaarten; twee geslaagde cycli. |
|
||||
| Xplore Group | Hasselt; [eigen vacaturelijst](https://www.xploregroup.be/en/jobs) | `regional-local-employers` | 13 Hasselt-kaarten; twee geslaagde cycli. |
|
||||
|
||||
De Kempen-adapter accepteert uitsluitend zeven vooraf gereviewde HTTPS-host/padcombinaties en same-host detail-URL's. Hij bewaart per werkgever alleen kaarten waarvan de gepubliceerde locatie binnen de afgesproken regionale vestiging valt. Gemeente Mol gebruikt een officiële RSS-feed en heeft daarom geen maatwerkparser nodig. Geen adapter benadert login-, message-, apply- of kandidaatendpoints.
|
||||
|
||||
## Werkgeverswaaklijst
|
||||
|
||||
Interessante regionale werkgevers zonder voldoende stabiele, publiek verifieerbare automatische ingang staan zichtbaar in de applicatiewaaklijst. Ze worden niet door bulk- of geplande scans meegenomen. Dat omvat ook werkgevers die bij de review geen lokale vacature open hadden.
|
||||
|
||||
| Werkgever | Regio | Observatie op 2026-07-22 |
|
||||
|---|---|---|
|
||||
| Johnson & Johnson | Beerse | Actuele Belgische rollen; publieke lijst geeft een challenge/403, zonder omzeiling. |
|
||||
| Nike European Logistics Campus | Laakdal | Actuele distributierollen; globale dynamische joblijst nog niet fail-closed regionaal parseerbaar. |
|
||||
| AZ Turnhout | Turnhout | Actuele rollen; gedeelde dynamische CVWarehouse-lijst vraagt extra werkgever- en locatiefiltering. |
|
||||
| Cartamundi | Turnhout | Interessante productie- en ondersteuningswerkgever; geen stabiele lokale publieke lijst bewezen. |
|
||||
| Nyrstar | Balen/Pelt | Grote regionale industriële werkgever; geen actuele lokale vacature bevestigd. |
|
||||
| Aurubis | Olen | Grote regionale werkgever; momenteel vooral spontane sollicitatie, geen regelmatige lokale vacaturelijst bevestigd. |
|
||||
| Estée Lauder | Oevel/Westerlo | Grote regionale productievestiging; geen actuele lokale rol bevestigd. |
|
||||
| Soudal | Turnhout | Grote regionale werkgever met eigen carrièreplatform; regionale route nog niet stabiel genoeg bewezen. |
|
||||
| H.Essers | Tessenderlo | Logistieke werkgever met eigen jobsite; vestigingsfilter nog te herreviewen. |
|
||||
| Cegeka | Hasselt | Relevante IT-werkgever; locatie is niet betrouwbaar aan elke kaart gekoppeld. |
|
||||
| IOK / IOK Afvalbeheer | Kempen | Regionale publieke werkgever; geen stabiele vacaturefeed bewezen. |
|
||||
| Jessa Ziekenhuis | Hasselt | Eigen jobs en jobmails; gedeeld ATS vereist nog fail-closed werkgeverafbakening. |
|
||||
|
||||
## Uitgeschakeld wegens buiten regio
|
||||
|
||||
Deliverect (Gent), YPTO, adesso Belgium, Monizze, Qover, SFEIR Belgium en ARHS Belgium zijn uitgeschakeld en uit het normale bronoverzicht verborgen. Historische documenten, vacature-aliassen en provenance blijven bewaard. Dit is geen denylistbeslissing: de bronnen zijn technisch toegestaan, maar vallen buiten de ingestelde regionale productscope.
|
||||
|
||||
## Jobboards via officiële jobalerts
|
||||
|
||||
Brede jobboards worden niet rechtstreeks gecrawld. De gebruiker activeert zelf een officiële alert en koppelt per platform een afzonderlijke mailbox. Ondersteund zijn VDAB, Indeed, LinkedIn, ictjob.be, Jobat, StepStone, Careerjet, Randstad en Robert Half. De parser accepteert per koppeling uitsluitend gelabelde HTTPS-links op het gekozen jobboarddomein en verwerpt externe tracking-, account-, privacy- en uitschrijflinks. Alle negen domeingroepen staan op de directe-fetchdenylist; loginbot, CAPTCHA-omzeiling, verborgen endpoints en jobboardscraping blijven uitgesloten.
|
||||
|
||||
De officiële [VDAB Vacature API](https://extranet.vdab.be/api-center-excellence-coe/vacatures-ophalen-met-de-vacatures-api) blijft een mogelijke rechtstreekse synchronisatieroute, maar vereist goedkeuring, partnership en een samenwerkingsovereenkomst. Zonder die externe toelating wordt geen API-client geactiveerd.
|
||||
|
||||
## TLS en herreview
|
||||
|
||||
Gemeente Mol en Ziekenhuis Geel hebben op 2026-07-22 met de applicatie-CA-bundel een geldige TLS-keten en antwoordden beide met HTTP 200. De eerdere fout kwam door een verouderde lokale Windows-certificaatketen, niet door het uitschakelen van certificaatcontrole. VacatureRadar gebruikt expliciet de gepinde `certifi`-bundel en voert nooit `verify=False` uit.
|
||||
|
||||
Uiterlijk 2026-10-20 controleert de beheerder opnieuw vacaturepagina's, robotsregels, responsevormen, regionale scope en twee proefcycli. Bij voorwaardenwijziging, parserdrift, onverwachte volumestijging, ontbrekende locatie of redirect naar een ander domein gaat de bron terug naar `trial`, `paused` of quarantaine; verlopen reviews blokkeren fail-closed.
|
||||
@@ -56,11 +56,23 @@ celery -A config inspect reserved
|
||||
|
||||
## IMAP-import stopt
|
||||
|
||||
1. Zet `IMAP_ENABLED=0` om lockout of herhaalde fouten te beperken.
|
||||
2. Controleer host, poort, TLS, mailboxnaam en app-password.
|
||||
3. Verifieer dat de mailbox niet is hernoemd en het account niet is vergrendeld.
|
||||
4. Test eerst read-only met `IMAP_MARK_SEEN=0`.
|
||||
5. Een reeds verwerkte mail is idempotent via message identity; verwijder geen `EmailMessageRecord` om opnieuw te proberen zonder analyse.
|
||||
1. Pauzeer alleen de falende platformmailbox op de bronpagina; andere mailboxen blijven werken.
|
||||
2. Controleer provider, publieke IMAP-host, poort 993, mailboxmap, account en app-wachtwoord.
|
||||
3. Verifieer dat `MAILBOX_CREDENTIAL_KEYS` aanwezig is en dat bij een rotatie de oude sleutel nog achter de nieuwe staat.
|
||||
4. Verifieer dat de mailbox niet is hernoemd en het account niet is vergrendeld.
|
||||
5. Alle polls selecteren de mailbox read-only; een reeds verwerkte mail is per mailbox idempotent via message identity.
|
||||
6. Controleer het gekozen interval en `next_poll_at`; de scheduler zoekt iedere vijf minuten naar verschuldigde koppelingen.
|
||||
7. Controleer `IMAP_MAX_MESSAGES_PER_POLL` en `IMAP_MAX_MESSAGE_BYTES`. Vergroot die niet om een onverwacht groot of verdacht bericht blind te verwerken.
|
||||
8. Controleer bij een leeg resultaat of het jobboardmailformaat nog gelabelde HTTPS-vacaturelinks op het gekozen platformdomein bevat; versoepel de domeinfilter niet zonder fixture en securitytest.
|
||||
9. Activeer de mailbox opnieuw, kies **Nu synchroniseren** en controleer `last_success_at`. Verwijder geen `EmailMessageRecord` om zonder analyse te herhalen.
|
||||
|
||||
## Mailboxsleutel roteren
|
||||
|
||||
1. Maak een nieuwe Fernet-sleutel en zet die als eerste in `MAILBOX_CREDENTIAL_KEYS`; behoud de oude sleutel erachter.
|
||||
2. Herstart web, worker en scheduler zodat alle processen dezelfde sleutellijst gebruiken.
|
||||
3. Draai `python manage.py rotate_mailbox_credentials`.
|
||||
4. Synchroniseer één mailbox en controleer dat geen ciphertext, app-wachtwoord of volledige mailpayload in logs staat.
|
||||
5. Verwijder daarna de oude sleutel en herstart opnieuw.
|
||||
|
||||
## Digest ontbreekt of dubbel
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Bron onboarden
|
||||
|
||||
De actueel gereviewde werkgeverfeeds, proefresultaten en dekkingsgrenzen staan in [`LIVE_SOURCE_CATALOG.md`](LIVE_SOURCE_CATALOG.md). `config-data/seed_sources.yaml` installeert uitsluitend de daar vastgelegde bronnen en verbergt de oude fixturebron uit het normale overzicht.
|
||||
|
||||
Een nieuwe bron wordt nooit direct als onbeperkt actief beschouwd. Gebruik het traject **candidate → trial → active** en ga bij veiligheids- of kwaliteitsproblemen naar **quarantined**.
|
||||
|
||||
## Toegestane broncategorieën
|
||||
@@ -144,3 +146,21 @@ Voor het onboarden van publieke ATS-bronnen moet het bronrecord minimaal een van
|
||||
- Workable (`apply.workable.com`) — max 30 requests/min, alleen publieke vacaturepagina/feeds.
|
||||
|
||||
Bij twijfel altijd op `review` blijven en eerst via een trialrun met gesloten evaluatiecriteria (gesloten job, lege joblijst, markeringswijziging) valideren.
|
||||
|
||||
Meerdere werkgevers kunnen dezelfde ATS-host gebruiken. Registreer ze als afzonderlijke bronnen met een unieke exacte publieke `base_url`; gebruik het providerdomein nooit als werkgeveridentiteit. Rate limiting en leases blijven per origin gedeeld, dus laat opeenvolgende liveproeven op Lever of SmartRecruiters het ingestelde minimuminterval respecteren.
|
||||
|
||||
## Brede jobboards via platformmailboxen
|
||||
|
||||
VDAB, Indeed, LinkedIn, ictjob.be, Jobat, StepStone, Careerjet, Randstad en Robert Half blijven directe-fetchdenylistbronnen. Activeer op het jobboard zelf een officiële vacaturealert en koppel op de bronpagina per platform een afzonderlijke Gmail-, Outlook- of aangepaste IMAP-mailbox. Kies per mailbox een interval van 5 tot 360 minuten; de scheduler pakt alleen verschuldigde actieve koppelingen. De parser houdt per koppeling uitsluitend gelabelde HTTPS-links op het gekozen jobboarddomein over. Zonder mailboxcredentials gebruikt de beheerder handmatige URL- of tekstimport; dit is geen reden om platformpagina's automatisch te crawlen.
|
||||
|
||||
`seed_sources` ondersteunt daarnaast `retire_source_urls`. Zo wordt een bron die buiten de gekozen regio valt uitgeschakeld en uit het normale bronoverzicht verborgen, terwijl eerdere documenten, vacature-aliassen en provenance behouden blijven. Gebruik dit mechanisme voor een regionale koerswijziging; verwijder bronhistoriek niet handmatig.
|
||||
|
||||
Voor de Mol-regio geldt postcode 2400 met een straal van 40 km als cataloguscentrum. Leg per werkgever een expliciete gemeentemarker vast en behandel een ontbrekende concrete vacaturelocatie als onbekend. De `regional-mol-employers`-parser mag uitsluitend de vijf gereviewde routes uit de livecatalogus verwerken; een nieuwe host, pad, CVWarehouse-GUID of vestiging vereist eerst een nieuwe fixture, securitytest en bronreview.
|
||||
|
||||
De aanvullende `regional-kempen-employers`-parser volgt dezelfde regel voor zeven exacte routes: Ziekenhuis Geel, lokaal bestuur Geel, Stad Turnhout, Renotec, Ravago, Sanofi en DAF Trucks Westerlo. Gemeente Mol gebruikt de officiële RSS-route. Controleer bij landelijke of gedeelde joblijsten dat iedere kaart de gereviewde gemeente expliciet noemt; een onduidelijke locatie wordt niet stil aan een vestiging toegewezen.
|
||||
|
||||
Gebruik `metadata.watchlist: true` voor een interessante regionale werkgever die momenteel geen vacature heeft of nog geen stabiele publieke listing heeft. Zo'n bron staat op `paused`, verschijnt afzonderlijk in de UI en wordt niet door bulkacties of de scheduler gescand. Activeer hem pas na een nieuwe voorwaardenreview, fixture, negatieve host/padtest en twee geslaagde trialcycli.
|
||||
|
||||
Een mailboxkoppeling vraagt alleen IMAP-gegevens. VacatureRadar vraagt of bewaart geen LinkedIn-, ictjob-, Jobat-, StepStone- of ander jobboardwachtwoord en activeert alerts niet automatisch. Wanneer een jobboard zijn mailformaat wijzigt en geen herkenbare platformlink resteert, werk dan eerst een gesaneerde fixture en parsertest bij.
|
||||
|
||||
VDAB documenteert daarnaast een officiële Vacature API voor het ophalen en synchroniseren van vacatures. Registreer die pas als nieuwe adapter/brontype nadat VDAB het partnership schriftelijk heeft goedgekeurd, de samenwerkingsovereenkomst rond is en testcredentials beschikbaar zijn. Publieke developerportal-documentatie alleen is geen toestemming om de API te gebruiken.
|
||||
|
||||
@@ -103,25 +103,30 @@ Wanneer een proxy op hetzelfde Docker-netwerk draait, publiceer poort 1226 allee
|
||||
|
||||
## Mailbox
|
||||
|
||||
Gebruik een aparte mailbox of alias, niet de hoofdmailbox. Begin met:
|
||||
Gebruik per vacatureplatform een aparte mailbox of alias, niet de hoofdmailbox. Genereer eerst buiten Git een Fernet-sleutel:
|
||||
|
||||
```dotenv
|
||||
IMAP_ENABLED=0
|
||||
IMAP_MARK_SEEN=0
|
||||
```bash
|
||||
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||
```
|
||||
|
||||
Na een succesvolle fixture- en read-onlytest:
|
||||
Plaats de uitvoer uitsluitend in de Unraid-secretconfiguratie:
|
||||
|
||||
```dotenv
|
||||
IMAP_ENABLED=1
|
||||
IMAP_HOST=<host>
|
||||
IMAP_USER=<account>
|
||||
IMAP_PASSWORD=<app-password>
|
||||
IMAP_MAILBOX=INBOX
|
||||
IMAP_USE_SSL=1
|
||||
MAILBOX_CREDENTIAL_KEYS=<fernet-key>
|
||||
IMAP_CONNECT_TIMEOUT_SECONDS=15
|
||||
IMAP_MAX_MESSAGES_PER_POLL=200
|
||||
IMAP_MAX_MESSAGE_BYTES=1000000
|
||||
```
|
||||
|
||||
Het account heeft alleen mailboxrechten nodig. Gebruik waar beschikbaar een app-password en schakel interactieve login op die mailbox niet uit zolang herstel nodig is.
|
||||
Herstart web, worker en scheduler. Open daarna **Bronnen → Platformmailboxen** en koppel ieder gewenst platform afzonderlijk: VDAB, Indeed, LinkedIn, ictjob.be, Jobat, StepStone, Careerjet, Randstad of Robert Half. Kies Gmail, Outlook / Microsoft 365 of een aangepaste publieke IMAP-host, gebruik een app-wachtwoord en laat `INBOX` geselecteerd tenzij de alert naar een aparte map wordt gefilterd. De scheduler controleert iedere vijf minuten welke mailbox volgens haar eigen interval verschuldigd is.
|
||||
|
||||
Voor sleutelrotatie zet je `nieuwe-sleutel,oude-sleutel` in `MAILBOX_CREDENTIAL_KEYS`, herstart je de processen en draai je:
|
||||
|
||||
```bash
|
||||
python manage.py rotate_mailbox_credentials
|
||||
```
|
||||
|
||||
Verwijder de oude sleutel pas na een geslaagde sync. Een rollback van migratie `0005` verwijdert de mailboxkoppelingen; maak daarom eerst een versleutelde databaseback-up en pauzeer de scheduler.
|
||||
|
||||
## Ollama
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ Django/Celery
|
||||
| T-09 | MIME/HTML-bom of malformed mail | resource-uitputting/parsercrash | IMAPbatchlimiet, bodylimiet bij vervolgtaak, robuuste parser, idempotente recordidentiteit | `VR-115`, e-mailfixtures |
|
||||
| T-10 | Cross-user objecttoegang | lek van sollicitaties/feedback | LoginRequired, user-scoped querysets/get_or_create, autorisatietests | integratie-viewtests |
|
||||
| T-11 | CSRF op feedback/profiel | ongewenste status- of profielmutatie | Django CSRF-middleware, POST-only acties, SameSitecookies | viewtests en frameworkcheck |
|
||||
| T-12 | Credentiallek in Git/logs | account- of infrastructuurcompromis | env-only secrets, gitignore, beperkte logs, voorbeeldwaarden, secretrotatierunbook | CI-secret scan gepland `VR-115`; review |
|
||||
| T-12 | Credentiallek in Git/logs/database/UI | account- of infrastructuurcompromis | app-wachtwoorden met MultiFernet en afzonderlijke environmentkey versleuteld; nooit terugtonen; generieke fouttekst; gitignore, secretrotatierunbook | `tests/unit/test_mailbox_credentials.py`, `tests/integration/test_mailbox_connections.py`, CI-secret scan `VR-115` |
|
||||
| T-13 | Onveilige reverse proxy | sessie over HTTP, host-header-/originproblemen | TLS, exact ALLOWED_HOSTS/CSRF origins, secure cookies, proxychecklist | deployment smoke-test |
|
||||
| T-14 | Redis als waarheid behandeld | dataverlies/dubbele verwerking | PostgreSQL-state, idempotente taken/outbox, acks-late | integratietests |
|
||||
| T-15 | Dubbele Celery-uitvoering | dubbele vacatures/mails | unieke keys, transacties, message identity, outbox-uniciteit | pipeline/digesttests |
|
||||
@@ -73,6 +73,13 @@ Django/Celery
|
||||
| T-31 | Sollicitatiedossier-export bevat niet-gewenste payload | data-lek of onbedoeld dossieroverdragen | export bevat alleen het gekozen dossier, ZIP-inhoud is beperkt tot snapshot/tijdlijn/print-HTML, bestandsnaam is geslugified zonder padseparators | `tests/integration/test_applications.py` |
|
||||
| T-32 | XML external entity/entity-expansion via sitemap | lokale data-uitlezing of parseruitputting | sitemap-XML wordt met `defusedxml` verwerkt; fetcherlimieten blijven vóór parsing gelden | `tests/unit/test_discovery_rss.py`, Ruff securitycheck |
|
||||
| T-33 | Externe UI-CDN of niet-vertrouwde Stitch-interactie | supply-chain-XSS, tracking of acties buiten Django-beleid | productie gebruikt alleen lokale CSS/JS en inline SVG-symbolen; Stitch-code is documentatiereferentie, alle mutaties blijven Django POST+CSRF; themavoorkeur bevat geen persoonsgegevens en opslagfouten worden afgevangen | `tests/e2e/test_vr114_browser_and_accessibility.py`, browserconsole- en assetcontrole VR-118 |
|
||||
| T-34 | Publieke ATS-feed of robotsredirect wijzigt van host/identiteit | SSRF, verkeerd werkgeverslabel, ongewenst sollicitatie-endpoint of voortgezet fetchen na voorwaardenwijziging | iedere robotsredirect wordt opnieuw als publieke URL gevalideerd; feeds gebruiken alleen gereviewde GET-endpoints; werkgeveridentiteit komt uit source-config; reviews verlopen fail-closed en apply-endpoints zijn geen fetchbron | `tests/security/test_robots.py`, `tests/integration/test_pipeline.py`, `tests/unit/test_ats_adapters.py`, `VR-120` |
|
||||
| T-35 | Regionale vacaturehub bevat een gemanipuleerde off-domain kaart of gedeelde ATS-host overschrijft een andere werkgever | phishinglink, foutieve herkomst, verlies van bronbeleid of verkeerde inventaris | regionale adapter accepteert alleen same-host `/job/`-links; bronuniciteit gebruikt type + exacte publieke base-URL; per-origin lease en minimuminterval blijven over alle ATS-tenants gedeeld | `tests/unit/test_regional_adapters.py`, `tests/unit/test_source_models.py`, `tests/integration/test_seed_sources.py`, `VR-121` |
|
||||
| T-36 | Kwaadaardige/oversized platformmail of linkinjectie in een jobalert | parseruitputting, batchuitval, phishing, foutieve vacatures of verborgen scraping | IMAP-batch is begrensd; foutisolatie en idempotente identity per mailbox; platformparser accepteert alleen gelabelde HTTPS-links op het gekozen jobboarddomein en verwerpt externe/adminlinks; alle brede jobboards blijven op de directe-fetchdenylist | `tests/integration/test_email_import_notifications.py`, `tests/unit/test_email_adapter.py`, `tests/security/test_policy.py`, `VR-122/123/124/125` |
|
||||
| T-37 | Lokale werkgeverslijst wijzigt markup, injecteert een externe kaart of vermengt functies buiten de regionale scope | phishing, foutieve locatie, te brede radar of onbetrouwbare ranking | lokale adapter is beperkt tot vijf gereviewde host/padcombinaties, accepteert alleen same-host details en past waar beschikbaar een expliciete Hasselt-filter toe; retire-seeding schakelt buitenregionale bronnen uit zonder provenance te wissen | `tests/unit/test_regional_adapters.py`, `tests/integration/test_seed_sources.py`, `VR-125` |
|
||||
| T-38 | Cross-user mailboxbeheer, dubbele polls of IMAP naar private host | credentialmisbruik, duplicaten, toegang tot interne diensten | alle views scopen op gebruiker en vereisen CSRF; unieke user+platformkoppeling; transactionele lease; hostvorm en publieke DNS/IP-validatie vóór TLS-IMAP | `tests/integration/test_mailbox_connections.py`, `tests/unit/test_mailbox_credentials.py`, `apps/sources/services/imap_import.py`, `VR-123` |
|
||||
| T-39 | Mol-/Kempenbron vermengt een andere werkgever, campus of vestiging | foutieve afstand, phishing of buitenregionale resultaten | exacte HTTPS-host/pad/GUID-routes; same-host details; expliciete plaatsfilters voor regionale en gedeelde lijsten; postcodecentra blijven als benadering herkenbaar; waaklijstbronnen worden niet gescand | `tests/unit/test_regional_adapters.py`, `tests/integration/test_tasks_and_more_views.py`, `VR-126/201` |
|
||||
| T-40 | Verouderde lokale CA-store of ongeldige serverketen lokt een TLS-bypass uit | onderschepte vacature- of mailboxdata en credentialdiefstal | expliciet gepinde `certifi`-CA-bundel voor HTTP, robots en IMAP; hostnaamcontrole en `CERT_REQUIRED`; nooit `verify=False`; dependency- en negatieve TLS-tests bij update | `tests/unit/test_tls.py`, `tests/security/test_robots.py`, `apps/sources/services/tls.py`, `VR-201` |
|
||||
|
||||
## Misbruikscenario's
|
||||
|
||||
@@ -86,7 +93,7 @@ De redirectlocatie wordt opnieuw gevalideerd. Het request naar het private adres
|
||||
|
||||
### E-mailalert bevat een platformlink en uitschrijflink
|
||||
|
||||
De adapter herkent vacaturekandidaten, negeert bekende unsubscribepatronen en slaat de platformlink hoogstens als alias op. Automatisch volgen vereist opnieuw een toegestane source policy; denylistplatformen worden geweigerd.
|
||||
De adapter gebruikt de gekozen platformidentiteit, accepteert alleen gelabelde HTTPS-links op dat jobboarddomein en negeert externe tracking-, account-, privacy- en uitschrijflinks. De platformlink wordt hoogstens als alias opgeslagen. Automatisch volgen vereist opnieuw een toegestane source policy; denylistplatformen worden geweigerd.
|
||||
|
||||
### Aanvaller laat scheduler dezelfde job herhalen
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ Legenda: **I** = geïmplementeerd en getest in de huidige MVP; **P** = gedeeltel
|
||||
| PR-013 | I | `url_security.py`, redirectfetcher | security URL/fetchtests | VR-115 transporthardening |
|
||||
| PR-014 | I | `fetcher.py` | `test_fetcher.py` | — |
|
||||
| PR-015 | I | `SourceLease`, `SourceOriginState`, `apps/sources/services/scheduling.py`, `apps/sources/tasks.py` | `test_scheduling.py`, `test_fetcher.py`, `test_tasks_and_more_views.py` | `VR-103` afgerond |
|
||||
| PR-016 | I | `email_import.py`, recordmodel | e-mailintegratietests | — |
|
||||
| PR-016 | I | `email_import.py`, `MailboxConnection`, versleutelde platformmailboxservice en gereviewde jobboardcatalogus | e-mail- en mailboxintegratietests | VR-123/124 |
|
||||
| PR-017 | I | candidate/status + basisdiscovery | `apps/sources/services/discovery.py`, `tests/unit/test_discovery_rss.py`, `tests/integration/test_discovery_command.py`, `tests/integration/test_tasks_and_more_views.py` | VR-101/102 |
|
||||
| PR-018 | I | `apps/sources/services/health.py`, `apps/sources/tasks.py` | `tests/integration/test_source_health.py` | VR-112 |
|
||||
| PR-020 | I | `JsonLdJobPostingAdapter` | JSON-LD-tests/fixtures | — |
|
||||
@@ -39,8 +39,8 @@ Legenda: **I** = geïmplementeerd en getest in de huidige MVP; **P** = gedeeltel
|
||||
| PR-044 | I | profiel/modelversievelden | scoring/profiletests | VR-109 promptversie |
|
||||
| PR-045 | I | optionele Ollamaservice/fallback | `test_ai.py` | VR-109 |
|
||||
| PR-046 | I | geen tools + guardrails | AI/securitytests | VR-109/115 evaluaties |
|
||||
| PR-050 | I | dashboard view/template + Stitch-cockpitshell | viewtests, VR-118 browsermatrix | VR-114/118 e2e/a11y |
|
||||
| PR-051 | I | detailview/template/provenance + intelligence-layout | viewtests, VR-118 screenshots | VR-114/118 |
|
||||
| PR-050 | I | dashboard view/template + Stitch-dominante cockpitshell/feed/rail | viewtests, VR-119 browsermatrix | VR-114/118/119 e2e/a11y |
|
||||
| PR-051 | I | detailview/template/provenance + scorehero/intelligence-strip | viewtests, VR-119 screenshots | VR-114/118/119 |
|
||||
| PR-052 | I | feedbackendpoint/UI | feedback/viewtests | — |
|
||||
| PR-053 | I | applicationmodel/serviceflow | `tests/integration/test_dedupe_lifecycle_feedback.py`, `tests/integration/test_applications.py` | VR-113 uitgebreid dossier |
|
||||
| PR-054 | I | `notifications/models.py`, outbox/services/tasks | `tests/integration/test_email_import_notifications.py`, `tests/integration/test_reminders.py` | VR-111 |
|
||||
@@ -63,7 +63,7 @@ Legenda: **I** = geïmplementeerd en getest in de huidige MVP; **P** = gedeeltel
|
||||
| NFR-005 | I | domeinapps/services/adapters/ADRs | continue review |
|
||||
| NFR-006 | I | offline pytest + coveragegate | VR-114 verbreedt e2e |
|
||||
| NFR-007 | P | `scripts/benchmark.py`, `tests/benchmark/test_benchmark.py` | VR-116 |
|
||||
| NFR-008 | I | semantische templates/designspec, zes viewports, dark/light en toetsenbordmenu | `tests/e2e/test_vr114_browser_and_accessibility.py`, `docs/design/validation/`, VR-118 |
|
||||
| NFR-008 | I | semantische Stitch-dominante templates, zes viewports, dark/light en toetsenbordmenu | `tests/e2e/test_vr114_browser_and_accessibility.py`, `docs/design/validation/`, VR-118/119 |
|
||||
| NFR-009 | I | lokale SQLite en Docker/Unraidconfig, release-smoke en restore | VR-117 afgerond |
|
||||
| NFR-010 | I | `apps/sources/services/health.py`, `apps/sources/tasks.py`, `apps/core/views.py`, `config/settings.py` | `tests/integration/test_source_health.py` | VR-112 observability |
|
||||
|
||||
@@ -88,5 +88,15 @@ Iedere backlogtaak die een requirement wijzigt, werkt in dezelfde commit deze ma
|
||||
- VR-107 is gerealiseerd met `apps/sources/views.py`, `apps/sources/services/manual_import.py`, `templates/sources/list.html`, `static/js/manual_import.js` en bijhorende unit/integration-tests.
|
||||
- VR-115 is afgerond met productie-hardening voor `config/settings.py`, DNS-rebindmitigatie in `apps/sources/services/fetcher.py`, rate limiting op login en handmatige import, CI-secret- en kwetsbaarheidsscans, non-root/read-only containerhardening en bijbehorende security/unit/integration-tests.
|
||||
- VR-118 vertaalt de aangeleverde Stitch Intelligence Cockpit naar de bestaande server-rendered routes. Bewijs staat in `docs/design/STITCH_INTEGRATION_PLAN.md`, `docs/design/validation/`, de view/a11ytests en de gedeelde lokale shell/assets.
|
||||
- VR-119 herwerkt die vertaling na productfeedback zodat de Stitch-schermcompositie, feeddichtheid en hoofd-/zijpanelhiërarchie dominant zijn. Bewijs staat in `docs/design/validation/VR-119_REPORT.md`, de `vr119-*.png`-screenshots en de uitgebreide HTML/a11ytest.
|
||||
- VR-120 vereenvoudigt thuislocatie tot postcode, vervangt JSON-/tekstinvoer door begeleide checkboxes en levert twee gereviewde livewerkgeverfeeds. Bewijs staat in `docs/operations/LIVE_SOURCE_CATALOG.md`, de profiel-/adapter-/pipelinetests en de bronruns in de lokale database.
|
||||
- VR-121 breidt de catalogus uit tot tien livebronnen, ondersteunt meerdere werkgeverfeeds op gedeelde ATS-hosts, voegt een begrensde Corda Campus-adapter toe en houdt VDAB/Indeed uitsluitend op de bestaande veilige e-mail-/handmatige ingress. Bewijs staat in `docs/operations/LIVE_SOURCE_CATALOG.md`, de bronmigratie en de regionale/ATS/seedtests.
|
||||
- VR-122 operationaliseert de veilige platformingress als dagelijkse, configureerbare en begrensde mailboxpoll. VDAB-alerts krijgen expliciete provenance, replay blijft idempotent en de bronpagina onderscheidt de werkende jobalertroute van de contractueel afgeschermde officiële Vacature API. Bewijs staat in de e-mailadapter-/importtests, `apps/sources/services/imap_import.py` en ADR-0005.
|
||||
- VR-123 vervangt die globale poll door gebruikersgescopeerde VDAB- en Indeed-mailboxkoppelingen met versleutelde app-wachtwoorden, afzonderlijke intervallen, per-mailboxleases en UI-beheer. Bewijs staat in `tests/unit/test_mailbox_credentials.py`, `tests/integration/test_mailbox_connections.py`, de migratie en ADR-0009.
|
||||
- VR-124 breidt dezelfde mailboxingang uit met LinkedIn, ictjob.be, Jobat, StepStone, EuroBrussels en BrusselsJobs. De platformgebonden parser accepteert uitsluitend gelabelde HTTPS-links op het gekozen jobboarddomein; fixtures, adapter-/integratietests en de centrale denylist bewijzen de afscherming.
|
||||
- VR-125 vervangt de twee Brusselse nicheboards door Careerjet, Randstad en Robert Half, retireert buitenregionale werkgevers zonder provenanceverlies en voegt host- en padgebonden adapters toe voor ACA Group, Xplore Group, UHasselt, PXL en ZOL in de kern Hasselt-Genk.
|
||||
- VR-126 herankert profiel en broncatalogus op postcode 2400 Mol en 40 km. De host-, pad- en locatiefilters voor SCK CEN, Cipal Schaubroeck, VanRoey, NTX en Thomas More worden gedekt door regionale adaptertests, source-viewtests, live bronruns en de bijgewerkte threat T-39.
|
||||
- VR-201 activeert Gemeente Mol en zeven bijkomende Kempen-werkgevers na menselijke voorwaardenreview, fixtures, fail-closed locatie-/routefilters en twee livecycli. Twaalf interessante werkgevers zonder stabiele actieve ingang staan afzonderlijk en niet-scanbaar op de UI-waaklijst. Bewijs staat in de livecatalogus, seeddata, `KempenEmployerAdapter`, bronruns en adapter-/seed-/viewtests.
|
||||
- VR-205 laadt de officiële Belgische GeoNames-postcodedataset 2026-04-03 onder CC BY 4.0, documenteert bron- en afgeleide checksums en lost 2400 Mol op naar het benaderende postcodecentrum. Bewijs staat in `config-data/geodata/README.local.md`, het importlog, geocodingtests en de opnieuw berekende profiel-vacaturescores.
|
||||
|
||||
|
||||
|
||||