Initial deploy setup
deploy / deploy (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-21 14:00:00 +02:00
commit b8091e59bd
285 changed files with 27854 additions and 0 deletions
+155
View File
@@ -0,0 +1,155 @@
# Autonoom uitvoeringsprotocol
Dit protocol is ontworpen voor Codex of een vergelijkbare code-agent die de uitgepakte repository als workspace heeft. Het doel is langdurig voortwerken zonder productvragen, terwijl security- en kwaliteitsgrenzen behouden blijven.
## Hoofdlus
```text
bootstrap/verify
→ selecteer eerste uitvoerbare ready taak
→ lees alleen gekoppelde specs/code/tests
→ schrijf of verfijn falende tests
→ implementeer kleinste complete oplossing
→ relevante tests + lint
→ docs/traceability/backlog/project state
→ volledige gate
→ markeer done
→ herhaal
```
Commando om de volgende taak te kiezen:
```bash
python scripts/backlog.py next
```
De selectie is deterministisch: bestandsvolgorde in `BACKLOG.yaml`, alleen `status: ready`, alle dependencies `done`.
## Geen productonderbrekingen
Vraag niet om bevestiging voor keuzes die in ADRs, productdefaults of backlogacceptatie staan. Bij een echt ontbrekend detail:
1. kies de veiligste;
2. kies de eenvoudigste;
3. kies een omkeerbare implementatie;
4. behoud bestaande contracts;
5. documenteer de aanname in taakresultaat of nieuwe ADR.
Voorbeelden:
- onbekende bron → `review`, niet fetch;
- ontbrekende locatie → `unknown`, niet gokken;
- AI niet beschikbaar → deterministische fallback;
- provider niet gekozen → interface + fixture + lokale importer, providerstap extern blokkeren;
- rijke frontend niet noodzakelijk → Django template/progressive enhancement.
## Externe blokkadeprocedure
Een credential, domein, live bronvoorwaardenreview, registry of gelicenseerde bulkdataset mag codewerk niet stoppen. Voor het taakdeel dat extern geblokkeerd is:
- implementeer configuratieschema en validatie;
- maak providerinterface;
- voeg fictieve fixtures/mocks toe;
- test succes, fout en disabled state;
- schrijf exact productiechecklistje;
- maak/gebruik een aparte `blocked-external` taak;
- ga onmiddellijk door met de volgende uitvoerbare taak.
Markeer nooit een volledige feature als geblokkeerd wanneer alleen de live configuratie ontbreekt.
## Werk per taak
### 1. Reconnaissance
- `python scripts/backlog.py show <ID>`
- lees requirement- en traceabilityregels;
- zoek bestaande services, modellen en tests;
- bevestig architectuurgrenzen;
- noteer regressierisico's.
Geen brede herschrijving zonder aantoonbare noodzaak.
### 2. Test-first waar zinvol
Voor bugs/securitygrenzen eerst een falende regressietest. Voor nieuwe functionaliteit minstens tests voor:
- normale input;
- lege/ontbrekende input;
- malformed/aanvallende input;
- replay/idempotentie;
- autorisatie/user-scoping;
- disabled/external dependency unavailable.
### 3. Implementatie
- pure logica in services;
- tasks alleen orchestration;
- adapters zonder writes;
- transacties rond meerdere afhankelijke writes;
- machineleesbare foutcategorieën;
- geen live internet in tests;
- geen secrets of persoonlijke voorbeelden.
### 4. Relevante verificatie
```bash
uv run ruff format .
uv run ruff check .
uv run pytest <relevante tests>
```
Herstel oorzaak, niet gate/drempel.
### 5. Overdracht in dezelfde wijziging
Werk bij:
- code en migraties;
- tests/fixtures;
- relevante product/architectuur/operationele docs;
- `TRACEABILITY_MATRIX.md`;
- `BACKLOG.yaml` resultaatstatus;
- `PROJECT_STATE.md`.
### 6. Volledige gate
```bash
./scripts/codex_verify.sh
```
Pas na een geslaagde gate:
```bash
python scripts/backlog.py set <ID> done --note "<concreet resultaat + tests>"
./scripts/codex_verify.sh
```
De tweede gate bewijst dat de ledgerwijziging zelf geldig is.
## Omgaan met onverwachte defecten
Een blocker in bestaande code die de geselecteerde taak verhindert, mag direct worden hersteld. Voeg een regressietest toe en vermeld het in het taakresultaat. Een los, niet-blokkerend defect krijgt een nieuwe taak met uniek ID alleen wanneer het niet veilig binnen de huidige scope past; wijzig de kernprioriteiten niet stilzwijgend.
## Stopcriteria
Stop de autonome lus alleen wanneer:
- geen uitvoerbare `ready` taak meer bestaat;
- alle resterende taken `blocked-external` of `deferred` zijn;
- de volledige kwaliteitsgate slaagt;
- `PROJECT_STATE.md` exact de resterende blokkades en productiechecklist noemt.
Stop niet alleen omdat één provider, secret of live bron ontbreekt.
## Eindrapport
Rapporteer:
- afgeronde taak-ID's;
- belangrijkste gedrag- en datamodelwijzigingen;
- migraties/configuratieimpact;
- tests en coverage;
- externe blokkades met exacte invulstap;
- eerste resterende taak of “geen uitvoerbare ready taak”.
Claim geen productieacceptatie zonder Docker/release-/restore-smoke wanneer die in de taakcriteria staat.
+1116
View File
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
# Optioneel voorbeeld voor een lokale Codex-configuratie.
# Bewaar echte machine-/accountinstellingen buiten de repository.
# De repository zelf geeft geen toestemming om buiten de workspace te schrijven
# of veiligheids-/approvalgrenzen te omzeilen.
sandbox_mode = "workspace-write"
approval_policy = "on-request"
# Voeg alleen vertrouwde documentatie-/packagehosts toe wanneer de runtime dit vereist.
# Tests en normale implementatie moeten offline kunnen draaien.
+47
View File
@@ -0,0 +1,47 @@
# Zelfreview voor een autonome taak
Voer deze review uit vóór `BACKLOG.yaml` naar `done` gaat.
## Correctheid
- Is ieder acceptatiecriterium aantoonbaar in code/test/documentatie terug te vinden?
- Klopt gedrag bij nul items, dubbele uitvoering, gedeeltelijke fout en tijdzonegrens?
- Is het datamodel consistent na een exception of retry?
- Zijn bestaande canonieke data, provenance en gebruikersacties behouden?
## Security
- Kan externe input een URL, command, template, log of AI-instructie worden?
- Worden policy en SSRF na redirects opnieuw toegepast?
- Zijn HTML, filenames, exports en e-mailvelden gesanitized/begrensd?
- Is iedere muterende view authenticated, CSRF-beschermd en user-scoped?
- Kan een secret/PII in debugoutput, exception of fixture terechtkomen?
## Architectuur
- Staat beslislogica in een service en niet in view/task/template?
- Doet een adapter uitsluitend extractie?
- Is de dependency nodig en gelockt?
- Is de verandering compatibel met accepted ADRs?
- Is een migratie werkelijk nodig en veilig?
## UX
- Is feit versus inferentie versus onbekend helder?
- Werkt de kern zonder JavaScript, met keyboard en op smal scherm?
- Zijn fouten herstelbaar en leggen ze geen technische details/secrets bloot?
- Vermijdt de flow extra dagelijkse handelingen?
## Tests
- Zou de test falen zonder de implementatie?
- Zijn negatieve en replaypaden aanwezig?
- Gebruikt geen standaardtest live internet of persoonlijke data?
- Is een bug als regressietest vastgelegd?
- Slaagt de volledige gate zonder thresholds te verlagen?
## Overdracht
- Zijn traceability, runbook, configvoorbeeld en threat model aangepast waar nodig?
- Bevat het taakresultaat concrete uitkomst en verificatie, geen algemene claim?
- Is `PROJECT_STATE.md` eerlijk over wat niet live getest kon worden?
+20
View File
@@ -0,0 +1,20 @@
# Beslissingslog
Accepted architectuurkeuzes staan formeel in `docs/architecture/adrs/`. Dit log bevat uitvoeringsdefaults die Codex niet opnieuw hoeft voor te leggen.
| Datum | Beslissing | Reden | Herzieningstrigger |
|---|---|---|---|
| 2026-07-20 | Werknaam en package blijven `VacatureRadar`/`vacatureradar`. | Consistente repository, UI en deployment. | Alleen expliciete rebranding. |
| 2026-07-20 | UI-taal Nederlands (`nl-BE`), technische identifiers Engels. | Doelgebruiker en onderhoudbaarheid. | Meertalige productrequirement. |
| 2026-07-20 | Single-user-first; user-scoped persoonlijke data. | Lage beheerlast zonder toekomstige lekke querysets. | Multi-tenant productbesluit. |
| 2026-07-20 | België-first, tijdzone Europe/Brussels. | Relevantie voor regio, digest en datums. | Gebruiker verhuist of meertalige release. |
| 2026-07-20 | Django templates + minimale vanilla JS. | Geen onnodige SPA/API/deploymentlaag. | Meetbare UX-beperking met ADR. |
| 2026-07-20 | PostgreSQL productie, SQLite tests/dev, Redis geen waarheid. | Transacties, eenvoudige lokale start en herstelbaarheid. | Schaal/HA-requirement. |
| 2026-07-20 | Onbekende bron is review; direct fetch alleen allow. | Fail-closed veiligheid en bronbeheer. | Nooit verzwakken zonder security-/bronreview. |
| 2026-07-20 | Platforms via vacaturemail/manual import, niet direct crawlen. | Minimale handelingen zonder login-/botrisico. | Expliciete schriftelijke toestemming en nieuwe ADR. |
| 2026-07-20 | Harde regels, dedupe en lifecycle zijn deterministisch. | Uitlegbaar, offline, prompt-injectionbestendig. | Geen voorzien trigger; AI blijft aanvullend. |
| 2026-07-20 | Ollama standaard uit; geen cloud-AI nodig. | Privacy en set-and-forget zonder externe account. | Expliciete providerkeuze met privacyreview. |
| 2026-07-20 | Geen automatische sollicitatie of externe submit. | Menselijke eindcontrole en reputatie/privacy. | Alleen nieuwe product-/securitybeslissing; huidige scope verbiedt het. |
| 2026-07-20 | Geen ongeverifieerde bulk-geodata in repository. | Licentie, actualiteit en ZIP-grootte. | Gecontroleerde dataset met herkomst/licentie/checksum. |
| 2026-07-20 | Externe blokkades worden geïsoleerd, niet als reden om te stoppen gebruikt. | Codex kan code, tests en docs autonoom afmaken. | Geen. |
| 2026-07-20 | Minimum coverage 70% branch-aware; securitykritieke paden hoger. | Betrouwbare baseline zonder cosmetische testjacht. | Alleen omhoog na stabiele baseline. |
+155
View File
@@ -0,0 +1,155 @@
# Projectstatus
- Laatst bijgewerkt: 2026-07-21
- Repositoryversie: 0.1.0 MVP-basis
- Uitvoeringsmodus: autonome backlog
- Eerste uitvoerbare taak: controleer met `python scripts/backlog.py next`
## Werkende basis
De repository bevat een uitvoerbare Django-MVP met:
- profielen, revisies en begrensde feedbackconfiguratie;
- source registry, policy/denylist, veilige fetcher en source runs;
- JSON-LD-, HTML-, RSS/Atom- en e-mailadapters;
- normalisatie, sanitization, werkgeverresolutie, dedupe, aliassen, provenance en versies;
- deterministische features, harde exclusions, scores en optionele uitgeschakelde Ollama-boundary;
- dashboard, vacaturelijst/detail, profiel-, bron- en sollicitatiepagina's;
- feedbackacties, applicationdossiers, lifecycle en dagelijkse digest-outbox;
- Celeryworker/scheduler, healthchecks, Docker/Unraidconfiguratie en back-up-/herstelscripts;
- offline unit-, integratie- en securitytests.
## Laatste geverifieerde baseline
De definitieve projectbasis en een schoon uit de ZIP opgebouwde checkout zijn beide geverifieerd met:
- 43 geslaagde tests;
- 80,42% branch-aware codedekking over `apps` en `config`;
- Ruff en Django system checks geslaagd;
- geen ontbrekende migraties;
- clean-room bootstrap, demo-import en HTTP-smoke voor liveness, readiness en login geslaagd.
## Laatste uitgevoerde backlogtaak
- 2026-07-21: `VR-117` voltooid.
- Productiereleasecontrole toegevoegd met `scripts/release_verify.sh`, inclusief smoke, backup/restore-smoke en artifactbundel.
- Changelog, traceability en Unraid-runbook samengekoppeld aan het releasepad.
- Volgende taak: `VR-201` (blocked-external).
- 2026-07-21: `VR-116` voltooid.
- Synthetische testset (`fixtures/benchmark/quality_benchmark.json`) en benchmarkspec (`docs/quality/BENCHMARKS.md`) toegevoegd.
- `tests/benchmark/test_benchmark.py` bevat smokecontrole voor dataset load, helperlogica en rapportschema.
- Geen UI/UITA-aanpassingen uitgevoerd (expliciet buiten scope, extern met Stitch).
- 2026-07-21: `VR-108` voltooid.
- Resolutie naar oorspronkelijke werkgever geïmplementeerd met deterministische matcher voor recruiter/ATS-bronnen.
- Titel, locatie, employer-naam, domein en canonical metadata leveren evidence-rijke beslissingen op; conflicten leiden naar review i.p.v. auto-merge.
- Bij directe resolutie wordt `canonical_url` naar de directe bron gekopieerd terwijl alias/provenance behouden blijft.
- Unittests en integratietest toegevoegd voor resolvergedrag en pipeline-resolutie.
- 2026-07-21: `VR-109` voltooid.
- AI-analyse geïntegreerd als optionele scorecomponent met caching op `content_hash + model + prompt + schema`.
- Uitgebreide JSON-schema validatie, evidencecontrole en foutstatussen met deterministische fallback.
- Golden evaluatieset met validatiescenario's (disabled, valid, malformed, timeout, prompt-injection) toegevoegd in `fixtures/ai/evaluation_set.json`.
- Scoringsmetadata uitgebreid met AI-status, errorcategorie en weging voor uitlegbaarheid.
- 2026-07-21: `VR-110` voltooid.
- Feedbackleren standaard uit met opt-in, per-feature sampledrempel en metadata logging.
- Verbergreasons worden geclassificeerd als niet-learn (titel/afstand/werkvorm) of leerrijp.
- Positieve feedback groeit alleen na minimale herhaling per feature; negatieve feedback past gewichten terug indien leerrijp.
- Offline evaluatiescript toegevoegd: `scripts/feedback_learning_report.py`.
- UI-presentatie/reset weergave staat open voor externe afhandeling (Stitch).
- Volgende taak: `VR-111`.
- 2026-07-21: `VR-111` voltooid.
- Reminder-outbox toegevoegd voor sluitingsdatum, opvolgdatum en uitzonderlijk sterke nieuwe matches.
- Topmatchherinnering is per profiel in- of uit te schakelen en vereist score/confidence/drempel.
- Herinneringen hebben stabiele event keys, respecteren quiet hours en gebruiken profielweekdagen.
- Integratietests toegevoegd voor idempotentie, stille ontvangers, follow-up werkdagen, DST en rustige uren.
- Volgende taak: `VR-112`.
- 2026-07-21: `VR-112` voltooid.
- Bronhealth en observability toegevoegd met rolling metrics, parserdriftdetectie en automatische quarantaine.
- Raw cleanup bewaart gequarantaineerde documenten en kanaryherstel verloopt via trialpad.
- Dagelijkse taken gepland voor source-health evaluatie, canaryherstel en geautomatiseerde raw cleanup.
- Integratietests toegevoegd voor tijdelijke fouten, policyfouten, parserdrift, canaryherstel en raw cleanup.
- Volgende taak: `VR-113`.
- 2026-07-21: `VR-113` voltooid.
- Sollicitatiedossiers bevriezen nu een gesanitiseerde snapshot met bronlinks, status/contact/notities en timeline-events.
- Export bevat dossier JSON, timeline CSV en printbare HTML zonder externe assets.
- Dossierexport en dossierverwijdering zijn gebruiker-scoped en idempotent.
- Integratietests toegevoegd voor snapshot, export, print, timeline en cross-user-afscherming.
- Volgende taak: `VR-114`.
- 2026-07-21: `VR-114` voltooid.
- Browser-e2e toegevoegd voor login, dashboard, lijst/detailfilter, profielbewerkingen,
vier feedbackacties, sollicitatiedossierbewerking en handmatige tekstimport.
- Accessibilitycontrole toegevoegd met Playwrightpad (desktop + 360px viewport) en fallback HTML-a11yprobe
wanneer browser niet beschikbaar is.
- Screenshots worden vastgelegd bij falen binnen e2e-run.
- Volgende taak: `VR-115`.
- 2026-07-21: `VR-115` voltooid.
- Productie-hardening toegevoegd met non-root/read-only containerinstellingen, CI-secret- en kwetsbaarheidsscans,
production settings validatie, DNS-rebindcontrole in fetcher en rate limiting op login/manual import.
- Nieuwe tests toegevoegd voor `settings`-validatie, rate limiteren, login-manual-import blokkades
en DNS-rebinddetectie.
- Geen UI-wijzigingen toegevoegd (manueel afhandelen bevestigd).
- Volgende taak: `VR-116`.
- 2026-07-21: `VR-107` voltooid.
- Handmatige URL- en tekstimport toegevoegd met CSRF-beveiligde POST-flow en GET-prefill.
- URL-import hergebruikt bestaande policy/SSRF-checks en fetchpad; paste-import gebruikt een lokale synthetische HTML-payload zonder extern fetch.
- Bronlijst bevat bookmarklet, resultaatpanel met created/duplicate/warnings en links naar vacaturedetail.
- Unit- en integrationtests toegevoegd voor URL-flow, paste-flow, denylist en paste-limiet.
- 2026-07-21: `VR-105` voltooid.
- Haversine-afstand berekent nu op basis van geocoderingscoördinaten met confidencegedrag voor exacte afstand.
- Reistijdschatting toegevoegd als expliciete, conservatieve offline-schatting en gelabeld als inferentie.
- Harde afstandsuitsluiting blijft strikt, met optionele harde reistijdbeperking via `hard_rules["max_commute_minutes"]`.
- Bij geocodecache-import worden getroffen actieve vacatures opnieuw gescoord.
- Score-evidence verrijkt met afstands- en reistijdmetadata.
- 2026-07-21: `VR-103` voltooid.
- Geïmplementeerd: databaseleaseclaim (`SourceLease` + `SourceOriginState`) voor concurrency- en crash-veiligheid.
- Per-origin intervalcoördinatie, backoff inclusief 429/Retry-After en jitter op successen.
- Fetcher stuurt expliciete foutcategorieën voor 429, timeout en andere netwerkfouten.
- 2026-07-21: `VR-101` voltooid.
- Inrichting van bronontdekking vanuit HTML/sitemap/feed/e-mail, inclusief JSON-LD en feedlinkdetectie.
- Persistente kandidaatservice met provenance in `Source.metadata["discovery"]` en idempotent gedrag.
- Bulk-safe kandidaatacties `approve_to_trial` en `dismiss` in bronlijst-UI.
- Management command `discover_sources`.
- Fixtures toegevoegd voor HTML, sitemap index/urlset, feed en e-mail.
Een toekomstige agent moet altijd de actuele waarheid opnieuw bepalen met:
```bash
./scripts/codex_verify.sh
```
## Nog te bouwen
Momenteel staan er geen `ready` taken meer over; de volgende te behandelen item is `VR-201` als `blocked-external` (bronreview).
## Externe blokkades
Deze blokkeren onafhankelijke code niet:
- concrete werkgevers-/bronnenkeuze en actuele menselijke bronreview;
- live IMAP/SMTP-account en app-password;
- Unraid-domein, DNS, TLS en reverse proxy;
- containerregistry en credentials;
- keuze/verkrijging van een gelicenseerde actuele Belgische postcode-/gemeentedataset.
## Bekende verificatiebeperking van de aangeleverde basis
De Pythonapplicatie en tests zijn lokaal geverifieerd. Een echte Dockerimagebuild en volledige PostgreSQL/Redis/Unraid-smoke vereisen nog steeds een omgeving met Docker; daarom is dat nog niet als uitgevoerd te claimen in deze workspace.
## Hervatten
```bash
./scripts/codex_verify.sh
python scripts/backlog.py next
```
Werk daarna exact volgens `docs/ai/AUTONOMOUS_EXECUTION_PROTOCOL.md`.
+24
View File
@@ -0,0 +1,24 @@
# Startprompt voor Codex
Kopieer de tekst hieronder als eerste opdracht nadat de ZIP is uitgepakt en de repository als workspace is geopend.
```text
Werk autonoom aan VacatureRadar.
1. Lees CODEX_START_HERE.md en AGENTS.md volledig.
2. Voer ./scripts/codex_bootstrap.sh uit wanneer de omgeving nog niet is opgebouwd; voer anders ./scripts/codex_verify.sh uit.
3. Lees docs/ai/PROJECT_STATE.md en valideer docs/ai/BACKLOG.yaml met python scripts/backlog.py validate.
4. Selecteer steeds de eerste taak die python scripts/backlog.py next toont.
5. Voer iedere taak volledig uit volgens de acceptance_criteria, gekoppelde requirements, AGENTS.md en docs/quality/DEFINITION_OF_DONE.md.
6. Vraag geen productbeslissingen of bevestiging. Gebruik de vastgelegde veilige defaults. Bij ontbrekende externe credentials, accounts, live bronreview, domein of dataset: implementeer interface, fixtures, mocks, tests, foutafhandeling en documentatie; laat alleen het externe restpunt blocked-external en ga meteen verder.
7. Houd adapters write-free, bedrijfslogica in services, netwerk fail-closed, harde regels deterministisch vóór AI, en voeg nooit automatisch solliciteren, platformloginbots, CAPTCHA-omzeiling of directe denylistscraping toe.
8. Werk bij iedere taak code, migraties, tests, docs, traceability, BACKLOG.yaml en PROJECT_STATE.md samen bij.
9. Markeer een taak pas done nadat ./scripts/codex_verify.sh slaagt; draai de gate daarna opnieuw na de ledgerwijziging.
10. Herhaal zonder onderbreking tot geen uitvoerbare ready taak meer bestaat. Eindig met een feitelijk eindrapport en exacte blocked-external checklist.
```
## Herstart na een onderbroken sessie
```text
Lees AGENTS.md, docs/ai/PROJECT_STATE.md en de git diff. Draai python scripts/backlog.py validate en ./scripts/codex_verify.sh. Herstel eerst een onvoltooide wijziging of falende gate. Ga daarna verder met python scripts/backlog.py next volgens het autonome protocol. Vraag geen reeds vastgelegde productbeslissingen.
```