> ## Documentation Index
> Fetch the complete documentation index at: https://www.worldmonitor.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# China Data Coverage

> Complete inventory of WorldMonitor's China data lanes, public surfaces, source status, cadence, freshness, and access boundaries.

This page is the entry point for WorldMonitor's China data. It describes the
launched and explicitly blocked source contracts; it is not a claim that every
upstream source is healthy at this moment. Current transport and content health
remain visible through the China projection in `/api/health`.
`/api/seed-health` reports whether the China coverage evaluator itself ran
recently; a fresh evaluator heartbeat does not prove healthy China content.

## Coverage inventory

| Lane | Sources and method | Primary surface | Refresh contract |
| - | - | - | - |
| Global China projection | BIS, IMF, China energy spine, UN Comtrade reporter 156, CCFI, China market index, China news sources, eight reviewed aviation hubs, HKO, and Western Pacific hazards | China country summary and operator health | Source-specific; evaluated hourly |
| Official macro | NBS and SAFE revision-aware observations; PBoC and GACC candidates remain explicit unavailable rows | REST snapshot and Pro MCP `get_economic_data` with dataset `china-macro` | 36 hours |
| Official release calendar | NBS release calendar plus provisional PBoC LPR dates verified against ChinaMoney/CFETS notices | China macro bootstrap and Pro MCP `get_economic_data` with dataset `china-release-calendar` | 36 hours |
| Policy and enforcement | CAC, SAMR, MIIT, MOFCOM, NDRC, and PBOC official documents | China country brief and `chinaPolicyEvents` bootstrap | 6 hours |
| Cross-Strait activity | Taiwan Ministry of National Defense daily claims with separately attributed Japan Joint Staff context | Force Posture and China decision signals | 3 hours |
| Corporate disclosures | SSE and SZSE public metadata for a reviewed issuer basket; HKEX is explicitly blocked | `chinaCorporateDisclosures` bootstrap and China decision signals | 30 minutes |
| Stock Connect turnover and margin | SSE and SZSE public aggregate statistics for northbound turnover and margin financing balances | `market:china:stock-connect:v1` snapshot and the China health projection | 60 minutes |
| Logistics corridors | Four reviewed corridors composed from six named source families | REST/UI detail; MCP receives a bounded decision-signal summary | On request; healthy aggregate cached 5 minutes |
| Activity nowcast | Deterministic comparison of official macro vintages with seven reviewed proxy families | REST/UI detail; MCP receives a bounded decision-signal summary | On request; healthy result cached 15 minutes |
| Decision-signal composition | Bounded composition of macro, policy, Cross-Strait, disclosures, corridors, and nowcast | Country brief, public RPC, bootstrap, and Pro MCP | 15 minutes |
| Bilateral HS4 continuity | Annual UN Comtrade import baskets for the reviewed country/strategic-product registry | PRO `GET /api/supply-chain/v1/get-country-products` and route-exposure workflows | `0 6 1 * *` |

## Health projection registry

The China health projection tracks these stable contracts. `launched` means the
lane is admitted to the China projection; it does not override the lane's live
freshness or content status.

| Contract ID | Coverage | Launch state |
| - | - | - |
| `economic.bis-policy` | BIS policy rate | `launched` |
| `economic.imf-macro` | IMF macro snapshot | `launched` |
| `energy.jodi-oil` | JODI oil | `blocked` — `CHINA_UPSTREAM_ROW_UNAVAILABLE` |
| `energy.jodi-gas` | JODI gas | `blocked` — `CHINA_UPSTREAM_ROW_UNAVAILABLE` |
| `energy.spine` | China energy spine | `launched` |
| `trade.comtrade-reporter-156` | UN Comtrade reporter 156 | `launched` |
| `supply-chain.ccfi` | China Containerized Freight Index | `launched` |
| `market.china-index` | China country market index | `launched` |
| `market.china-corporate-disclosures` | Official SSE/SZSE corporate disclosures | `launched` |
| `market.china-stock-connect` | SSE/SZSE Stock Connect northbound turnover and margin balance | `launched` |
| `news.china` | China news digest | `launched` |
| `aviation.china-hubs` | Eight reviewed China aviation hubs | `launched` |
| `macro.china-snapshot` | Normalized China macro snapshot | `launched` |
| `macro.china-release-calendar` | China release calendar | `launched` |
| `policy.official-events` | Official policy and enforcement events | `launched` |
| `hazards.western-pacific-cyclones` | Western Pacific cyclone identity | `launched` |
| `hazards.hko-warnings` | Hong Kong Observatory warnings | `launched` |
| `military.cross-strait-activity` | Official Cross-Strait activity baseline | `launched` |

JODI remains available to existing global energy products. Its China oil and
gas contracts stay blocked because the reviewed upstream country index does not
currently publish substantive `CN` rows. A healthy global JODI heartbeat
therefore cannot be presented as China coverage.

Detailed method and source contracts:

* [Official macro and policy](/docs/china-official-macro-policy)
* [Corporate disclosures](/docs/china-corporate-disclosures)
* [Logistics corridors](/docs/china-logistics-corridors)
* [Cross-domain decision signals](/docs/china-decision-signals)
* [Activity nowcast methodology](/docs/methodology/china-activity-nowcast)
* [Shared provenance contract](/docs/decision-signal-provenance)

## Status and missingness

Source arrival is not the same as usable content. China health evaluates
transport freshness and content freshness separately. A successful request can
still publish stale, partial, empty, or timestamp-unknown content.

The public contracts use explicit states:

* `available` or `healthy` means the required payload passed its domain
  validation and freshness rules;
* `partial` or `degraded` means some reviewed coverage is missing, stale, or
  invalid while other evidence remains usable;
* `stale` means the last valid observation is outside its content budget;
* `unavailable` means no usable observation can be published; and
* `blocked` means a source was deliberately not launched, normally because
  robots, terms, transport, or source-substance review did not pass.

Missing categories are never converted to zero, normal, unchanged, or current.
Last-good preservation keeps its original observation time and reports the
current transport failure.

## Stock Connect turnover and margin

Four official exchange endpoints compose `market:china:stock-connect:v1`. They
sit on the two exchange hosts already covered by the corporate-disclosure terms
review, and all four are admitted as `admitted_aggregate_statistics`: public
aggregate market statistics only, with no per-investor and no per-order data.

| Source ID | Exchange | Series | Endpoint |
| - | - | - | - |
| `sse-northbound` | SSE | Northbound turnover | `https://query.sse.com.cn/commonSoaQuery.do` with sqlId `FW_HGTZL_HGTSCSJ_HGTCJGK_MRTJ` (沪股通成交概况) |
| `sse-margin` | SSE | Margin balance | `https://query.sse.com.cn/marketdata/tradedata/queryMargin.do` (融资融券汇总) |
| `szse-northbound` | SZSE | Northbound turnover | `https://www.szse.cn/api/report/ShowReport/data` with CATALOGID `SGT_SGTJYRB` (深股通交易日报) |
| `szse-margin` | SZSE | Margin balance | `https://www.szse.cn/api/report/ShowReport/data` with CATALOGID `1837_xxpl` (融资融券交易总量) |

The reviewed terms records are the same ones the disclosure lane uses: SSE
[official legal terms](https://www.sse.com.cn/home/legal/), robots.txt not
published (404); SZSE
[applicable rules and notices](https://www.szse.cn/application/laws/),
robots.txt present but empty (200).

Northbound net flow is not available, because this source does not publish it.
Both exchanges stopped disclosing the northbound buy and sell split on
2024-08-16, so only gross turnover survives. The payload states that directly:
`northbound.netFlow` is
`{ status: 'unavailable', reason: 'EXCHANGE_STOPPED_PUBLISHING_BUY_SELL_SPLIT' }`,
alongside `netFlowDiscontinuedOn: '2024-08-16'`. Turnover is two-way trading
activity, buys and sells counted together. It is not capital entering or leaving
the mainland market and must never be read as a flow.

The rest of the contract:

* every published value is normalized to CNY. SSE quotes margin in yuan; every
  other figure arrives in 亿 (1e8) or 万 (1e4) and is converted;
* a combined SSE and SZSE figure is published only when both exchanges report
  the same trade date. Otherwise the combined value degrades with reason
  `TRADE_DATE_MISMATCH`, which doubles as the freeze detector: one exchange that
  stops advancing is visible immediately instead of after a staleness budget
  expires;
* margin publishes on a T+1 lag, and northbound publishes after each session
  closes;
* if one margin source has a transport failure, the adapter retains the complete
  last-good SSE/SZSE margin pair for less than three hours after verification.
  `margin.retained` identifies this fallback. `margin.verifiedAt` and the common
  trade date stay unchanged across repeated failures. A current SSE observation
  is never combined with an older SZSE observation. Verification checks each
  exchange's total against financing plus securities lending, allowing only
  SZSE's independent rounding to 0.01 亿 (CNY 1 million);
* expired or incomplete prior pairs, malformed responses, conflicting trade
  dates, and simultaneous margin-source failures do not qualify for retention.
  Source errors and `status: 'degraded'` remain visible during retention. A
  successful complete refresh clears `margin.retained` and updates `verifiedAt`;
* SZSE endpoints are date-keyed, so the seeder pins the date from the exchange
  trading calendar
  (`https://www.szse.cn/api/report/exchange/onepersistenthour/monthList`) and
  probes back a bounded number of trading days. Within each run, later sources
  and dates reuse the successful proxy exit. If that exit fails, the existing
  bounded fallback skips that already-failed exit for the same request.
  Request and time budgets are unchanged; and
* the lane runs hourly as a member of the `seed-bundle-market-backup` Railway
  bundle.

## Bilateral HS4 import baskets

The bilateral store covers one shared HS4 catalogue: the reviewed
`bilateralHs4Code` entries in `scripts/shared/comtrade-strategic-products.json`
plus the HS4 headings of every commodity in
`scripts/shared/supply-vulnerability-commodities.json`. The scheduled seeder
and the on-demand public fallback request the same catalogue, in two requests
of at most 20 headings each; the fallback can also request one heading on its
own, described below. Each country shard contains
annual imports by HS4 product and the leading exporter partners. It supports
country exposure, route impact, multi-sector shock, and the PRO
`get-country-products` route. Detailed bilateral rows are not part of the
anonymous China summary.

The authenticated Comtrade route sends one four-year period window, `Y-2`
through `Y-5`, for each of the two HS4 batches. The normalizer keeps the newest
year per product-and-partner pair, so a response cannot silently mix annual
values. When `COMTRADE_API_KEYS` is absent, the public preview route cannot
accept a period list and instead tries `Y-2` followed by `Y-3`.

The scheduled production contract is deliberately quota-bound:

| Control | Contract |
| - | - |
| Railway cron | `0 6 1 * *` — 06:00 UTC on the first day of each month |
| Provider quota | 500 keyed calls per month |
| Seeder request budget | 480 |
| Freshness gate | 24 days, bypassed only by an explicit `FORCE_RESEED=true` |
| Country payload TTL | 40 days |
| Health staleness threshold | 35 days |
| Coverage floor | 110 country shards |

A run below the 110-shard floor writes `partial` seed metadata rather than
claiming full success. Failed reporters preserve an existing shard for at most
two consecutive runs; after that, the shard may expire so the on-demand public
fallback can probe it again. Rate limits, quota exhaustion, and request-budget
exhaustion publish partial coverage and stop the run instead of overwriting
last-good country data with empty payloads.

### Aggregate-only rows

Every bilateral request, scheduled or on demand, pins the second partner, the
mode of transport and the customs procedure to their aggregate values
(`partner2Code=0`, `motCode=0`, `customsCode=C00`). Without them Comtrade
returns one row per partner, second partner, transport mode and customs
procedure — roughly nine rows per partner. That multiplicity, not the heading
count, is what filled the public preview route's 500-row cap: a single German
heading reached the cap on its own, so a whole-catalogue fallback ended
`incomplete` for exactly the large importers users ask about. With the filters
the same request returns one row per partner plus the reported World total.
Grouping already kept only the aggregate row per partner, so stored values are
unchanged; what falls is the row count, and the World total is now always
present.

### Stored keys

The canonical country shard `comtrade:bilateral-hs4:{ISO2}:v1` keeps the shape
it has always had: per heading, the leading five origins with value and share,
plus the denominator basis. Every derived scorer — import concentration, route
exposure, chokepoint indices — reads that list and sums over all of it, so a
longer list would move published scores with no method change to explain the
movement. Two bulk seeders also read every country shard through a pipeline
batched by key count rather than by bytes, so anything added to the canonical
payload arrives in one response body that nothing bounds. Deeper evidence
therefore cannot ride along on it, and lives in a sibling key instead.

`comtrade:bilateral-hs4-partners:{ISO2}:v1` holds, per heading, every origin
whose unrounded share of the denominator reaches 1%, padded up to a minimum of
five origins so a heading with one dominant supplier still carries context, and
capped at 25 whatever their share. The origins the rule leaves out are
published with the list as a count and a combined share, so a reader can state
how much of the trade it is not showing rather than implying the list is
complete. Each origin carries net weight in kilograms and, when the provider
reports one, a quantity with its unit from the pinned registry
`scripts/shared/comtrade-quantity-units.json`. Comtrade reports an unknown
weight as 0, so a 0 is stored as absent rather than as a confirmed zero. The
sibling key shares the country shard's 40-day TTL and the same preservation and
TTL-extension rules. Only `get-country-products` reads it.

`comtrade:world-exports-hs4:v1` is one run-level snapshot of every reporter's
exports of every reviewed heading: per heading, the observation year, the
reporters that filed that year ranked by exported value, each with value in USD
and net weight when reported, and `unrankedReporterCount`, the reporters whose
newest filing for the heading is older. Those late filers or lapsed exporters
are left out of the ranking, so a rank is a rank among that year's filers and
can change when they file: the brief prints it as "rank N of M reporters filing
YEAR" and states the unranked count. The run reserves two requests for it against the request budget
before it attempts the first reporter — one per catalogue batch, with the
reporter omitted and the partner pinned to World, so a single request answers
for every reporter at once. Reserving first keeps the per-reporter budget
pre-check honest and stops a budget abort from dropping the snapshot
altogether. It shares the 40-day TTL. Its outcome is recorded in seed metadata
and published through `/api/seed-health`; any state other than `observed` is a
coverage gap, because a supplier's absolute scale and its world rank come from
this key alone. Only `get-country-products` reads it, and only for a requested
heading. A scale is attached to an origin only when the snapshot's observation
year for that heading equals the served row's year, so a late filer's older row
carries no scale rather than a rank from a year it does not describe.

### Single-heading recovery

When a PRO reader asks for a heading a stored shard does not carry, the
on-demand public fallback requests that one heading rather than the whole
catalogue. That is what makes recovery work for a large importer, whose
whole-catalogue fetch fills the preview cap. The outcome is recorded in a
per-heading sentinel, `comtrade:bilateral-hs4-lazy-heading:{ISO2}:{HS4}:v1`, so
one heading's failure cannot suppress recovery of a different heading for the
same country. Single-heading recovery never writes the canonical shard: one
heading is not a country basket, and a recovered heading is returned with its
own fetch time rather than the shard's. A recovered heading whose observation
year is older than the stored one is rejected.

Shards written before this evidence existed have no sibling key and no world
exports. They keep serving their leading-five origins, and the surfaces that
read them label the missing volume and scale as not available. No reseed is
forced to obtain the deeper evidence; the next scheduled run writes it.

## Access boundaries

* Country summary, corridor conditions, decision-signal summaries, provenance,
  and aggregate health are available through bounded public surfaces.
* Detailed corridor control towers and activity-nowcast evidence are REST/UI
  surfaces. MCP does not expose dedicated tools for either route; Pro MCP
  receives their bounded summaries through `get_china_decision_signals`.
* Pro MCP reads the canonical macro and release-calendar caches through
  `get_economic_data` with dataset `china-macro` or
  `china-release-calendar`.
* Detailed bilateral HS4 product rows and route exposure are PRO-only.
* The Pro MCP decision-signal tool receives the same bounded items and
  provenance as the public composition, not raw exchange documents or
  unrestricted source expansion.
* Proxy credentials, raw per-attempt request diagnostics, cache names, and
  detailed freshness thresholds remain operator-only. Public documentation
  names the configuration keys and selection semantics, not their values.

No China surface should be interpreted as independent verification merely
because its publisher is official. Publisher identity, extraction confidence,
classification confidence, corroboration, and freshness remain separate
claims.
