Risk Register¶
Updated: 2026-07-28. Reviewed at every phase gate. L/I = likelihood / impact (H/M/L).
| ID | Risk | L | I | Mitigation | Status |
|---|---|---|---|---|---|
| R-01 | Posting-level job data unavailable legally → skills module misread as thin | H | H | ADR-008: official aggregates as real signal; labelled fixtures prove the NLP pipeline; module UI states data class on every chart | accepted, designed-for |
| R-02 | Government portals block automated access (observed for sandbox fetcher 2026-07-28) → collectors fail from some environments | M | M | Local-network verification step per source before collector work; identifying User-Agent; conservative throttling; document per-source access constraints | open |
| R-03 | Company universe too small to feel useful | M | M | Curated seed target 150–250 with evidence; enrich via tenders/CORDIS/jobs cross-references; state coverage % prominently instead of hiding it | open |
| R-04 | False entity merges damage the credibility the project exists to demonstrate | M | H | ADR-010 conservative thresholds; review queue; merge log surfaced in UI; entity-resolution tests with adversarial fixtures (OffeneRegister vintage data) | designed-for |
| R-05 | Thin history makes trend charts misleading | H | M | "Coverage since" label on every trend; backfill only from official time series; no trend rendered under a minimum-window rule (quality gate) | designed-for |
| R-06 | Scope explosion → twelve half-finished modules | M | H | Phase gates with acceptance criteria; optional features require written value justification; backlog discipline | open |
| R-07 | Source terms change or a source disappears mid-project | M | M | Adapter interfaces + fixtures for every source; fact_source_run records failures; dashboard shows stale/failed sources instead of silently serving old data |
designed-for |
| R-08 | ODbL share-alike obligations from OSM contaminate exports | L | M | OSM undecided (S-09); if used: separated layer, attribution, no mixing into exports without legal review | open |
| R-09 | Demo/synthetic data mistaken for real observations by a portfolio viewer | M | H | demo_mode banner; per-record data_class; honesty review at every phase gate; README data-honesty contract |
designed-for |
| R-10 | Dual-target SQL (DuckDB/Postgres) drifts apart | M | M | dbt adapters; both targets in CI; dialect-portable SQL policy | designed-for |
| R-11 | CI matrix (esp. Windows) flakes on integration tests | M | L | Portable vs integration test split; database integration tests on Ubuntu only, documented why | designed-for |
| R-12 | German-language processing bugs (umlauts, compounds, legal forms) corrupt normalization | M | M | Unicode-normalization utilities with dedicated tests; taxonomy keeps original observed strings; golden-file parser tests | open |
| R-13 | Unofficial API wrapper (S-03) used carelessly by a future contributor | L | H | Feature flag defaults off; loud warning + terms note in code and docs; excluded from published outputs by construction | designed-for |
| R-14 | Administrative codes (AGS/NUTS) entered from memory are wrong → silent join errors | M | H | Backlog F-07: validate codes against official Gemeindeverzeichnis/NUTS tables during Phase 1 config validation; until then codes carry a to-validate note in config | open |