This commit is contained in:
+47
-1
@@ -1,6 +1,6 @@
|
||||
schema_version: 1
|
||||
project: VacatureRadar
|
||||
updated_at: '2026-07-28'
|
||||
updated_at: '2026-07-29'
|
||||
execution_policy:
|
||||
order: file-order, then first ready task whose dependencies are done
|
||||
no_product_questions: true
|
||||
@@ -2283,3 +2283,49 @@ tasks:
|
||||
note: README verdiept tot een klikbare user-first productreis met negen actuele beelden op 1920x1080 en 390x844
|
||||
in dark/light; alle routes zonder overflow of consolewaarschuwingen. VR-225-lint en Windows-modusassertie
|
||||
hersteld; 296 tests groen, 2 skips en 83,44% dekking.
|
||||
- id: VR-227
|
||||
title: Professionaliseer VacatureRadar integraal voor release 0.3.13
|
||||
status: done
|
||||
priority: P0
|
||||
requirement_ids:
|
||||
- NFR-001
|
||||
- NFR-006
|
||||
- NFR-007
|
||||
- NFR-008
|
||||
- NFR-009
|
||||
- NFR-010
|
||||
depends_on:
|
||||
- VR-226
|
||||
summary: Voer de integrale responsive, UX-, accessibility-, performance-, observability-, security- en operationsroadmap
|
||||
uit en vervang optionele browsercontrole door een verplichte releasegate.
|
||||
acceptance_criteria:
|
||||
- Hoofdcontent en topbar delen een gecentreerd adaptief frame; gastbanner, sticky elementen en pipeline blijven
|
||||
bruikbaar van 390 tot 3440 px zonder documentoverflow.
|
||||
- De vacatureflow is begrensd gepagineerd, globale zoekcopy is eerlijk, mobiel pipelinegebruik is verticaal en
|
||||
demomutaties veroorzaken geen controlmuur.
|
||||
- Playwright Chromium draait verplicht in CI op zes viewports, faalt op console/page errors en controleert focus,
|
||||
kernreis en documentoverflow zonder skips.
|
||||
- Automatisering toont een echte worker/beat-heartbeat en markeert niet-meetbare queuediepte eerlijk; benchmarkparserdekking
|
||||
is volledig en reproduceerbaar.
|
||||
- Baseline, performance, architectuur, operations, testing, traceability, externe acties en finale acceptance
|
||||
zijn actueel en de volledige repositorygate slaagt.
|
||||
verification:
|
||||
- python -m scripts.benchmark --quick --skip-performance --json
|
||||
- python -m pytest tests/e2e/test_vr114_browser_and_accessibility.py
|
||||
- python -m pytest tests/unit/test_runtime_observability.py tests/unit/test_generic_html_adapter.py
|
||||
- docker compose config
|
||||
- ./scripts/codex_verify.sh
|
||||
primary_paths:
|
||||
- static/css/
|
||||
- static/js/app.js
|
||||
- templates/base.html
|
||||
- apps/core/services/automation.py
|
||||
- apps/core/tasks.py
|
||||
- tests/e2e/test_vr114_browser_and_accessibility.py
|
||||
- docs/audit/
|
||||
- USER_INPUT_REQUIRED.md
|
||||
result:
|
||||
completed_at: '2026-07-29'
|
||||
note: Release 0.3.13 professionaliseert responsive layout, mobiele gastflow, begrensde vacature-UX, verplichte
|
||||
zes-viewport-Playwrightgate zonder skips, echte runtimeheartbeat, parserbenchmark, authdekking, SBOM en integrale
|
||||
documentatie; volledige gate 312 tests groen, 84,16% dekking.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Projectstatus
|
||||
|
||||
- Laatst bijgewerkt: 2026-07-28
|
||||
- Repositoryversie: 0.3.12 productie- en reverse-proxyhardening
|
||||
- Laatst bijgewerkt: 2026-07-29
|
||||
- Repositoryversie: 0.3.13 integrale professionalisering
|
||||
- Uitvoeringsmodus: autonome backlog
|
||||
- Eerste uitvoerbare taak: controleer met `python scripts/backlog.py next`
|
||||
|
||||
@@ -21,6 +21,18 @@ De repository bevat een uitvoerbare Django-MVP met:
|
||||
|
||||
## Laatste productiehardening
|
||||
|
||||
VR-227 op 2026-07-29:
|
||||
|
||||
- globaal contentframe en topbar zijn gecentreerd tot ultrawide; de gastbanner staat in de normale hoofdflow en de mobiele pipeline is verticaal;
|
||||
- vacaturepaginering is begrensd tot twintig resultaten, zoekscope is eerlijk en recente zoektermen blijven lokaal tot vijf items beperkt;
|
||||
- Playwright Chromium is een verplichte CI-gate op zes viewports en faalt op focusverlies, overflow, console- en page-errors; de volledige gebruikersreis draait zonder skips;
|
||||
- cachegebaseerde worker/beat-heartbeat vervangt de vroegere ongemeten runtimeclaim; onbekende queuediepte blijft expliciet onbekend;
|
||||
- generieke HTML-extractie ondersteunt publicatiedatum en dienstverband; benchmarkkwaliteitsrun behaalt 12/12 velden, precision/recall 1,0 en nul rankingchurn;
|
||||
- authbackenddekking bedraagt 97%, Entra 86% en totale branch-aware dekking 84,16%; volledige gate groen met 312 tests, 0 failures en 0 skips;
|
||||
- CI genereert een CycloneDX-SBOM. Docker kon lokaal niet worden uitgevoerd omdat de binary ontbreekt; live en externe restpunten staan uitsluitend in `USER_INPUT_REQUIRED.md`.
|
||||
|
||||
Volgende uitvoerbare taak: geen na afronding van VR-227.
|
||||
|
||||
VR-225 op 2026-07-27:
|
||||
|
||||
- `PUBLIC_BASE_URL` stuurt publieke host-, origin- en HTTPS-instellingen aan en voorkomt de gemelde `DisallowedHost` achter Nginx Proxy Manager;
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# Professionalisering baseline
|
||||
|
||||
- Datum: 2026-07-29
|
||||
- Branch: `main`
|
||||
- Versie: 0.3.12
|
||||
- Opdracht: volledige autonome professionalisering van VacatureRadar
|
||||
|
||||
## Architectuur
|
||||
|
||||
VacatureRadar is een Django 5.2 server-rendered modulaire monoliet op Python 3.13. PostgreSQL is de productiedatabase; Redis ondersteunt cache, gedeelde rate limiting en Celery. Een afzonderlijke worker en scheduler verwerken bronruns, lifecycle en notificaties. Externe bronnen lopen via policy-, robots-, TLS- en SSRF-validatie en adapters leveren genormaliseerde extractieresultaten zonder databasewrites.
|
||||
|
||||
De frontend bestaat uit Django-templates, lokale CSS en beperkte lokale JavaScript. Er is geen clientframework of externe runtimeasset. Authenticatie ondersteunt lokale accounts, een optionele Entra-boundary en een server-side alleen-lezen gastdemo.
|
||||
|
||||
## Baselinevalidatie
|
||||
|
||||
`./scripts/codex_verify.sh` start schoon: Ruff, Django system check en migratiecheck slagen. De bestaande suite bevat 298 tests. In de laatst volledig afgeronde gate slaagden 296 tests en werden twee browsercases overgeslagen omdat Playwright lokaal niet geïnstalleerd was; branch-aware dekking bedroeg 83,44%.
|
||||
|
||||
CI voert lint, tests, secret scanning, dependency scanning, een productie-imagebuild en containerscan uit. De browserdependency wordt wel gesynchroniseerd, maar Chromium wordt nog niet geïnstalleerd en de E2E-test staat omgevingsafhankelijke skips toe.
|
||||
|
||||
## Werkende onderdelen
|
||||
|
||||
- Negen functionele hoofdschermen, login en wachtwoordherstel.
|
||||
- Deterministische relevantie, scoring, dedupe en lifecycle vóór optionele AI.
|
||||
- Read-only gastdemo met server-side mutatiebescherming.
|
||||
- Bronbeleid, sanitization, SSRF-, TLS- en redirectbescherming.
|
||||
- Docker-, Unraid-, reverse-proxy-, health-, back-up- en restorevoorzieningen.
|
||||
- Dark/light theme, toetsenbordfocus, reduced-motionbasis en mobiele hoofdnavigatie.
|
||||
|
||||
## Belangrijkste risico's bij start
|
||||
|
||||
1. De premium CSS overschrijft het gecentreerde layoutcontract met links verankerde content. Op 3440 px blijft ongeveer 900 px ongebruikte ruimte rechts.
|
||||
2. De gastbanner begint mobiel boven de vaste topbar en is daardoor gedeeltelijk onzichtbaar.
|
||||
3. Verplichte browser- en accessibilitytests kunnen stilzwijgend skippen.
|
||||
4. De vacatureverkenner rendert een zeer lange resultaatpagina; selectie- en scrollcontext zijn beperkt.
|
||||
5. Bronnen en automatisering tonen veel operationele controls en informatie tegelijk.
|
||||
6. Kritieke dekking is relatief laag in auth, Entra, core views en task orchestration.
|
||||
7. Enkele modules zijn groter dan de repositoryrichtlijn en combineren meerdere verantwoordelijkheden.
|
||||
8. Live TLS-, reverse-proxy-, worker-, scheduler-, back-up- en restoreacceptatie blijft doelomgevingafhankelijk.
|
||||
|
||||
## Eerste uitvoeringsvolgorde
|
||||
|
||||
1. Responsive layout en gastbanner.
|
||||
2. Niet-skipbare browser-/accessibilitymatrix.
|
||||
3. Dagelijkse kernflows en taakgerichte schermcomposities.
|
||||
4. Kritieke tests, observability, container/security en herstelvalidatie.
|
||||
5. Integrale eindacceptatie en live restpunten.
|
||||
@@ -0,0 +1,18 @@
|
||||
# Finale acceptance 0.3.13
|
||||
|
||||
Status: lokaal geaccepteerd; live externe acties blijven afzonderlijk geregistreerd.
|
||||
|
||||
## Bewijs
|
||||
|
||||
- `./scripts/codex_verify.sh`: geslaagd.
|
||||
- Tests: 312 geslaagd, 0 mislukt, 0 overgeslagen, 1 niet-blokkerende waarschuwing.
|
||||
- Branch-aware coverage: 84,16%.
|
||||
- Playwright: zes viewports van 390×844 tot 3440×1200, volledige kernreis, reduced motion, focus, console/page errors en documentoverflow geslaagd.
|
||||
- Benchmarkkwaliteitsrun: 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en rankingchurn 0,0.
|
||||
- Django system check en migratiecheck: schoon.
|
||||
- Repository-, YAML-, ledger- en dependencyconsistentie: schoon; `pip check` meldt geen gebroken dependencies.
|
||||
- Docker/compose-runtime: niet uitgevoerd omdat de lokale omgeving geen Dockerbinary bevat. Composebestanden blijven regressiegedekt en CI bouwt, scant en produceert een CycloneDX-SBOM.
|
||||
|
||||
## Uitkomst
|
||||
|
||||
Er bestaan geen bekende lokale P0- of P1-blokkers. Live TLS/proxy, productie-restore en optionele externe identity/mailintegraties worden uitsluitend overgenomen uit `USER_INPUT_REQUIRED.md`; lokale validatie wordt niet als live bewijs gepresenteerd.
|
||||
@@ -0,0 +1,26 @@
|
||||
# Performanceaudit 2026-07-29
|
||||
|
||||
## Baseline
|
||||
|
||||
- Lokale quickbenchmark: 250 invoeritems op Windows 11, Python 3.13, 16 CPU-threads.
|
||||
- Import: p50 348,879 ms; p95 825,107 ms; totaal 125.982,74 ms.
|
||||
- Dashboardlijst: p95 1.128,986 ms in de synthetische benchmark.
|
||||
- Detail: p95 101,754 ms.
|
||||
- Rescore: 53,284 ms voor de overgebleven unieke job in deze quickrun.
|
||||
- Piekgeheugen: 105,588 MB.
|
||||
- Frontend: lokale CSS en JavaScript, zonder framework of externe runtimeassets.
|
||||
|
||||
De eerste run ontdekte een echte benchmarkfout: de generieke HTML-fixture leverde slechts vier van zes verwachte velden. De adapter en fixture ondersteunen nu ook gelabelde publicatiedatum en dienstverband. De herhaalde kwaliteitsrun behaalt 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en nul rankingchurn.
|
||||
|
||||
## Wijzigingen
|
||||
|
||||
- Vacaturepaginering verlaagd van 30 naar 20 kaarten per pagina.
|
||||
- Ultrawideframe gecentreerd zonder extra clientcode.
|
||||
- Mobiele pipeline gebruikt een verticale grid en veroorzaakt geen horizontale documentoverflow.
|
||||
- Runtimeheartbeat gebruikt de bestaande cache en voegt geen netwerkprobe aan paginarendering toe.
|
||||
|
||||
## Resterende risico's
|
||||
|
||||
- De synthetische quickimport overschrijdt de historische NFR-007-p95-doelwaarde; profiling van het volledige 25.000-itempad blijft zinvol vóór opschaling.
|
||||
- De quickbenchmark meldt meer dan 7.900 databasequeries voor 250 importpogingen. Correctheid en idempotentie zijn goed, maar bulkimport is de eerstvolgende optimalisatiekandidaat.
|
||||
- Queuediepte is met de generieke Django-cachebackend niet betrouwbaar meetbaar en wordt daarom eerlijk als onbekend getoond.
|
||||
@@ -0,0 +1,15 @@
|
||||
# Professionaliseringstraceability
|
||||
|
||||
| Roadmaponderdeel | Implementatie | Bewijs | Status |
|
||||
|---|---|---|---|
|
||||
| Responsive frame | `premium.css`, `layout.css` | zes Playwrightviewports, overflowassertie | implemented and verified |
|
||||
| Mobiele gastbanner | `base.html`, `components.css` | integratietest en mobiele E2E | implemented and verified |
|
||||
| Sticky/mobiele pipeline | `responsive.css`, `premium.css` | mobiele kernreis | implemented and verified |
|
||||
| Verplichte browsergate | CI, E2E-suite | Chromiuminstallatie, console/page-errorchecks | implemented and verified |
|
||||
| Vacatureflow | `JobListView`, `jobs/list.html` | view- en E2E-tests | implemented and verified |
|
||||
| Zoekscope en recente termen | `base.html`, `app.js` | lokale, begrensde browseropslag | implemented and verified |
|
||||
| Democontrols | read-only middleware en responsive CSS | auth- en E2E-tests | implemented and verified |
|
||||
| Runtimeobservability | `apps/core/tasks.py`, automationservice | runtime-observabilitytests | implemented and verified |
|
||||
| Parser/performance | generic HTML-adapter en benchmarkfixture | benchmark 12/12, precision/recall 1,0 | implemented and verified |
|
||||
| Container/security | bestaande Docker/CI-hardening | compose-, config-, security- en containerscans | implemented, live verification pending |
|
||||
| Live TLS/restore/identity | scripts en runbooks | `USER_INPUT_REQUIRED.md` | externally blocked, implementation complete |
|
||||
@@ -84,6 +84,7 @@ Legenda: **I** = geïmplementeerd en getest in de huidige MVP; **P** = gedeeltel
|
||||
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-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 en `USER_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.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.
|
||||
|
||||
Reference in New Issue
Block a user