Randomization Validation Report

Generated 2026-07-24 15:23 by scripts/validate_randomization.py. All tests at alpha = 0.05. Chi-square critical values use the Wilson-Hilferty approximation; KS uses the asymptotic two-sample critical value. Aggregating draws across seeded runs treats draws as independent, which is a good approximation for sample sizes far below the population size.

P1 - GH Archive ground-truth inclusion test (GHArchiveSampler)

Population: all 7,294 repositories created in hour 12 UTC of 2023-06-15 (fully enumerated from the public archive). 100 seeded replays of 100 draws each (10,000 total draws) through the real sampler code path.

Test

Statistic

Critical (5%)

Result

Equal inclusion probability (100 hash buckets, df=99)

105.3

123.2

PASS

Creation minute-of-hour marginal vs population (df=59)

51.8

77.9

PASS

Owner-initial marginal vs population

27.6

38.9

PASS

P3 - Seed stability (pairwise KS across seeds)

4950 pairwise two-sample KS tests on within-day creation times across independent seeds: 250 rejections (5.1%; expectation under uniform sampling is about 5%). PASS

P2 - Live IDSampler audit

2,000 live probes against the real GitHub API, 747 hits (37.4% success rate).

Test

Statistic

Critical (5%)

Result

Probed IDs uniform over 10 deciles (df=9)

9.24

16.90

PASS

created_at monotone in ID (inversion rate)

0.00%

< 1%

PASS

Live probe-sequence reproducibility (same seed, 2 runs)

identical

identical

PASS

Hit rate by ID decile (existing-repo density over GitHub’s history): 42.1%, 50.0%, 37.9%, 38.1%, 31.6%, 34.9%, 35.0%, 39.3%, 34.3%, 29.7%.

Coverage gap: newest observed repo ID is 1,310,925,406 vs the default max_id 850,000,000 - the default excludes 35.2% of the current ID space (newest repositories). Pass max_id explicitly for full coverage.

P4 - Temporal sampler bias, quantified (measurement, not pass/fail)

Temporal sample n=200 vs near-uniform ID-sample benchmark n=747:

Metric

TemporalSampler

IDSampler benchmark

Mean stars

0.4

0.2

Median stars

0

0

% with >= 1 star

12%

9%

% pushed in last 90 days

0%

0%

Top languages

JavaScript (36), HTML (28), Python (20), TypeScript (16), Jupyter Notebook (8)

JavaScript (105), HTML (77), Java (53), Python (49), Jupyter Notebook (23)

Search-cap coverage: mean fraction of each sampled day’s repositories reachable under the 1,000-result cap: 2.7% (per-day counts: 2017-02-25: 19,301, 2017-07-18: 32,509, 2017-10-10: 34,576, 2019-07-22: 33,353, 2019-07-27: 21,277, 2021-02-18: 66,816, 2025-03-10: 157,895, 2025-12-20: 151,606).

P5 - BigQuery live check (BigQuerySampler)

Check

Result

Returns real data (was always empty before the invalid-SQL fixes)

49 repos - PASS

Same seed, two live runs identical

PASS

Duplicate repositories in output

0 - PASS

Days used / allocation vs day size correlation

5 days, r = 1.00

P6 - Live API contract checks

Check

Result

GH Archive publishes hourly files only (daily URL 404s, hourly 200; probed 2026-07-22)

daily=404, hourly=200 - PASS

Event schema fields used by GHArchiveSampler present

first 500 events well-formed - PASS

Repository CreateEvents ended with GitHub’s 2025-10-07 Events API change (present before, absent after)

1878 in 50k events of 2025-08-15 vs 0 recently - PASS

/repositories/{id} returns the fields IDSampler maps

HTTP 200 - PASS

Temporal population claim: pushed_at inside the sampled day

100 repos, 100% in window - PASS

P7 - BigQuery dry-run validation (free)

Every query shape the sampler can emit, compiled by BigQuery without execution (dry runs cost nothing and would have caught all three SQL-validity bugs in this audit). Estimated scan per query:

Query

Valid

Est. scan

count (5 days, pruned wildcard)

PASS

0.52 GB

day sample

PASS

0.18 GB

combined (2 days, UNION ALL)

PASS

0.18 GB

active (no languages)

PASS

99.45 GB

active (languages)

PASS

99.59 GB

get_languages

PASS

0.20 GB