83 lines
3.3 KiB
Markdown
83 lines
3.3 KiB
Markdown
# 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 |
|