Data & caveats

Everything on this site is built from public data — no records requests, no private sources. This page lists the sources, the known limitations, and how to reproduce the pipeline.

Sources

Known limitations

  1. Supplements are not screened. The comparison is cash wage against the scheduled base rate. Prevailing-wage law also requires supplemental benefits; whether a contractor paid them, in cash or in kind, is not visible in this dataset. A contractor paying a below-floor cash wage may lawfully be paying the balance as supplements in cash — one of the reasons findings are candidates, not determinations.
  2. Apprenticeship registration is not verifiable from public data. The Tier-2 screen removes findings whose paid rate matches a scheduled apprentice rate, but a registered apprentice paid an off-schedule rate would survive the screen. Registration records are not public.
  3. Classification mapping is conservative but not perfect. The filed work-category text is mapped to schedule trade families; where no defensible mapping exists, the line is logged as unmatched (766 lines) rather than force-matched. The minimum-family floor means a misclassification within a family can only make the screen more lenient, not less.
  4. The weekly gross-wages field spans all of a worker’s work, while the hours fields are project-specific. Agreement between the two is used as one-sided corroboration; disagreement carries no signal and is never used against a contractor.
  5. Exposure figures are indicative, computed as shortfall per hour × reported project hours on flagged lines. They are screening magnitudes for prioritization — not damages, which would require supplement accounting, full work-period records, and adjudicated classifications.

Accounting for every line

The pipeline drops nothing silently. Of 588,505 harvested lines, 554,606 are journeyworker lines with plausible hourly rates and were screened; the remainder are non-journeyworker labels or out-of-range rates, all counted. 1,709 screened lines could not be matched (766 with no defensible category mapping, 943 with genuinely unresolvable multi-county locations) and are logged as unmatched.

Reproducibility

The pipeline is plain Python (standard library only) plus pdftotext, writing to a single SQLite database: harvest, county attribution, rate-library parsing for both schedule periods, the Tier-1 flag engine, the apprentice-rate library, the Tier-2 screen, and the exports that feed this site. The whitepaper documents each stage; the run order is a fixed sequence of eight scripts.

Corrections

If you believe any entry on this site is in error — a misattributed county, a wrong floor, a name collision, or any other issue — contact thomas@concoursetech.com. Corrections are reviewed promptly and errata are noted.