Domain A - China Industrial Activity vs. Satellite Reality
Source: China NBS (industrial output) vs. NASA Black Marble night lights + Sentinel-5P NO2 + IMF PortWatch export volume, via FactIQ Period: 2024-06 to 2026-05 (20 months) Harvest date: 2026-08-04 ⚠ FactIQ's official NBS data is not vintage-aware (Phase 1) - every value is today's revised print, not the original.
Domain A — Results: China Industrial Activity vs. Satellite Reality
Computed 2026-08-04 against hypothesis.md (commits d918279, 118e5a7,
pre-registered before any value was fetched). Every number below is
reproducible: python -m src.domains.domain_a_china.compute regenerates
results.json from the staged fixtures in data/, deterministically, with
no manual or LLM arithmetic in the computation path.
H1 — National divergence index: weak positive, technically not falsified
Correlation between z(official) and z(composite satellite) = 0.113,
across 20 overlapping months (2024-06 through 2026-05; 2026-06 excluded
because satellite YoY wasn't yet computable for it).
The pre-registered falsification criterion (r ≤ 0) was not met, so H1
survives — but r = 0.11 is weak. This should not be read as confirming a
usable "official tracks observed" relationship. At this sample size, a
correlation this size is barely distinguishable from noise. Do not build
a trading or monitoring signal on this number as it stands.
One outlier exceeding the pre-registered ±2σ divergence threshold:
2025-03 (divergence z = +2.97). Official industrial YoY growth spiked
to 7.7% — the highest print in the series — while the composite satellite
signal was mildly negative that month (z = −0.34). 2026-03 shows the same
directional pattern, more mildly (divergence z = +0.78, not an outlier).
Likely explanation (flagged as a caveat, not proven): NBS does not
publish standalone January/February industrial figures at all — confirmed
empirically in this same dataset (see Antithesis, CNY check below) — and
resumes in March with a print that plausibly reflects catch-up/base
effects from the two omitted months. Satellite inputs have no equivalent
reporting gap and continue producing ordinary monthly readings through
Jan/Feb. The March comparison may therefore be comparing NBS's compressed
catch-up figure against satellite data that never had an equivalent gap
to catch up from — a structural artifact of Chinese official reporting
conventions, not necessarily new information from satellite data. This
reading is directionally consistent across both March observations in the
window, which is suggestive but is still only n=2.
H2 — Yunnan dry-season signal: dip present, not falsified, and distinct from a national pattern
Yunnan's dry-season seasonal index averages 0.962; wet-season averages
1.098 (dip magnitude −0.137) — Yunnan's radiance runs about 14% below
its own trailing 12-month baseline in dry-season months (Nov–Apr) and
about 8% above baseline in wet-season months (May–Oct). A real, sizeable
seasonal swing, computed over 41 dry-season and 37 wet-season monthly
observations spanning 2019-12 through 2026-05.
National antithesis check: dry season 1.039 vs wet season 1.022
(magnitude +0.018) — essentially flat, no dip nationally, over the same
41/37 month split. This is the key result: the seasonal dip is not a
generic China-wide winter lighting pattern — it is specific to (or at
least far stronger in) Yunnan, which is consistent with, though it does
not prove, the hydropower-curtailment story.
Non-ferrous smelting, weak secondary leg as flagged in advance:
dry-season mean YoY growth 4.96% vs wet-season 6.13% (n=8 dry, n=13 wet
months only — the official series' short window limits this badly).
Direction is consistent with the curtailment story, but this is a
national, multi-metal aggregate blending every province and every
non-ferrous metal, on a small sample — suggestive at most, not evidence
on its own.
H2 is not falsified. The core physical prediction — a measurable
Yunnan-specific dry-season dip — held up against the pre-registered test
and against the antithesis check that could have undermined it (a
China-wide pattern would have falsified the "Yunnan-specific" framing;
it didn't appear).
Antithesis checks performed
Composition effects. Correlation between headline industrial YoY and
non-ferrous-smelting YoY over their 21 shared months: r = 0.425 —
moderate positive co-movement, not near 1.0. Non-ferrous metals are one
contributing sector among many to the headline number, not a dominant
driver of it. A headline divergence in H1 cannot be attributed to the
non-ferrous/aluminium sector specifically on this evidence.
Chinese New Year timing. The official series has zero January or
February observations across its entire available history — NBS simply
doesn't publish them standalone. This structurally removes the sharpest
form of CNY-driven distortion from H1's comparison (there's no Jan/Feb
official print to compare against a satellite reading in the first
place), but it is very likely the underlying cause of the March catch-up
effect noted in H1 above — the same distortion re-surfacing one month
later in a different shape, not eliminated so much as displaced.
Real vs. nominal / base effects. Verified: compute.py reads only the
two "Growth Rate (Year-over-year percentage change)" series
(ef1b1765960d45a29b4d7c4ca91be916, 5d9322cf50b44f9c937ac60a77ce0c29)
and never the sibling "Accumulated Growth Rate" series — enforced by
which series_ids were staged into data/, not by a runtime check.
Nighttime lights is not aluminium-specific — unresolved confound.
Yunnan's dry-season dip could reflect winter tourism patterns, Spring
Festival travel, weather, or any other regional seasonal effect, not
smelter curtailment specifically. Nothing in this analysis rules that
out; the antithesis check above only rules out one alternative
explanation (a generic national pattern), not this one.
Mirror-statistic check: not applicable, as declared in advance — this
is a single-country domestic-vs-satellite comparison, not a bilateral
trade flow with a counterparty ledger.
FactIQ vintage caveat. Every official NBS value used here is FactIQ's
current, revised print (Phase 1 finding, reconfirmed by FactIQ directly —
see findings/01-vintage-probe.md), not what was originally published
for that month. A real limitation for a domain framed as "official vs.
observed."
Data-quality finding surfaced during staging (not anticipated in the hypothesis)
Both nighttime-lights series' catalog metadata claimed begin_time:
2024-01-01. The underlying data_points table actually has complete
monthly coverage back to 2019-01-01 (89 of 89 possible months, no gaps)
— confirmed via COUNT(*)/MIN/MAX against the raw table, not the
series catalog. This is a sharper version of the Phase 0 finding that
dataset-level metadata can be stale ("trust series.end_time, not
dataset metadata") — here it extends to series-level begin_time being
simply wrong. Practical effect: this project actually had ~5 more years of
usable night-lights history available than the pre-registered hypothesis
assumed, which is why H2's seasonal-index test could use 7 dry seasons'
worth of data instead of the 2 originally anticipated. Anyone building
further on FactIQ's satellite_nightlights catalog metadata should query
data_points directly rather than trust begin_time/end_time on the
series row.
Caveats (restated from hypothesis.md; all still apply)
The H1 overlap window is short (20 months) — too short for robust
statistical inference from a single correlation number. r = 0.11 is a
first structural pass, not a validated relationship.
Non-ferrous-metals-smelting is a national, multi-metal aggregate, not an
aluminium-only or Yunnan-specific series — the closest available proxy,
not a match. The composition check above quantifies how loose that proxy
is (r = 0.425 to the headline it's meant to help explain).
Yunnan reservoir levels, the originally intended direct lead indicator,
remain confirmed absent from FactIQ (Phase 0) — H2 is necessarily an
indirect test and cannot become a direct one with this data source.
NO2 data (used nationally in H1, staged but not used for Yunnan in the
computed results) carries real cloud-cover gaps — Yunnan NO2 specifically
had only 33 of 43 possible months with any usable reading, many below
FactIQ's own 0.2 valid-obs-share confidence threshold. Not a blocker
here since Yunnan NO2 wasn't used in either hypothesis's final
computation, but a real constraint on any future extension that wants a
smelting-specific emissions signal for Yunnan directly.
FactIQ's official NBS data is not vintage-aware (Phase 1, reconfirmed by
FactIQ directly) — every historical month used here is today's revised
print, not what was known at the time.
Bottom line
H1: not falsified, but weak. A same-month "official industrial growth
tracks a satellite composite" relationship is not well supported by the
available ~20 months of data (r = 0.11). One likely-explainable outlier
(2025-03) accounts for a large share of what correlation exists. This is
a structural first pass, not a usable signal in its current form.
H2: not falsified, and more interesting. Yunnan shows a real,
seasonally-recurring radiance dip that the rest of China does not show
over the same period — consistent with, though not proof of, the
dry-season hydropower-curtailment story this domain set out to test. The
one confound this analysis cannot rule out (non-curtailment regional
seasonality specific to Yunnan) remains open, and the direct test that
would actually settle the mechanism — reservoir levels — is unavailable
through FactIQ, now and for the foreseeable future per their own reply
(see findings/01-vintage-probe.md addendum).
Both findings should be read as a first structural pass on genuinely
short official-data history, not validated models — exactly as flagged
in the pre-registered caveats before any value was pulled.
Pre-registered hypothesis
Domain A — China Industrial Activity vs. Satellite Reality
Status: PRE-REGISTERED, 2026-08-04. No comparison values have been
pulled at the time this file is committed — series existence and coverage
windows only (metadata, not results). Per project principle, this hypothesis
will not be edited after results are computed; if it fails, the failure is
recorded, not the hypothesis.
Data sources (exact identifiers confirmed present as of 2026-08-04)
Official (FactIQ china schema, dataset nbs, National Bureau of
Statistics of China):
National industrial value-added, YoY growth: ef1b1765960d45a29b4d7c4ca91be916
— "Value-added of Industrial Enterprises above Designated Size, Growth
Rate (Year-over-year percentage change)". Monthly, %. Coverage per series
metadata: 2024-06 to 2026-06.
Non-ferrous metals smelting value-added, YoY growth: 5d9322cf50b44f9c937ac60a77ce0c29
— "Value-added of Smelting and Pressing of Non-ferrous Metals, Growth
Rate (Year-over-year percentage change)". Monthly, %. Same coverage.
This is the aluminium-sector proxy. NBS does not publish an
aluminium-only value-added series; this code also includes copper, lead,
zinc, and other non-ferrous metal smelting. It is the closest available
official aggregate, not a match.
Satellite/observed (FactIQ satellite schema, dataset
satellite_nightlights, NASA Black Marble):
National China nighttime lights, mean monthly radiance:
sat:ntl:CHN:mean_radiance. Coverage: 2024-01 to 2026-05.
Yunnan Province nighttime lights, mean monthly radiance:
sat:ntl:CHN:yunnanprovince:mean_radiance. Same coverage.
FactIQ's own dataset documentation instructs comparing the same calendar
month year-over-year rather than month-to-month, because moonlight/
atmospheric correction makes short-run wiggles noisy. This methodology
follows that guidance directly (YoY radiance change) — which also happens
to match the official series' own YoY framing.
Air quality (FactIQ satellite schema, get_geo_data, live Sentinel-5P
aggregation, no series_id — fetched by region/date range):
NO2 tropospheric column, region CHN (national) and CHN/Yunnan
(province), monthly aggregation. Coverage: 2018-> , ~3 day lag. Used as a
secondary corroboration signal only — NO2 is a general combustion/
traffic/industrial proxy, not aluminium-smelting-specific.
China national daily maritime export volume: pw:country:CHN:export.
Daily, 2019-01-01 to present. Used only as a tertiary corroboration input
to the national composite (Yunnan is landlocked — no port-level Yunnan
proxy exists).
H1 — National divergence index
Official monthly industrial value-added YoY growth and a satellite-derived
composite industrial-activity YoY growth (built from national night lights,
national NO2, and national port export volume) should be positively
correlated over the overlap window — 2024-06 through 2026-05, ~24 monthly
observations, bounded by the satellite series' 2024-01 start plus the
12-month YoY lag it requires.
Method (deterministic — implemented in compute.py, no manual or LLM
judgment at compute time):
For each of the three satellite/observed inputs, compute month-over-
same-month-prior-year % change.
Z-score each input's own YoY-change series, using that series' own
mean/stdev over the overlap window (z-score against own history — the
same convention already used project-wide for the drift check and the
planned scout agent).
Composite satellite signal = simple average of the three z-scores per
month. Equal weighting, declared here in advance, not tuned after
seeing results.
Z-score the official industrial value-added YoY series the same way,
over the same window.
Divergence index = z(official) − z(composite satellite), by month.
Falsification: if the correlation between z(official) and the
composite satellite z-score is ≤ 0 over the full window — no positive
relationship at all — H1 is falsified. The "official vs. observed"
comparison this domain is built on does not hold even directionally, and
that will be reported as a failure, not adjusted.
H2 — Yunnan dry-season hydropower curtailment signal (aluminium overlay)
Method note (amended 2026-08-04, before any data was fetched — see note
at end of section): uses a deseasonalized radiance ratio, not YoY growth.
The specific hydropower reservoirs needed to observe curtailment directly
are confirmed absent from FactIQ (Phase 0 finding). This tests the
necessarily weaker, indirect prediction instead: Yunnan's nighttime
radiance should sit measurably below its own trailing 12-month baseline
during the dry season (defined a priori as November–April, the
conventional Yunnan hydropower low-water period) compared to
non-dry-season months. If the curtailment story holds, national
non-ferrous-metals-smelting value-added YoY growth should also tend to be
relatively weaker in dry-season months — though this leg is expected to be
weak and noisy, since the national series blends Yunnan with every other
province and every other non-ferrous metal. That expectation is stated
here, in advance, not fitted after the fact.
Method (deterministic, in compute.py):
For each month of Yunnan radiance, compute a seasonal index = that
month's radiance ÷ the trailing 12-month mean radiance ending that
month (falls back to the longest available trailing window at the
start of the series, logged explicitly, never silently padded).
Classify each month as dry-season (Nov–Apr) or wet-season (May–Oct).
Compare the mean seasonal index across dry-season months to the mean
across wet-season months, over however many months of each are
available in the window.
Why not YoY growth, as H1 uses: a YoY change in radiance compares a
month to the same month one year earlier. If Yunnan curtails hydropower
in the same months every year, both the numerator and its year-ago
denominator are equally suppressed, and YoY growth would show no dip at
all even if a real, stable seasonal pattern exists — YoY only reveals
changes in curtailment severity between years, not the existence of the
seasonal pattern itself. The deseasonalized ratio above is the direct test
for a recurring dip; it is used here instead, and only here — H1 keeps its
YoY-based method because H1 is explicitly comparing against an official
series that is itself already YoY.
Falsification: if Yunnan's dry-season seasonal index is not measurably
lower, on average, than its wet-season seasonal index, across the two dry
seasons available in the window (Nov 2024–Apr 2025, and Nov 2025–Apr 2026
partial, bounded by data through 2026-05), H2's core physical claim is not
supported by this data and will be reported as such. There is no reservoir
data to fall back on — this is the whole test.
Amendment note: the original committed version of this section (commit
d918279) specified a YoY-growth-based test for H2, which — on review before
any data was touched — does not actually test for a recurring seasonal
pattern, for the reason given above. This correction is made before any
comparison value has been fetched (only series metadata had been queried at
that point); it is a methodological fix caught in review, not a
post-results adjustment, and is being committed as a visible amendment
rather than silently folded into the original text.
Antithesis — required counter-checks before any result is called a finding
Composition effects. National industrial value-added blends many
sectors; a move can come from anywhere, not the non-ferrous/aluminium
sector specifically. Check whether the non-ferrous-smelting series moves
with or against the broader industrial aggregate before reading anything
into it alone.
Chinese New Year timing. CNY falls in January or February depending
on the lunar calendar and shifts industrial activity between those two
months every year. The window here spans at most two CNYs (Feb 2025,
~Feb 2026) — any Jan/Feb divergence must be checked against the actual
CNY date for that year before being read as a real signal rather than a
calendar artifact.
Real vs. nominal / base effects. NBS "Growth Rate (Year-over-year
percentage change)" series are real (volume) measures per NBS
methodology. The "Accumulated Growth Rate" variant (not used here) is
measured against a shifting year-to-date base and is not comparable
month to month — compute.py must only ever read the YoY series, never
the Accumulated one, and this will be asserted in code, not just stated
here.
Nighttime lights is not aluminium-specific. It reflects any change in
electrified activity in a province — consumer, residential, unrelated
industrial — not smelter curtailment specifically. A Yunnan dip could
reflect tourism, weather, or any other regional shock. This is a genuine
confound the available data cannot rule out, only flag.
Mirror-statistic check: not applicable. This is a single-country
domestic-vs-satellite comparison, not a bilateral trade flow with a
counterparty ledger — flagged as not applicable rather than silently
skipped.
FactIQ vintage caveat. The official NBS series pulled through FactIQ
carries no vintage guarantee (Phase 1 finding). Every value used here is
FactIQ's current, revised print, not the figure as originally published.
Real limitation for a domain framed as "official vs. observed" — stated
here and restated in the results.
Caveats (known before results; will be restated in the results writeup)
The overlap window is short (~24 months) — too short for robust
statistical inference from a single index number. Results are a first
structural pass, not a validated model.
Non-ferrous-metals-smelting is a national, multi-metal aggregate, not an
aluminium-only or Yunnan-specific series — the closest available proxy,
not a match.
Yunnan reservoir levels, the originally intended lead indicator, are
confirmed absent from FactIQ (Phase 0) and cannot be added here.
NO2/night-lights data carry their own latency and cloud/atmospheric
noise (Phase 0). Comparisons follow FactIQ's own YoY guidance.
FactIQ's official NBS data is not vintage-aware (Phase 1) — this
comparison uses today's revised print for every historical month, not
what was known at the time.
Ask about the data covers every domain on the site