18 KiB
Traceabilitymatrix
Legenda: I = geïmplementeerd en getest in de huidige MVP; P = gedeeltelijk/volgende backlogtaak; E = alleen externe productieconfiguratie of bronreview ontbreekt. Bestandsnamen verwijzen naar de primaire implementatie; aanvullende tests kunnen in dezelfde testdirectory staan.
Functionele requirements
| ID | Status | Primaire implementatie | Bewijs/tests | Vervolgtaak |
|---|---|---|---|---|
| PR-001 | I | profiles/models.py, forms/views |
test_profiles.py, test_views.py |
— |
| PR-002 | I | SearchProfile, begeleide skilltaxonomie, informatieve ervaringscontext, defaults/form en geocodeparser |
tests/unit/test_geocoding.py, tests/integration/test_profile_preferences.py, profiel- en viewtests |
VR-105/VR-207/VR-208 |
| PR-003 | I | ProfileRevision, profile services |
test_profiles.py |
— |
| PR-004 | I | begrensde feedbackservice/velden | tests/unit/test_feedback_learning.py, test_profiles.py |
VR-110 uitgevoerd |
| PR-005 | I | bootstrap_instance, defaults |
task/viewtests | — |
| PR-010 | I | sources/models.py |
test_source_models.py |
VR-112 breidt health uit |
| PR-011 | I | policy + fetch task | policy/fetch/tasktests | — |
| PR-012 | I | denylist, e-mailadapter | policy/e-mailtests | — |
| 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, 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 | — |
| PR-021 | I | HTML/RSS/e-mailadapters + apps/sources/adapters/ats.py + tests/unit/test_ats_adapters.py | adaptertests + tests/unit/test_ats_adapters.py | VR-106 afgerond |
| PR-022 | I | adapters/base.py |
contract via alle adaptertests | — |
| PR-023 | I | sanitize.py |
security sanitizationtests | — |
| PR-024 | I | ExtractedJob, CanonicalJobDraft, models |
pipeline/normalisatietests | — |
| PR-025 | I | JobVersion in pipeline |
dedupe/lifecycle-integratietest | — |
| PR-026 | I | RawDocument, apps/sources/tasks.py, config/settings.py |
tests/integration/test_source_health.py |
VR-112/115 operationaliseert |
| PR-027 | I | FieldProvenance |
pipeline-integratietests | — |
| PR-030 | I | dedupe.py |
dedupetests | — |
| PR-031 | I | conservatieve fuzzy dedupe | tests/unit/test_dedupe_lifecycle_feedback.py, scripts/benchmark.py, tests/benchmark/test_benchmark.py |
VR-116 benchmark |
| PR-032 | I | direct-sourcepreferentie/alias | pipeline- en dedupetests | VR-108 resolver |
| PR-033 | I | canonical constraints/transacties | replaytests | — |
| PR-040 | I | features/scoring + deterministische IT-relevantie vóór AI, inclusief contextgebonden fieldtitels | tests/unit/test_scoring.py, tests/unit/test_relevance.py, viewtests |
VR-206/VR-207 |
| PR-041 | I | scorecomponenten met begrensde skill-evidence; ervaring/senioriteit aantoonbaar zonder score-invloed | tests/unit/test_features_distance.py, tests/unit/test_scoring.py |
VR-105/VR-207/VR-208 |
| PR-042 | I | unknown/confidencegedrag | tests/unit/test_features_distance.py, tests/unit/test_scoring.py |
VR-105 |
| PR-043 | I | ScoreRun plus uitlegbare skillvraag-/dekkingsanalyse |
pipeline-/scoringtests, tests/unit/test_skill_demand.py |
VR-208 |
| 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/list/skillsradar + Stitch-dominante cockpitshell/feed/rail, schaalbaar widescreenframe en auditgedreven informatiedichtheid | viewtests, skill-insighttests, VR-119/206/208/222/223 browsermatrix | VR-114/118/119/206/208/222/223 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 |
| PR-055 | I | lifecycle service/task | lifecycletests | — |
| PR-056 | I | expliciete non-goal; geen submitcontract | AC-043 code review, ADR-0006 | — |
| PR-060 | I | health views/service | view/healthtests | — |
| PR-061 | I | apps/sources/services/health.py, apps/sources/tasks.py |
tests/integration/test_source_health.py |
VR-112 dashboard/metrics |
| PR-062 | I | scripts/release_verify.sh, scripts/release_smoke.py, docker-compose*.yml |
release-verificatie-smoke, configdiff en upgrade/rollbackartefacten |
VR-117 afgerond |
| PR-063 | I | AI standaard uit/fallback | volledige testset zonder Ollama | — |
| PR-064 | I | settings/env-example/gitignore | configreview en CI | VR-115 secretscan |
Niet-functionele requirements
| ID | Status | Bewijs | Vervolgtaak |
|---|---|---|---|
| NFR-001 | I | policy-, URL- en fetchersecuritytests plus publieke host-, proxyvertrouwen-, demo- en gedeelde rate-limit-hardening | tests/unit/test_fetcher.py, tests/unit/test_rate_limit.py, tests/unit/test_settings_security.py, tests/unit/test_public_configuration.py, tests/unit/test_network.py, tests/integration/test_auth_login.py, VR-225 |
| NFR-002 | P | raw-retentie, minimale modellen, privacyrunbooks | VR-113/115 |
| NFR-003 | I/P | replay-, mail- en outboxtests; per-bronfouten | VR-103/112 |
| NFR-004 | I | ScoreRun, provenance, skillvraag met expliciet veld-/tekstonderscheid en UI-copy | VR-109/208 uitgebreid evidence |
| NFR-005 | I | domeinapps/services/adapters/ADRs | continue review |
| NFR-006 | I | offline pytest + coveragegate, inclusief platformbewuste productieconfiguratietests | VR-114 e2e; tests/unit/test_public_configuration.py; VR-225/226 |
| NFR-007 | P | scripts/benchmark.py, tests/benchmark/test_benchmark.py |
VR-116 |
| NFR-008 | I | volledige negen-schermen-Stitch-cockpit, acht viewports, dark/light, toetsenborddrawer, premium visuele hiërarchie, zelfstandig VacatureRadar-productmerk, lokale ITWorx-ontwikkelaarscredit, toegankelijke interactieve radarillustratie en actuele user-first productdocumentatie | tests/e2e/test_vr114_browser_and_accessibility.py, tests/integration/test_intelligence_views.py, tests/integration/test_views.py, artifacts/visual-validation/, negen beelden in docs/screenshots/readme/, VR-209–224/226 |
| NFR-009 | I | lokale SQLite, configureerbare eigenaarbranding, Docker/Unraidconfig, publieke URL-helper, Nginx Proxy Manager-runbook, gevalideerde SSH-deployalias, release-smoke en restore | tests/unit/test_deployment_configuration.py, tests/unit/test_public_configuration.py, VR-117, VR-217/218/225 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 |
Systeemacceptatie
| Criteria | Status | Primair bewijs |
|---|---|---|
| AC-001–004 | I | bootstrap, auth/UI, e-mailingress zonder platformlogin |
| AC-010–015 | I | integration/security/adaptertests |
| AC-020–025 | I | normalisatie-, dedupe-, scoring- en AI-fallbacktests |
| AC-030–034 | I | notificatie- en lifecycletests |
| AC-040–043 | I | application/feedback/user-scopingtests en ADR-0006 |
| AC-050–054 | I | health/viewtests, verify-script, offline fixtures, coverage en ledger-validator |
| AC-055 | I | scripts/release_verify.sh met release-smoke en restore-compare |
Onderhoudsregel
Iedere backlogtaak die een requirement wijzigt, werkt in dezelfde commit deze matrix, relevante acceptatiecriteria en tests bij. Een status wordt alleen naar I gezet wanneer de code én het genoemde bewijs bestaan.
Aanvullende traceability-opmerking
-
VR-228 levert release 0.3.14 met een fail-closed disposable PostgreSQL-benchmark, run-lokale importcaches, gebundelde veldprovenance en ongewijzigde score-snapshotcopy. De officiële drie iteraties bewijzen 3.264 queries per 250 items, parser 12/12, dedupeprecision/recall 1,0 en nul rankingchurn; bewijs staat in
docs/audit/IMPORT_PERFORMANCE_*.mden het machineleesbare artifact. -
VR-227 professionaliseert release 0.3.13 integraal: gecentreerd ultrawideframe, mobiele gastbanner en verticale pipeline, begrensde vacaturepaginering, verplichte zes-viewport-Playwrightgate zonder skips, echte runtimeheartbeat, volledige generieke parserbenchmark en SBOM-generatie. Bewijs staat in
docs/audit/, de E2E-/auth-/runtime-/adaptertests enUSER_INPUT_REQUIRED.md. -
VR-102 is gerealiseerd met auditbare policyreviews (
SourcePolicyReview), robotscache met TTL/size/SSRF-controles en fail-closed policy-gating op verlopen of conflicterende reviews. -
VR-107 is gerealiseerd met
apps/sources/views.py,apps/sources/services/manual_import.py,templates/sources/list.html,static/js/manual_import.jsen bijhorende unit/integration-tests. -
VR-115 is afgerond met productie-hardening voor
config/settings.py, DNS-rebindmitigatie inapps/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, devr119-*.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.pyen 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-202 bewijst de productie-ingress met M365 app-only OAuth/XOAUTH2, een dedicated alias en map, negen platformconnecties, een idempotente live testmail, correcte schedulerstatus en een verzonden digest-outbox.
-
VR-204 bewijst de immutable releaseketen via de private Gitea-registry, digest-pin, commitlabel, SPDX-SBOM, checksums, release notes en een live Unraid pull-/rollback-/herstelsmoke.
-
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. -
VR-206 voegt een titelgestuurde IT-relevantiegrens vóór scoring/AI toe, maakt de persoonlijke radarselectie de standaard en benut Stitch-panelen dynamisch tot 2560 px. Bewijs staat in
apps/jobs/services/relevance.py, de score-/viewtests endocs/design/validation/VR-206_AUDIT.md. -
VR-207 breidt het profiel uit met gegroepeerde field-/infrastructuurrollen, cv-skills en een ervaringsband. Skill-evidence is op vier treffers begrensd, afwezigheid wordt niet als tekort gepresenteerd en ambigue fieldtitels vereisen een onafhankelijk IT-contextsignaal. Persoonlijke cv-waarden staan uitsluitend in de lokale gebruikersdatabase; repositorytests en documentatie blijven gesaneerd.
-
VR-208 maakt die ervaringsband uitsluitend informatief en verwijdert ook senioriteitsinvloed uit de AI-component en feedbacklearning. De gebruikersgescopeerde Skillsradar analyseert actuele niet-uitgesloten IT-vacatures van actieve bronnen, onderscheidt skillveldbewijs van tekstinferentie en toont profieldekking en mogelijke leerkansen met categorie-/dekkingsfilters.
-
VR-209–213 vervangen de volledige browserfrontend door de negen Stitch Intelligence Cockpit-composities. De nieuwe shell, dashboard/vacature-intelligence, pipeline/profiel/bronnen, automation/activiteit/werkgevers en responsive validatie zijn gekoppeld aan echte read models en serveracties. Bewijs staat in
docs/design/STITCH_INTEGRATION_REPORT.md, route-/scope-/querytests en de elf beelden onderartifacts/visual-validation/. -
VR-214 herstelt het ontbrekende Dockerman-tegelicoon met een lokale 256×256 PNG, een exact Unraid-poortlabel en een regressietest die URL, PNG-signatuur en afmetingen controleert.
-
VR-215 corrigeert het Dockerman-downloadcontract: het icoonlabel gebruikt een concrete loopback-URL omdat Dockerman placeholders alleen voor WebUI resolveert; live bewijs omvat de aangemaakte
VacatureRadar-icon.png-cache. -
VR-216 verfijnt de Stitch-cockpit naar “calm intelligence”: minder visuele ruis, selectief cyan, compactere mobiele KPI's, responsieve filters, intern scrollende pipeline en een CSP-veilige logininteractie.
-
VR-217 borgt de werkende Unraid-hostalias en afzonderlijke deploysleutel in een fail-fast releasehelper en voegt een lokale decoratieve radarillustratie met pointerrespons en reduced-motionfallback toe.
-
VR-218 verenigt favicon, login en shell onder één radarbeeldmerk, maakt de persoonlijke eigenaarssignatuur configureerbaar en voegt contextuele oriëntatie aan de bovenbalk toe zonder mobiele overflow.
-
VR-219 verankert alle hoofdsecties op één ultrawide grid, begrenst paneelverhoudingen voor leesbaarheid en maakt
Personal intelligence by Jenstot de consistente productlock-up op publieke en ingelogde schermen. -
VR-220 vervangt die tijdelijke tekstlock-up door de aangeleverde officiële ITWorx.tech-wordmark en een exact daaruit afgeleid cloud-check-appicoon voor browser, shell en Dockerman; VacatureRadar blijft de productnaam.
-
VR-221 corrigeert de merkarchitectuur: VacatureRadar krijgt een zelfstandig radar-/kansbeeldmerk voor alle productcontactpunten en ITWorx.tech blijft uitsluitend zichtbaar als officiële secundaire ontwikkelaarscredit.
-
VR-224 maakt de repository-ingang user-first: de README volgt de dagelijkse productflow, bevat gecontroleerde lokale quickstarts en gebruikt vier actuele dark/light- en desktop/mobielscreenshots zonder secrets of externe assets.
-
VR-225 hardent de publieke installatie met
PUBLIC_BASE_URL, exacte host/CSRF-afleiding, veilige proxy-HTTPS-detectie, vertrouwde client-IPchains, gedeelde Redis-rate-limiting, cache-readiness en een server-side alleen-lezen gastdemo. Bewijs staat in de productie-audit, Nginx-runbook en de settings-, network-, health-, auth- en deploymenttests. -
VR-226 verdiept de README tot een visuele productreis met negen actuele beelden op consistente desktop- en mobiele viewports. Dezelfde taak herstelt de VR-225-lintbaseline en maakt de POSIX-bestandsmodusassertie terecht platformafhankelijk.