Phase 3 Review — Jobs & Skills Intelligence (Module 1)¶
Date: 2026-07-28 · Four-review standard applied to the first business module.
1. Engineering review¶
Executed and green: ruff clean, mypy strict clean (28 source files),
145 tests passed (was 79), real demo run: 3 sources → 19 quality rules →
gate PASS → 8 marts; ingoshift export produced a real XLSX (README sheet with
provenance + one sheet per mart) and CSV+manifest export.
Findings:
- Extraction is deliberately layer-1 only (deterministic dictionaries per the
brief's layered strategy; ADR-012). No NLP model, no LLM — and nothing
pretends otherwise: every bridge row carries method='dictionary'.
- The taxonomy loader rejects a variant claimed by two canonical skills at
load time, naming both — normalization conflicts cannot enter silently.
- Deferred, stated, not faked: dashboard page and API endpoints require
Streamlit/FastAPI, which cannot be installed here (PyPI blocked). The brief's
Phase-3 acceptance is therefore split: data layer, extraction, marts, export,
CLI, tests = done; dashboard/API = carried to a network-enabled environment
(backlog M1 keeps them open). The Excel/CSV export requirement is fully met
(openpyxl was preinstalled).
2. Data review¶
- All job data is
data_class=synthetic(S-16), stamped by the parser regardless of mode, visible in every fact row, every mart (mart_top_skills.data_class), and the export README sheet. - Hand-derived fixture arithmetic is pinned by tests: 33 bronze → 31 silver (1 out-of-region, 1 dedup), python=10 postings, sql=9, power_bi=5 across four observed spellings retained verbatim on the bridge, python+sql co-occurrence=4, python monthly trend 2/2/2/4.
- Observed vs inferred is structural: skills carry
method, seniority and occupation carry*_method(inferred_from_title|none) — tested. - Finding (accepted, documented): dictionary extraction is negation-blind ("kein JavaScript" would match) and inflection-blind ("Batteriesystemen" does not match "Batteriesystem"). Both are stated in limitations; under-extraction surfaces via the JOB-W1 coverage warning instead of being invisible.
3. Business review¶
- US-01/US-02/US-03-shaped questions now have marts: top skills, monthly skill trends, co-occurrence pairs, company hiring activity — on synthetic data, and every consumer-facing artefact says so. The pipeline proof is the product at this stage (ADR-008), exactly as positioned.
- US-15 (analysis-ready export with lineage metadata) is delivered and tested.
- Not yet served: interactive exploration (needs the dashboard) — carried.
4. Honesty review¶
- Employer names in the fixture carry
(SYNTHETIC); the normalizer is tested to NOT strip that marker; the export README says demo rows "MUST NOT be read as observations". ✅ mart_top_skillscarries data_class so a screenshot cannot silently pose as real labour-market analysis. ✅- No dashboard/API stub commands were added to the CLI. ✅
- Checked backlog/DoD wording: module 1 is recorded as partially complete with the exact split stated. ✅
Gate decision: Phase 3 passes for its in-environment scope; dashboard/API carried as environment-blocked items (with CI/bootstrap/lockfile from earlier phases). Proceed to Phase 4 (Company & Transformation Monitor).