reconnecting
Listening for events…

Data Lab / How Many Rain Days Does a Jobsite Actually Lose?

How Many Rain Days Does a Jobsite Actually Lose?

Author: Claude (TerraPulse Lab) Status: SHIPPED — 9pp + 2 figures. Sasha rounds 1-4 cleared; verify_draft.py 63/63. Hed: How Many Rain Days Does a Jobsite Actually Lose? (chosen by Mike, 2026-09-07, option A of 3) Dek: Construction contracts count working days from the weather record, and the standards that govern the count never say how to read it. Read hour by hour rather than day by day, about half the days the record calls rain days carried no qualifying rain while crews were on site. (revised dek approved by Mike 2026-09-07; the earlier 44% version is superseded) Hed constraint: no hed may imply rain avoids working hours. In fine-resolution data the wet-hour share sits essentially on the clock share; depth sits 1.1-1.6 pp BELOW it — a real but tiny nocturnal lean, defeated on magnitude, not sign. Created: 2026-09-07 Rotation: paper type 8 (general contractors and construction, S family)

Hypothesis

Construction practice standards direct schedulers to the measured precipitation record to count working days, but do not say how to read it, and what is read is a daily total. Does reading the same record at hourly resolution, restricted to working hours, give a materially different rain-day count? H0: the working-window rain-day rate equals the calendar-day rate less only what the window's share of the clock implies — i.e. there is nothing to learn from the hourly resolution.

Pre-registered secondary null: wet hours fall inside a 07:00–17:00 window at the same rate the window occupies the clock (41.67%), i.e. rain has no diurnal preference for working hours.

Data Sources

  • locationdex/precipitation_station — 2,093 NCEI COOP Hourly Precipitation Data (HPD) v2.0 stations. Series is a POINTER (series_url), not embedded; no Postgres path exists for this source.
  • Pulled in ONE streaming pass over the single period-of-record archive (334 MB gz), reduced in memory, ~20 GB uncompressed never written to disk.
  • 36,599,660 station-days, 1940-01-01 → 2026-08-26. 23 live-inventory stations absent from the dex, not reduced.
  • Licence: ncei_coop_hpd, US federal work, 17 USC 105, cleared in the live API policy gate. DOI 10.25921/p7j8-2170.

Methodology

Working day = 07:00–17:00 local wall clock, 10 h. HPD reports in Local Standard Time, so the window maps to 06:00–16:00 LST under DST; corrected per station-year across the full federal ladder (1942–45 War Time; 1967–73; 1974; 1975; 1976–86; 1987–2006; 2007+), with non-observing jurisdictions excluded. Missing hours identified by the value (−9999), not the quality flag — a QF test misses 15.6% of them. Multi-hour accumulations treated as missing, never redistributed. Station-day counts only if all 10 window hours are usable; station enters a period statistic at ≥80% of days yielding a complete window (70%/90% reported as sensitivity). Threshold reported as a ladder (0.01/0.05/0.10/0.25/0.50 in) — none designated, because no primary spec states one. Contrast restricted to days complete in both the window and all 24 h.

All settings FROZEN before the run in workspace.json → prereg. Seven dated amendments in prereg_amendments: A-1 Indiana pre-2006 DST (factual correction to timekeeping law) · A-2 the 1946–66 local-option era (declared limitation, not fixed) · A-3 amount-weighted null (added post-hoc) · A-4 reproducibility fix (bootstrap CIs were order-dependent) · A-5 the reporting-resolution regime finding · A-6 resolution-pure bands + per-station-year classification · A-7 classification sensitivity + corrected pre-1967 bound.

Findings

⚠️ THE HEADLINE MOVED. 43.6% → 49.0%. See "The resolution finding" below.

  1. The record changes its reporting resolution — a second, independent finding. HPD reports hourly precipitation at ~0.01 in early, ~0.10 in from the late 1980s to 2004, ~0.01 in again from 2013. Share of nonzero daily totals on exact multiples of 0.10 in: 11.9% (≤1963) → 97.4% (1990s) → 6.5% (2013+). It is a per-station-year property (47.5% coarse / 50.7% fine / 1.9% mixed), not a dated instrument change. Not found stated in the dataset documentation. Reported as a result in its own right (§V C), not merely controlled for.
  2. The contrast — the result. On fine-resolution station-years (2,029 stations, 53,665 station-years, 17,704,428 station-days) at 0.10 in: daily totals call 16.88% of days rain days; working hours call 8.61%. 1,464,265 days = 49.0% of calendar rain days carry no qualifying rain during working hours. Ladder: 34.8 / 44.6 / 49.0 / 56.5 / 63.5%.
  3. Three constructions converge; two share no calendar years. Applying the per-station-year classification and then slicing: 49.65% (≤1963) · 49.68% (≥2013) · 49.00% (all 87 years, unsliced). The first two are disjoint spans half a century apart, separated by the whole coarse era, and differ by 0.03 pp. The classification references no date, so it is immune to any cut-point objection; varying its two parameters moves the figure only 48.80–49.10%. ⚠️ Earlier drafts quoted 49.74/49.11 — those are the calendar BANDS, which still carry ~1.5% coarse station-years.
  4. The coarse 39.4% is a NON-MEASUREMENT, not a rival estimate. On coarse station-years the share of calendar rain days lost at 0.01/0.05/0.10 in is 39.2069 / 39.2080 / 39.2088 — one threshold, not three. Sub-tenth-inch was not representable. ⚠️ These are lost-SHARES, not rain-day RATES (the coarse rain-day rates are ~22.9% calendar / ~13.9% window) — a category error that reached the public page and was caught in round 4.
  5. The archive-wide 43.6% is a fact about the archive, not about rain — a mix-weighted average of a measurement and a non-measurement, its value set by which station-years NOAA digitized at which resolution. Reported as "as-distributed", nothing more.
  6. The reverse class is zero by ARITHMETIC — window ⊆ day. Verified 0 in every band and both resolution classes. Stated as construction in §III D.
  7. The null holds, and is CLEANER than we had it. In fine data the wet-hour excess over 41.67% is −0.22 pp (≤1963, d=−0.050) and +0.61 pp (≥2013, d=+0.078). The published d=0.267 was regime-inflated — its population is 45.8% coarse, and the coarse band alone carries d=0.506. Amount-weighted (post-hoc, A-3): 40.03% and 40.57%, both BELOW the clock share. Not a diurnal effect, by two measures.
  8. The decadal "trend" IS the resolution change. Same 306 stations, same days: 0.01 in rate flat (12.73 → 12.69, −0.04 pp) while 0.10 in climbs +2.81 pp, as that panel's multiple-of-0.10 share goes 59.0% → 98.7%. Panels are nested (7 ⊆ 201 ⊆ 306), not independent. Paired-t CIs now reported for all three (replacing a bootstrap given only to the smallest). No trend reported.
  9. Zero-measurable-rain quotable only softly: 47.65% of lost days on fine station-years at 0.10 in. The pooled 73.8% is NOT quotable (59.4/92.9/43.7 by era; the middle is near-definitional). At 0.01 in it is 100% by arithmetic — never a finding.
  10. Geography: 40 states. PR 24.97 (n=7) → NV 4.83 (n=8), CIs given. Blended-resolution figures, and we cannot bound the consequence. ⚠️ An earlier draft claimed the mix does not correlate with the rate (r=−0.11, p=0.48) — those numbers do not reproduce under any of five constructions and are withdrawn. Computed properly the two defensible definitions disagree in sign (share-of-days-post-2013 r=−0.38, p=0.012; share-in-fine-station-years r=+0.26, p=0.082), so no directional claim survives either way.

All numbers: data/results.json. Verified by scripts/verify_draft.py (63/63), which re-derives from the parquet, not from results.json. An earlier ad-hoc value-matching sweep passed 226/230 and missed the withdrawn geography numbers entirely — it matched rounded values against a saturated set of ~16k JSON leaves, where almost any short token finds a spurious partner. Do not use that method.

References

  • WSDOT Plans Preparation Manual M 22-31.10, App. 6 §A6-4(2), Feb 2023, p.A6-3 — verified verbatim 2026-09-07; contains NO numeric precipitation threshold.
  • FAR 52.249-10(b)(2) — "unusually severe weather", no number.
  • Wuertz, Lawrimore & Korzeniewski (2018), NOAA NCEI, doi:10.25921/p7j8-2170.

Reproducing

data/station_days.parquet (147 MB) is not in git — it exceeds the largest tracked workspace parquet by ~6x. Regenerate it in ~250 s, one 334 MB streamed request, nothing uncompressed landing on disk:

python workspaces/workable-days/scripts/extract.py --workers 8
python workspaces/workable-days/scripts/verify_draft.py    # 63/63

verify_draft.py re-derives every quoted number from the parquet, not from results.json, so a wrong number and a wrong population both fail. It covers paper.tex, index.md and the /articles page.

Build

paper/paper.pdf — 6 pp, revtex4-2, compiled 2026-09-07, 0 undefined citations, 0 overfull boxes.

A-1 measured impact (Indiana DST)

Only IN rows changed, only 1967–2005 — correct on both edges. 257,433 station-days changed window; 15,478 changed a window total; 418 changed the complete-window flag. Rain-day flips 5,257 at 0.10 in (0.015% of the corpus). Exactly one reported number moved >0.1 pp and it is a coverage descriptor, not a result: pct_station_days_under_dst 45.53% → 44.83%. Largest movement in any result rate: +0.005 pp. One station (USC00127298, frac 0.80038) newly crosses the floor in the 1990s, taking that decade's population 1,196 → 1,197. Normals population unchanged at 970.

Residual, recorded not fixed: pre-2006 Chicago-orbit (Lake, Porter, LaPorte, Newton, Jasper) and Evansville-orbit (Gibson, Posey, Spencer, Vanderburgh, Warrick) counties DID observe daylight time on Central. Stations there are now windowed one hour early in the pre-2006 daylight season. Bounded: the whole-Indiana correction moved no headline by 0.1 pp, so a partial counter-correction within Indiana cannot either.

Figures

  • paper/figure1.png — the ladder read two ways (calendar vs working-window rate, plus lost-share). No threshold visually privileged.
  • paper/figure2.png — the three balanced panels' shared shape. No trendline.

Amendments (workspace.json → prereg_amendments)

  • A-1 Indiana pre-2006 DST — factual correction to timekeeping law. Impact: one coverage descriptor moved >0.1 pp (DST share 45.53 → 44.83%); no result rate moved more than +0.005 pp.
  • A-2 1946–66 local-option era — declared limitation, not fixed. 6,530,292 station-days; 1967-onward sensitivity now reported in §IV F.
  • A-3 amount-weighted null — ADDED POST-HOC after Sasha round 1. Does not replace the pre-registered wet-hour statistic.
  • A-4 reproducibility fix — pl.group_by order dependence made bootstrap CIs non-reproducible run-to-run (max drift 0.435 pp). Fixed; proven by diffing two clean runs: 11,388 keys, 1 difference (the timestamp). Only CI endpoints moved; at printed precision only Puerto Rico's interval changed (20.2–28.3 → 20.1–28.4).

Round-1 audit corrections applied

B-1 complement error (sub-threshold shares were the zero-rain shares) · B-2 Conclusion named the wrong period; §IV C mixed two populations undeclared · B-3 promised 1967+ sensitivity was never delivered · B-4 unsupported window-endpoint insensitivity claim DELETED · S-1 decadal reasoning rewritten · S-2 floor spread 0.9 → 1.04 pp · S-4 null phrasing · S-5 N for all named states + CIs on the spread · S-6 "~24% of hour-cells" attributed to the 72-station sample, unsourced "1996" removed · S-7 median span 64 → 65 y, 2020s flagged partial, QF miss rate cited · coin analogy corrected (predicted 58.3% vs observed 43.6%) · accumulation exclusion declared a selection filter · USACE ER 415-1-15 non-retrieval disclosed · effective-N caveat added.

Author: PMA

Published: 2026-09-07 · Updated: 2026-09-07

Data files: data/inventory.json, data/hpd_catalog.parquet, data/sample_station_stats.parquet, data/station_days.parquet, data/extract_meta.json, data/results.json, data/provenance.json

Scripts: scripts/inventory.py, scripts/extract.py, scripts/analyze.py, scripts/make_provenance.py

← Back to Data Lab