Files
VacatureRadar/docs/architecture/DATA_FLOW.md
Jens b8091e59bd
deploy / deploy (push) Canceled after 0s
Initial deploy setup
2026-07-21 14:00:00 +02:00

3.3 KiB

Dataflows en invarianten

Flow A — Publieke vacaturepagina

  1. Scheduler selecteert alleen allow + active/trial + due.
  2. Fetcher controleert policy, URL, DNS/IP, poort en iedere redirect.
  3. Response wordt begrensd op type/grootte en als RawDocument met korte retentie opgeslagen.
  4. Registry kiest RSS wanneer XML/feed, anders JSON-LD en daarna generieke HTML.
  5. ExtractedJob wordt gesanitized en genormaliseerd.
  6. Dedupe zoekt external ID, canonieke URL, canonieke key en conservatieve fuzzy kandidaat.
  7. Pipeline schrijft werkgever, vacature, alias, provenance en versie.
  8. Alle actieve profielen krijgen een nieuwe ScoreRun.
  9. SourceRun registreert metrics en plant volgende run.

Invarianten:

  • geen fetch zonder policy + URL-validatie;
  • één canonieke vacature per canonical key;
  • originele bronURL blijft als alias bewaard;
  • HTML in de UI is gesanitized;
  • verwerking van dezelfde broninhoud is idempotent.

Flow B — Vacaturemail

  1. IMAP-task haalt maximaal een begrensd aantal berichten op.
  2. message_identity gebruikt RFC Message-ID of SHA-256 fallback.
  3. Bestaand record stopt dubbele verwerking.
  4. Raw mail wordt tijdelijk opgeslagen.
  5. E-mailadapter extraheert alleen HTTP(S)-links en slaat unsubscribe/privacylinks over.
  6. Iedere link wordt als vacaturedraft verwerkt; denylistlink wordt niet automatisch gefetcht.
  7. Record bewaart linklijst, processedstatus en begrensde foutmelding.

Invarianten:

  • mailboxpassword staat alleen in environment/secrets;
  • geen attachmentverwerking in MVP;
  • e-mailtekst is data, geen AI-/agentinstructie;
  • duplicate Message-ID maakt geen extra vacaturesnapshot.

Flow C — Feedback en sollicitatie

  1. Authenticated user POST met CSRF.
  2. Actie wordt tegen enum gevalideerd.
  3. Feedback is append-only.
  4. applied maakt atomair één Application per user/job.
  5. Dossier krijgt vacaturesnapshot en standaard opvolgdatum.
  6. Externe verzending bestaat niet.

Invarianten:

  • user-scoped querysets voor dossierwijziging;
  • één dossier per user/job;
  • undo/verbergen is traceerbaar;
  • feedbackleren mag uitsluitend begrensde soft weights wijzigen.

Flow D — Dagelijkse digest

  1. Scheduler evalueert actieve profielen in hun tijdzone.
  2. Alleen binnen het 30-minutenvak rond digesttijd wordt een outbox gemaakt.
  3. Dedupe key is profiel + lokale datum.
  4. Selectie neemt laatste sterke/mogelijke score per actieve vacature, verborgen jobs uitgesloten.
  5. Template rendert tekst en HTML.
  6. Bij succes status sent; bij fout failed met begrensde foutcontext.

Invarianten:

  • maximaal één outbox per profiel/dag;
  • een reeds verzonden outbox wordt niet opnieuw verzonden;
  • geen recipient betekent skipped, geen crash;
  • digest bevat nooit raw HTML van vacaturebron.

Dataretentie

Data Standaard Reden
Raw publieke documenten 7 dagen parserdebug en provenance
Raw vacaturemail 7 dagen idempotentie/debug; daarna verwijderen
Canonieke vacature totdat verwijderd/retentiebeleid gebruikerswaarde en historie
JobVersion blijvend tenzij gebruiker wist wijzigingsaudit
ScoreRun configureerbaar, initieel blijvend uitlegbaarheid/modelvergelijking
Feedback/Application totdat gebruiker wist persoonlijke opvolging
Logs operationeel begrensd/geroteerd foutdiagnose zonder inhoud/secrets