Work / WorkforceGuard AI
WorkforceGuard AI
Turns EU labour-market data and a company's own payroll into a pay-gap position it can defend to a regulator.
The problem
From June 2027, employers with 250+ staff must report gender pay gaps and justify them. Most know their own number. Almost none can say whether it is normal for their sector and country — or show the working when asked.
Data path
Three Eurostat sources — labour force survey, job vacancy statistics and structure of earnings survey — are ingested and modelled through a layered transformation: staging, then a core layer covering all 27 member states and 13 sectors. The employer's uploaded payroll joins at the internal mart. The result is an evidence bundle in which every figure carries its source dataset, formula version and review status. Each decision is written to a hash-chained governance log whose integrity is verified on every request.
How it works
- 01
Start from the market, not a spreadsheet
Employment, vacancy and pay-gap series for all 27 member states and 13 sectors are already loaded from Eurostat, so there is a benchmark before anyone uploads anything.
- 02
Add your payroll
Internal pay data is blended against the matching country and sector benchmark — not a global average that flatters or unfairly damns you.
- 03
See which gaps need a reason
The review queue flags where the company sits outside its benchmark, so effort goes to the roles that will actually be questioned.
- 04
Export something a regulator accepts
Every figure carries its Eurostat source, dataset version and formula version. Decisions are written to a tamper-evident log and exported as one evidence pack.
Engineering notes
- 16 Eurostat datasets (LFS, JVS, SES) ingested as Parquet and modelled through layered dbt (~31 models) on DuckDB — no database server at query time.
- A single analytics repository resolves filters, assembles evidence bundles and writes governance events, keeping provenance structural rather than cosmetic.
- Governance events are chained with SHA-256, so tampering is detectable and chain integrity is verified on every API call.
- The copilot selects its benchmark basis from data coverage and declines to answer confidently when coverage is partial.
Trade-offs
DuckDB over a hosted warehouse
instead of Postgres or BigQuery
The analytical workload is read-heavy over a fixed panel. An embedded engine removes a server from the deployment and makes the whole warehouse reproducible from source data.
Layered dbt marts over one wide table
instead of a single denormalised model
The EU reference layer and the company layer have different owners and refresh cadences. Separating them means either can be tested or replaced without touching the other.
Refusing to answer over guessing
instead of always returning a number
A confident answer on partial coverage is worse than no answer when the output is going to a regulator.
Evidence
27
member states
13
NACE sectors
16
source datasets
~31
dbt models