Skip to content

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_skills carries 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).