Method
The screen joins two public datasets New York State already publishes — certified payrolls and prevailing-wage schedules — and is conservative by construction at every step. Full detail, including formulas, is in the whitepaper.
1. Inputs
- Certified payrolls: 588,505 wage lines from the statewide certified-payroll dataset on data.ny.gov (Socrata resource
w2zp-sf2x), covering work weeks 2026-01-01 through 2026-07-20, harvested with exact row reconciliation and zero silent drops. - Rate schedules: the NYSDOL Article 8 prevailing-wage schedules for both periods the data spans — the 2025–2026 statewide edition and the 2026–2027 per-county editions — parsed into a rate library of roughly 11,000 journeyworker rows per period across all 62 counties, plus a separate library of about 13,000 registered-apprentice rates per period.
2. County attribution
Prevailing rates are set per county, so each wage line must be placed in one. Project ZIP codes resolve most lines via the Census ZCTA-to-county file; a provenance-tagged fallback chain (unambiguous ZIP-3 prefixes, gazetteer city match with an empirical-contradiction guard, empirical city consensus, and the contracting jurisdiction’s name) raises coverage to 99.8% of lines. The remaining lines are genuine multi-county placeholders and are logged as unmatched, never guessed.
3. Tier 1 — the conservative floor test
For each line labeled Journeyman with a plausible hourly rate, the engine maps the filed work category to a schedule trade family and takes the minimum journeyworker base rate across every classification and sub-group in that family, for that county and schedule period. A line is flagged only if its cash wage is below even that lowest rate. Work performed before July 1, 2026 is screened against the 2025–2026 schedule; later work against 2026–2027 — the effective-dating that a pilot on New York City data showed prevents scores of false positives.
A curated cross-trade alias layer (for example, upstate Steamfitter work screened against the Plumber/Steamfitter combined blocks, Asbestos Worker against Laborer and Insulator blocks) adds matches where NYSDOL’s own schedule taxonomy names the equivalence; alias-derived floors carry an explicit alias provenance tag visible in the findings browser. Categories with no defensible mapping are logged as unmatched (766 lines), not force-matched.
Findings are graded by shortfall depth: high confidence means the paid rate is at least 15% below the floor — far larger than any plausible rounding or schedule-revision artifact. Only high-confidence findings are published here.
4. Tier 2 — removing detectable false-positive classes
The pilot proved that the largest false-positive class is registered apprentices filed under the “Journeyman” label. Tier 2 therefore annotates every finding (it never deletes):
- Apprentice-rate downgrade (6,486 findings, 26%): the paid rate matches, to within $0.02, a scheduled apprentice rate for the same trade family in the same county and period — either an explicit dollar term rate or a published percentage applied to that classification’s own journeyworker rate. These are treated as likely mislabeled apprentices and removed from the standing set.
- Alternate-classification caution (1,379 findings): the paid rate exactly equals another classification’s journeyworker rate in the same county and period — consistent with a worker filed under the wrong category. Also removed from the standing set.
- Corroboration (370 findings): the payroll’s weekly gross-wages field independently agrees with paid rate × reported project hours. Because that field is the worker’s full weekly gross across all work while the hours fields are project-specific, agreement is meaningful one-sided evidence but disagreement means nothing — so disagreement is never used as a negative signal.
What survives — high confidence, not apprentice-downgraded, not alt-class-cautioned — is the standing candidate set: 6,835 findings across 468 contractors.
5. What the screen deliberately does not do
- It never treats a finding as a determination — the standing set is a ranked queue for human investigation.
- It never picks a higher rate when a lower one could apply — the floor is always the family minimum.
- It never silently drops a line — every exclusion and unmatched category is logged and counted.
- It screens the cash wage against the base rate only; supplement compliance is not screenable from this dataset.