# What's new

Dated, agent-readable changelog for chinaqueue.com — derived from the human CHANGELOG.md.

## Iteration 41 — 2026-10-14

*Live on Vercel — and launched at chinaqueue.com*

- **Launched 2026-10-14:** DNS now points at Vercel; **https://chinaqueue.com** serves the site over HTTPS (Let's Encrypt), and `www` redirects to the apex.
- **Deployed:** Vercel project `chinaqueue` (root `frontend/`, Vite, mirroring ercotqueue) in Matt Prusak's projects; production at **https://chinaqueue.vercel.app**. `/`, `/compute`, `/map`, `/llms.txt` and `/data/summary.json` return 200, Markdown pages serve as `text/markdown`, and a headless browser pass on production is clean.
- **Domains:** `chinaqueue.com` and `www.chinaqueue.com` (308 to the apex) are attached and verified. The exact Namecheap records (A `@` 76.76.21.21, CNAME `www` cname.vercel-dns.com) are in `docs/LAUNCH.md`; DNS is untouched until Matt switches it.
- **Analytics without the console error:** Vercel Web Analytics is a dashboard-only switch, and until it's on, its script 404s and the browser refuses it on every page. The analytics component now loads only when `VITE_ENABLE_VERCEL_ANALYTICS=1`.
- **Auto-deploy:** the project is linked to `mattprusak/chinaqueue` with `main` as the production branch, so every push deploys.
- **Still Matt's:** create a long-lived token for 1Password (the CLI's device session can't mint one) and enable Web Analytics. `.vercelignore` keeps raw data pulls out of CLI uploads.

## Iteration 40 — 2026-10-14

*H1 2026 data pass, English-first copy, and storage that is really storage*

- **Curtailment (/curtail, /absorption):** NEA's official H1 2026 utilization, wind 90.9% and solar 91.4% (93.2% and ≈94% a year earlier), alongside CREA and GEM's 360 TWh estimate that adds unreported curtailment. Provincial H1 rates were not published, so the 2025 table stays and says so. Province rates that were hardcoded in JSX now live in the data; the year-on-year change is shown in percentage points.
- **Spot market (/spot, home Price tile):** spot trading reached 11.6% of the 3,684.8 TWh traded in H1 2026 (medium- and long-term contracts 88.4%), up from ≈4.3% in Jan–Nov 2025 (NEA). Adds the Yunxiao DC transmission-rights trading notice (NDRC/NEA, 2026-06) and the 2030 unified-market targets (State Council General Office, 2026). Fixed: cumulative storage labelled as "new", and players that "quadrupled" (it was 1.7×).
- **Storage (/storage):** NEA new-type storage reached 153 GW / 396 GWh at end-June 2026 (+61%); Ember counts standalone batteries cycling 299 times in 2025, up from 146 in 2022, against a 350/year benchmark.
- **Pace (/pace):** H1 2026 added 72.1 GW of solar and 38.6 GW of wind (NEA), against 2025's record of ≈438 GW; the trailing-12-month series is unchanged.
- **Coal (/coal):** CREA and GEM count 30 GW of coal commissioned in H1 2026 (+43%), the most for a first half since 2016, with 2.7 GW retired and 274 GW permitted or building. NBS thermal output was +2.9% in H1 but −4.3% in August; no Jan–Aug total was published, so the page doesn't claim one. The 2026 capacity-price rule and the 15th Five-Year coal plan's wording are cited to NDRC.
- **Demand (/demand):** Jan–Aug 2026 consumption 7,173.0 TWh (+4.3%), with EV charging +55.1% and internet data services +42.5%; the 14th Five-Year Plan's 4.6 bn tce production-capacity floor against 5.13 bn tce actually reached; electrification 29.5% against a 35% 2030 target.
- **Nuclear and provinces:** the 125 GW figure is now labelled as operating plus approved or under construction, not installed; approvals per year 2022–2025 (10, 10, 11, 10); Xinjiang's lower-bound generation values render instead of "—".
- **Storage reclassification (site-wide).** GEM files reservoir dams as "conventional storage" and the fetcher counted them as Storage. They are Hydro. GEM's "Storage" is now pumped-storage hydro only: the active pipeline is 451 GW (was 512), 163 GW under construction (was 183), and operating hydro rises to 213 GW. GIPT's China export has no battery projects, which every storage label now says; battery figures come from NEA and Ember.
- **English-first copy on 11 pages** (curtail, spot, wiring, nuclear, gobi, flows, provinces, coal, demand, carbon, green certificates) and in the changelog history behind /whats-new: visible Chinese drops from up to 897 characters a page to short glosses. The pass caught display-unit errors: green certificates shown 10× too high, Inner Mongolia's 174.1 GW shown as "1,741 kW", /flows investment 10× too low, wrong carbon-market units.
- **Smaller fixes:** /fleet's coal-modernization copy derives from data (it mislabelled 339 GW as the whole coal pipeline); /methodology rewritten (GEM label read from data, curated-figure policy, refresh cadence); llms.txt and the data manifest in English; stale agent pages (index, fleet, transmission) regenerated from current data; new datasets `h1_2026.json` and `coal_h1_2026.json` registered and freshness-checked.
- **Verified:** check_data passes; tsc and the production build are clean; a headless pass over all 27 routes at 1280 and 390 px finds no console errors, failed requests or horizontal overflow.

## Iteration 39 — 2026-10-14

*/compute and the map overlays: where the power goes, and how it moves*

- **New /compute page and compute.md.** China's East Data, West Computing programme approved 8 national compute hubs and 10 data-centre clusters (NDRC, CAC, MIIT, NEA, 2021-12 and 2022-02): four renewable-rich resource hubs (Inner Mongolia, Gansu, Ningxia, Guizhou) and four demand hubs. Three of the four resource hubs sit in provinces whose 2025 solar utilization fell below 95% (Gansu above 10% curtailment). The page says plainly that the official framing is "absorbing renewable energy locally" and that the curtailment overlay is this site's own join. National figures: 2,185 EFLOPS of intelligent compute at end-June 2026 (+177%, MIIT), more than 80% of it in the hubs (National Data Administration, on its ~2,400 EFLOPS basis), and 196 TWh used by computing infrastructure in 2025, 1.9% of national demand (National Data Administration). MIIT's own regional split (east 55.9%, west 32.6%) is shown, so the headline is what China *wants*, not what it has done.
- **Map overlays (/map):** 36 UHV DC lines drawn from hand-placed converter-station endpoints (precision labelled per line, approximate), pumped-storage plants from GEM coordinates (operating and under construction), and the 10 compute clusters. Touch-friendly: nearest-line selection, two-tap province drill-down on phones, and a list picker for keyboard users.
- **Wiring:** route and nav (Explore → Use → AI compute hubs), home "Use" tile shows computing's share of demand, sitemap, llms.txt and the data manifest register `/compute` and `compute.json`.

## Iteration 38 — 2026-10-13

*Launch gate — the site tells its story, shares cleanly, and stops breaking*

- **Five-step story on the home page.** The three-tile "tension" panel becomes **Build → Waste → Move → Price → Use**: 881 GW under construction, wind + solar's capacity-vs-generation gap, 304 GW on 45 UHV lines, the medium/long-term contract share, and 2025 demand. Every tile reads its number from its page's dataset; the hardcoded UHV teaser (45 lines / 52k km / 304 GW) and the "~560 GW dated COD" copy now derive from data.
- **Explore follows the same arc.** Groups are Build, Waste, Move, Price, Use and About, in a two-column menu with one-line blurbs. `/race` moves out of the primary nav into Build as "China vs US".
- **Share card.** `scripts/build_og.py` renders a 1200×630 `og.png` (under construction, active pipeline, wind + solar installed, pipeline-by-fuel bar) from `summary.json`/`pace.json` and rewrites the description meta tags from the same numbers; `og:image` and `twitter:image` tags added. Runs in `refresh.sh`.
- **Bugs that would have shipped.** `/transmission` crashed for every visitor (React #310, a `useMemo` after the early returns). The favicon was a 404 on every page. `/whats-new` overflowed 245 px on phones and linked commits on a private repo.
- **Curtailment, traced.** CREA is the Centre for Research on Energy and Clean Air (the adapter said "China Renewable Energy Association"). The 360 TWh (+49%) figure is confirmed in CREA & GEM's H1 2026 coal review (reported plus unreported curtailment). The "solar 6.6% / wind 8.5%" rates traced to nothing and are replaced by NEA's official H1 2026 utilization: wind 90.9%, solar 91.4% (93.2% / 94.0% a year earlier).
- **Honest GEM release label.** "Aug 2026" was our pull date. The source line now reads the ArcGIS layer's own edit date ("layer updated 2026-02-18; pulled …"), and `/pace` derives its as-of from the NEA series instead of a hardcoded "2026-05". The GEM fetcher retries transient timeouts.
- **Data refreshed:** NEA capacity through 2026-07 (solar 1,290 GW, wind 690 GW, total 4,080 GW), generation through 2026-08.
- **Deploy prep:** `vercel.json` moves to `frontend/` (the Vercel root) with framework/build settings; its SPA rewrite was double-escaped, so the file-extension exclusions never matched, now fixed and tested. `scripts/with-vercel-token.sh` reads the token through the 1Password service-account helper only. `frontend/public/data` is no longer gitignored, so Vercel can build from git as ercotqueue does.
- **Verified** with a headless Chromium pass over all 26 routes at 1280 px and 390 px (console errors, failed requests, horizontal overflow, CJK in visible text).

## Iteration 37 — 2026-08-08

*Light mode — the whole site flips from terminal-dark to daylight*

- **Theme tokens** centralized in `index.css`: page `#f1f5f9`, cards `#ffffff`, elevated `#e8edf4`, borders `#d7dde6`; text `#0f172a` / `#475569` / `#64748b`; fuel + status colors darkened for contrast on white. 32 components flip via the tokens alone.
- **Charts (8 files):** grid/axis strokes from dark slate to light grey `#cbd5e1`, tooltip backgrounds to `#ffffff` (borders `#e2e8f0`), tooltip label text to dark `#0f172a`, axis-lines lightened.
- **Map:** choropleth ramp flipped to light→dark (`['#dbeafe' … '#1d4ed8']`), `rampStops` lightness stops swapped so high-value provinces pop dark on white, no-data grey `#e6e9ef`, province borders `#cbd5e1`, labels dark text with white halo, hover stroke dark.
- **Verified in real Chrome** across `/`, `/map`, `/pace`, `/race`, `/pipeline`: body `rgb(241,245,249)`, body text `rgb(15,23,42)`, cards `#ffffff`, h1s intact.

## Iteration 36 — 2026-08-08

*Pace & Momentum — how fast China is *actually* building*

- **New `/pace` page.** Headline reads **China is already at ~1,920 GW wind + solar — 1.6× the official 1,200 GW (2030) plan, hit ~6 years early**; the second card leads with the momentum figure: **~270 GW of new wind + solar in the trailing 12 months** (+180 GW solar, +90 GW wind YoY). The cumulative-installed line chart (solar/wind/total over the NEA series) and a **pipeline-to-steel bar** (delivered vs still-to-come per fuel) carry the visuals.
- **`scripts/build_pace.py` → `data/pace.json`** (no new sources — derived from the NEA monthly series + the GEM project layer already flowing through `refresh.sh`): per-fuel trailing-12m additions & YoY, wind+solar target progress, utilization trend, **delivery (operating share of GEM-tracked capacity — 41% overall; only ~32% of storage delivered, 18% of nuclear)**, mix-in-motion, and human-scale analogies.
- **"In plain terms" strip** — the McKinsey/FT hook: *"~12 Three-Gorges Dams of new wind + solar in 12 months … and China still added ~89 GW of new thermal"* — the two-track buildup in one line.
- **The absorption signal**: national average utilization hours at **230 h (down 4.6% YoY)** — build-out running ahead of demand, folded in as the contrarian read.
- **Wiring:** route `/pace` + **Pace** in the primary nav (after Race); `refresh.sh` now runs `fetch_us.py` and `build_race.py` too (closing the Iteration-35 gap so a clean refresh self-serves the Race); sitemap **70 URLs**, `llms.txt`, and `manifest.json` register the page + `pace.json` dataset.
- **Verified in real Chrome:** cumulative chart = 3 line curves, pipeline-to-steel = 16 bar segments, page reads clean end-to-end.

## Iteration 35 — 2026-08-08

*The Power Race — China vs the United States, apples-to-apples*

- **New `/race`** — the marquee head-to-head. Hero reads **China 881 GW under construction vs US 55 GW — 16×**, with an operating/pipeline/total/projects scoreboard (each with a China÷US ratio), a **by-fuel under-construction bar** (China's storage 183 GW vs 0, coal 183 GW vs 0, solar 249 GW vs 24 GW), a **commissioning-by-year line** for both, and a full by-fuel ledger.
- **`scripts/fetch_us.py`** now persists the US rows (`data/generated/us_projects.json`, 15,422) and `fetch_gem_gipt.py` keeps the US reserve stats in the China payload, so every refresh stays apples-to-apples.
- **`scripts/build_race.py`** emits `data/race.json` + `data/race.csv` (same date-stamped, cite-ready treatment as the map exports).
- **Nav**: `Race` added to the primary bar; **Downloads** gains a "Power Race — US vs China" CSV card; sitemap (68 URLs), `llms.txt`, and `manifest.json` all register the new page/data.
- Scope rule honored: China is the subject; the **US-vs-China is the only cross-border framing**, sourced and cited to GEM GIPT, with a caveat that this is research-grade, not EIA/NEA official totals.
- Verified in real Chrome: by-fuel bar = 13 marks, commissioning line = 2 curves; page reads clean end-to-end.

## Iteration 34 — 2026-08-08

*The map — and the canonical data download*

- **New `/map` — interactive provincial buildout choropleth.** 31 mainland province-level divisions, colored live from the GEM GIPT pipeline by a metric control (**Under construction / Pipeline / Total / Projects**) and a **fuel toggle** (All, Coal, Wind, Solar, Storage, Nuclear, Gas/Thermal, Hydro, Other). Hover = tooltip + top-5 label + highlight; **click a province → `/pipeline?province=X`** (deep-linked, seeded project table). No-data regions (HK/Macau/Taiwan) render greyed against the legend. Default: **881 GW under construction**, solar view 249 GW.
- **Geometry (in-repo asset, `scripts/assets/china_provinces.geo.json`, 392KB):** simplified from DataV.GeoAtlas `areas_v3/100000_full` (CC BY) — rounded, island-filtered, dedicated label centroids (`cc`). Built by **`scripts/build_map.py`** (one-time `build_map_geometry.py`), emitting `data/map.json` (geometry+values) every refresh.
- **New `/downloads` — the cite-ready data surface.** Static, date-stamped exports: **`projects.csv` (34,295 rows, 5.8MB** — inr/name/developer/province/fuel/capacity/status/lat/lng/COYear), **`province_buildout.csv` (province×fuel × total/active/UC)**, `projects.json`, `map.json`, `summary.json`. **Copy-citation block** rendered from `data/citation.txt` (APA + plain, GEM GIPT CC BY 4.0, NEA, DataV boundaries, definitions).
- **`Pipeline` now reads `?province=`** — the map's drill path seeds the table + a "Filtered to X · clear" banner (`2,163 / 34,295` rows for Inner Mongolia).
- **Nav restructured** — top-level **Status · Map · Pipeline · Insights · Downloads** + a grouped **Explore ▾** dropdown (Provinces, Coal, Storage, Fleet, Transmission, Nuclear, Carbon, Gobi, Demand, Flows, Spot, Wiring, Curtail, Green-Certificates, Absorption, Inputs, Methodology, What's New, About); mobile ☰ menu.
- **Wiring:** `refresh.sh` (build_map before build_summary), `build_summary.py` (llms.txt advertises map + downloads; manifest +2 datasets incl. map.json), `build_feeds.py` SPA_ROUTES +`/map`,`/downloads`. Sitemap → **66 URLs**.
- **Verified in-browser** — 34 paths render (3 grey no-data), fuel recolor (solar → amber ramp, headline 249 GW), metric & drill-down, `/downloads` cards + citation, all build artifacts 200.

## Iteration 28 — 2026-08-07 · ``38d08b6``

*Electricity spot market (电力现货) — the market dimension*

- **New `/spot` page + `/spot.md`** — how much power is auctioned vs contracted, and what prices emerge as renewable supply overtakes demand.
- **Data (`data/sources/spot_market.json`):** 2025 market volume **6,640 TWh (+7.4%, 4th straight year >60%)**; **medium- and long-term contracts (中长期) 95.7% (6,350 TWh)** vs **spot ~<10%** share of traded volume (NEA); wind+solar **22%** of generation (+25.8%); thermal generation **first decline in a decade (−0.7%)**, 6,330 TWh; 2025 renewables added **519.3 TWh — covering all new demand**; 5-min real-time clearing (96→288/day) in western Inner Mongolia/Zhejiang/Chongqing/Jiangxi/Shanxi; 21 provinces let renewables bid both volume and price; players 47,000→81,000.
- **Negative-pricing surface (the signature insight):** Shandong first sub-zero 2019 → **systemic by 2025** (Zhejiang Jan −0.2 yuan/kWh, western Inner Mongolia Apr −0.004, Sichuan Sep all-day); framed as a supply-surplus signal, not a loss (medium/long-term contracts + capacity subsidies + the coal-power capacity price keep generation revenue positive — Sichuan Sep 22 hydro settlement 183 yuan/MWh &gt; monthly 177). Germany 2024: 468 negative hours (~5%) as reference.
- **Wiring:** `build_marquee.py` + `check_data.py` (S1) + `build_summary.py` (manifest: 13 datasets, 2 new md pages) + `build_feeds.py` SPA routes; **fixed pre-existing gap — `/flows` was never in SPA_ROUTES or manifest md pages; both /flows & /spot now registered.**
- **Verified in-browser** — headline grid, medium/long-term contract floor, negative-pricing timeline, sources/caveats all render; `/spot.md` + `/data/spot_market.json` return 200. Sitemap 46 → **51 URLs**.

## Iteration 29 — 2026-08-07 · ``e2248a6``

*Province-level wiring (跨区跨省输电) — who sends, who receives*

- **New `/wiring` page + `/wiring.md`** — down from the national corridors to the provinces: which grids push power long-haul, which load centers pull it in, across the three corridors.
- **Data (`data/sources/province_wiring.json`):** 2024 national ladders **cross-region 924.2 TWh (+8.8%)** and **cross-province 1,995.1 TWh (+7.0%)** (China Electricity Council (CEC) Annual Report 2025, labelled as the authoritative totals, not to be conflated with West-to-East Power Transmission (西电东送) corridors); top sender **Inner Mongolia** (State Grid East Inner Mongolia 2025 outbound **227.7 TWh, 3rd straight year first among provinces**); top receiver **Guangdong** (China Southern Power Grid West-to-East record **261.5 TWh**, the first province nationwide to reach a 160 GW peak); Yunnan (southern-corridor hydro, cumulative past 2,000 TWh), Sichuan (central-corridor hydro, Sichuan–Chongqing 1000kV), Shanxi/Shaanxi (northern coal power) as direction+role (exact:false where no single annual kWh published).
- **Northern stake (signature):** Inner Mongolia's send-side dominance locks in the 15th Five-Year Plan (十五五) UHV build — Kubuqi 12GW → Beijing-Tianjin-Hebei (western Inner Mongolia–Beijing-Tianjin-Hebei ±800kV, 2027), four AC + four DC lines exporting over 50GW, new-energy (wind + solar) capacity 174.1 GW (3.4× the start of the 14th Five-Year Plan, 54% of capacity).
- **Wiring:** `build_marquee.py` + `check_data.py` (W1 + cross-region≤cross-province invariant) + `build_summary.py` (llms.txt, datasets manifest 14, markdown_pages) + `build_feeds.py` SPA routes.
- **Fully primary-sourced** (CEC, NEA/Guangming Daily, SASAC State Grid, China News Service, People's Daily China Energy News) — no X-derived figures.
- **Verified in-browser** — headline grid (924.2 / 1,995.1 / 227.7 / 261.5 TWh) binds correctly, all panels render, `/wiring.md` + `/data/province_wiring.json` return 200. Sitemap 51 → **54 URLs**.

## Iteration 33 — 2026-08-07 · ``000062c``

*Nuclear operators H1-2026 — who builds it, built into /nuclear*

- **New "Who's building it" panel on `/nuclear`** + `operators_h1_2026` block in `data/sources/nuclear.json` — operator-level granularity for the double peak. Fully primary (CNNC 601985 half-year generation announcement 2026-07-03 · China Daily/CGN 2026-03-05).
- **CNNC (601985):** controlled **27 in-op / 26.212 GW + 18 under construction/approved / 20.675 GW**. H1 company gen **119.669 TWh (−1.73%)**, nuclear 97.972 TWh (−1.89%), avg 3,738h. **Zhangzhou 2 in commercial operation 2026-01-01** (first 2026 unit) → Zhangzhou +60.8%.
- **CGN — Hualong One in series build:** **18 units under construction**; Taipingling 1 grid-connected (first Hualong One clean power for the Guangdong–Hong Kong–Macao Greater Bay Area); San'ao 1 fuel loaded + first nuclear-steam turbine roll achieved → final push to grid connection; **Hualong 2.0 demonstration launched, 3.0 being planned**.
- **New 5th headline (36):** units under construction across the two operators (CNNC 18 + CGN 18).
- **Deep X-scan v2 (x-research):** returned only unrelated noise (ADHD research, India hydrogen, EV trucks) — **X is the wrong medium for authoritative China nuclear; web primary is where it lives.** Included as data-honesty note.
- **Wiring:** `check_data.py` invariant unchanged (operating ≤ total still holds), useNuclear interface + operators_h1_2026, Nuclear.tsx panel, nuclear.md section.
- **Verified in-browser** — 5-headline grid (62/64/8/110 GW/36), operators panel binds (27/26.212 GW + 18; CGN 18 Hualong One units), `/data/nuclear.json` + `/nuclear.md` 200.
- Sources added: CNNC 601985 half-year generation announcement, China Daily 2026-03-05, CGN.

## Iteration 32 — 2026-08-07 · ``5810e2b``

*Curtailment by province (分省弃风弃光) — new /curtail page*

- **New `/curtail` page + `/curtail.md` + `data/sources/province_utilization.json`** — the buildout's hardest math: utilization is *falling*, and the drop is concentrated province-by-province. Distinct from fleet-level `/absorption`; this is the province-by-province grid.
- **National trend (National New Energy Consumption Monitoring and Early Warning Center, 2026-02-06 + 2026-01-12):** 2025 wind utilization **94.3%** / solar **94.8%** — vs **96.3% / 97.0%** (2024 Jan–Nov, same basis). A clear multi-point slide as new installations compounded on an export-constrained grid.
- **Four provinces >10% solar curtailment rate (2025):** Tibet **(35.1%, util 65.8%**, November alone 63.8%) · Qinghai **16.6%** (<90%) · Xinjiang **13.7%** (<90%) · Gansu **10.4%** (~85%, Gansu-to-Zhejiang power exports lift it to 90%+). The entire problem is the western basin — the regions building most are least able to absorb.
- **Spectrum:** 100% utilization = Shanghai/Zhejiang/Fujian/Chongqing (east-coast load centers); <95% second tier = Hebei/western Inner Mongolia/eastern Inner Mongolia/Shaanxi/Ningxia/Yunnan.
- **The "turning point" (NEA/Science and Technology Daily 2025-07-04):** "western green-power utilization reaches a turning point" — western-rich regions' utilization fell through Jan–May 2025, solar <90% everywhere except Ningxia. Station-level: Shenzhen Energy's Shule solar station, Jan–Apr 2025 station utilization only 67.61%; CGN 2024 wind/solar utilization hours −3.1%/−16.8%; Datang wind 2127h(−107)/solar 1211h(−81).
- **Export is the lever:** the Hami–Chongqing DC line (Hami→Chongqing, 14.2 GW of paired generation, renewables >70%) delivers 36 TWh/yr, >18 TWh of it from wind and solar; Gansu-to-Zhejiang exports lift Gansu 85%→90%+. **Market-driven too:** the market-based reform of renewable on-grid tariffs (2025-06-01) shifts pressure from utilization rate onto price — the count of "used" energy matters less than what it clears at.
- **Deep X-scan (x-research, 3 queries):** all three serialized on the xAI lock and timed out — surfaced no additional signal. Iteration stays **100% primary** (the monitoring center, NEA/Science and Technology Daily, NEA's 2025 renewable grid-operation release, NRDC).
- **Wiring:** `check_data.py` C2 + invariant (national 0-100, 2024>2025 declining trend, per-province range) + build_marquee + build_summary (llms.txt, markdown_pages, datasets manifest 16) + build_feeds SPA route + nav. Sitemap 57 → **58 URLs**.
- **Verified in-browser** — headline grid (94.3% / 35.1% / 4 / ≥10%) + national trend cards (▼ 1.7pp wind, ▼ 2.2pp solar) + 4-province table + spectrum + drivers all bind; `/curtail.md` + `/data/province_utilization.json` return 200.

## Iteration 31 — 2026-08-07 · ``6f913ca``

*Nuclear — the baseload constant, new /nuclear page*

- **New `/nuclear` page + `/nuclear.md` + `data/sources/nuclear.json`** — the buildout's dispatchable backbone: the only zero-carbon stone that holds the grid still as wind+solar pass 47% of installed capacity; ~4.6% of generation today, ~doubling by 2030.
- **Fleet (2026-06, National Energy Administration):** **62 in commercial operation / 66.14 GW (+8.6% y/y)**; **53 approved or under construction / 62.93 GW** (18 straight yrs world-#1 construction); total installed broke **125 GW**, continuously world's largest.
- **Generation (2025):** **485.2 TWh (+7.6%)** = 4.6% of national, 11.4% of non-fossil; system-best **89.1% load factor** (avg 7,809h, +126h y/y).
- **The approvals engine (signature):** since the 2019 restart, **64 units approved (>¥1 trillion cumulative direct)** — from intermittent to normalized approvals. **Fresh catalyst 2026-07-31:** the **15th Five-Year Plan (十五五) first batch**, 8 units / 4 projects >¥170 billion: Liaoning Zhuanghe 1-2 & Zhejiang Jinqimen 3-4 (Hualong One), Huizhou 5-6 (**Hualong One 2.0**, 1217MW), Shandong Laiyang 1-2 (**Guohe One**, the world's largest passive PWR, 1543MW); ripple econ ~¥500 billion (Li Jinkai est.).
- **Two indigenous three-gen lines in parallel:** Hualong One = world's largest Gen-III fleet (10 in commercial operation + 37 under construction/approved, domestic+overseas; Fuqing 5 global first, 1,000 continuous safe days / ~37 TWh); Guohe One complements south/north. **Spectrum complete:** high-temperature gas-cooled reactor (world's first Gen-IV commercial, Shidaowan 2023) + Linglong One (IAEA-cleared land SMR, grid **2026**) → large-PWR / industrial-heat / small-modular.
- **Plan:** 2030 **~110 GW** operating (*15th Five-Year Plan for New-Type Power System Construction*, NDRC Energy [2026] No. 942, 2026-08-03); operating fleet likely **surpasses the US before 2030** (*China Nuclear Energy Development Report 2026*); China **joined the Declaration to Triple Nuclear Energy 2026-03** (38 countries) — the only member building at this pace.
- **Honest X-scan:** x-research CLI surfaced only market/crypto noise (no authoritative nuclear-buildout signal) — iteration stays primary-led (NEA/China Nuclear Energy Association/State Council/NDRC/company announcements). `signals` array intentionally empty.
- **Wiring:** `check_data.py` N1 + invariant (operating ≤ total installed) + build_marquee + build_summary (llms.txt, markdown_pages, datasets manifest 15) + build_feeds SPA route + nav. Sitemap 54 → **57 URLs**.
- **Verified in-browser** — headlines (62/64/8/110 GW) + fleet + generation + approvals engine + reactor spectrum + 15th Five-Year Plan all bind; `/nuclear.md` + `/data/nuclear.json` return 200.

## Iteration 30 — 2026-08-07 · ``a89d049``

*Desert mega-base (沙戈荒) per-batch commissioning depth — built into /gobi*

- **/gobi gains a "Commissioning, batch by batch" section** with primary NEA/NDRC figures, replacing the earlier approximate 92/90.8 roundings.
- **Batch 1:** announced **2021-11** as **50 bases / 97.4 GW** across **18 provinces + the Xinjiang Production and Construction Corps** (NEA's Pan Huimin 2025-01-23); by **end-2024: 92.0 GW built (~95%), 90.8 GW operating** (the honest denominator, ~20% of the 2030 ceiling).
- **14th Five-Year Plan adds:** the desert-base belt put on **>130 GW** of new capacity 2021–25 (NDRC press-conference series on delivering the 14th Five-Year Plan, Li Chuangjun 2025-10-29).
- **First UHV-export base (milestone unit):** Xinjiang's northern Tianshan foothills base (Santanghu, Hami), the paired generation for "Xinjiang power to Chongqing", Xinjiang's third export corridor — **14.2 GW** (coal 4.0 + wind 7.0 + solar PV 3.0 + CSP 0.2 GW), **1.2 GW/4.8 GWh** storage, renewables **>70%**; first units live **2025-06-13** (2×1 GW coal), all-but-CSP commissioning targeted **2025-12**; **36 TWh/yr** via Hami–Chongqing ±800kV → ~a quarter of Chongqing's power (Xinhua 2025-06-13).
- **Batch 2/3:** rolling, NEA commits to continuing; Three-North (north, northeast, northwest) belt, absorption-first + thermal-plus-renewables co-delivery.
- **Wiring:** `check_data.py` new invariant (first-batch operating ≤ built ≤ planned) + gobi hook/page/md all updated; fully primary-sourced, no X-derived figures.
- **Verified in-browser** — commissioning metrics bind (97.4 / 91.99 / 90.79 / 130 GW), export-base callout renders, `/gobi.md` returns 200.

## Iteration 27 — 2026-08-07 · ``ae5876a``

*15th Five-Year Plan (十五五) UHV forward-plan — X-scan + primary verification, built into /flows*

- **X scan (x-research) surfaced a coherent 15th Five-Year Plan UHV thread** — grid capex, transfer-capacity targets, new-line pipeline — which primary NEA/China Electricity Council (CEC)/SASAC/CCTV sources confirmed.
- **/flows extended with a 15th Five-Year Plan (2026–2030) forward-plan card:** State Grid capex **¥4 trillion (+40%, ~¥800 billion/yr)**; national grid capex **¥5 trillion+, +80%**; cross-region transfer capacity target **up >30%** vs the end of the 14th Five-Year Plan (NEA 2026-01); **15 new UHV-DC lines → West-to-East Power Transmission (西电东送) past 420 GW**; 6+ regional interconnect projects (~40 GW); ~200 GW/yr new wind+solar driving the need.
- **UHV network count corrected & verified:** **46 projects (22 AC + 24 DC)** operating at end-2025, +9.5% y/y (Zhiyan Consulting/industry stats) — replaces the earlier 45 line-level figure; caveat notes granularity vs the GEM /transmission table.
- **New "New lines, project by project" timeline:** 14th Five-Year Plan wrap-up 2025 (Longdong-Shandong, Ningxia-Hunan, Hami-Chongqing, Jinshang-Hubei + Qinghai-Tibet interconnection phase II) and 15th Five-Year Plan openers 2026 (Northern Shaanxi-Anhui commissioned 2026-06-30; Gansu-Zhejiang, the world's first flexible UHV-DC, 2,370 km).
- **"The deserts have named highways":** each Gobi anchor desert maps to a load sink — Kubuqi→Shanghai, Ulan Buh→Beijing-Tianjin-Hebei, Badain Jaran→Sichuan, Tengger→Jiangxi — tying /flows directly to /gobi.

## Iteration 26 — 2026-08-07 · ``0679bdb``

*Provincial scoreboard v2 (generation-by-source), Gobi v2, cross-provincial flows, data automation*

- **Provinces v2 — generation by source, refreshed 2025.** New wind-generation, solar-generation, and total-generation tables (calendar 2025, NBS/China Electricity Council via Bjx (Polaris power news)): IM wind **203.3 TWh** (~4× its 51.2 TWh solar), Hebei solar **44.3 TWh**, Shanxi **25.9 TWh**; total gen IM **851.7** (+3.8%), Jiangsu **643.8**, Shanxi **440.6**, Hebei **411.5** (+4.9%). Capacity tables stay end-2024; highlights/caveats updated to separate the two reference years. Generates a capacity-vs-output insight (IM wind output ~4× solar; Hebei solar nearly matches Xinjiang).
- **Gobi v2 — structural depth.** Four anchor deserts (Kubuqi/Ulan Buh/Tengger/Badain Jaran) carry **~284 GW** of the 455 GW 2030 plan; coal-mining subsidence areas + other desert/Gobi complete the rest. Second batch concentrates in the Three-North belt with an **absorption-first (消纳) / thermal-plus-renewables joint-delivery** emphasis vs the export path. First **UHV-export mega-base** brought first units on-line 2025 (non-CSP operational targeted 2025-12).
- **New `/flows` — cross-provincial flows / West-to-East Power Transmission (西电东送).** West-east corridor capacity rose **270 GW (end-13th Five-Year Plan) → ~340 GW (end-14th Five-Year Plan, ~+26%)**; 2024 cross-region UHV-DC shipped **~420 TWh** of clean power (~60% of long-haul outflow, +70%); **45 operating UHV projects**; southern network lifetime delivery ~3,300 TWh (by 2024-07). Sources: NEA/People's Daily/Xinhua/CCTV.
- **Automation — `scripts/check_data.py` data gate.** Freshness check (as_of within horizon) + cross-field numeric consistency (demand sector sum == total; gobi 140+315==455; capacity ranks descending). Wired into `refresh.sh` as step 4 — fails the pipeline on stale or inconsistent data. Caught and fixed real issues on first run (coal capacity as_of corrupted; demand sector-key schema).
- Discovery updated: 1 new dataset (manifest now **12**), new `/flows` page + `flows.md`, +2 llms.txt page links; sitemap 45 → **46 URLs**.

## Iteration 25 — 2026-08-07 · ``206ed8c``

*Gobi desert mega-base (沙戈荒) tracker, sectoral demand, coal capacity-price layer*

- **New `/gobi` — desert & Gobi mega-base tracker.** The single biggest planned renewable program anywhere: 2030 target **455 GW** (140 self-use / 315 UHV export), 2025 tranche 200 GW, first-batch progress (92 GW built / 90.8 GW operating end-2024, largely complete 2025). Four anchor deserts (Kubuqi/Ulan Buh/Tengger/Badain Jaran). Sources: NDRC/NEA *Planning and Layout Scheme for Large Wind and Solar Bases* + NEA 2025 progress.
- **New `/demand` — total electricity consumption by sector.** NEA 2026-01-17 annual release: 2025 crossed **10 trillion kWh** (10,368.2 TWh, +5.0%). Sector split (TWh) — primary 149.4 (+9.9%), secondary 6,636.6 (+3.7%, ~64% share), tertiary 1,994.2 (+8.2%), residential 1,588.0 (+6.3%); tertiary + residential supplied **50% of growth**; EV-charging +48.8%, info/software +17.0% drivers.
- **`/coal` now layers in the capacity-price mechanism (煤电容量电价).** NDRC Pricing [2023] No. 1501: uniform fixed cost **¥330/kW·yr**, most provinces recover ~30% (¥100), 7 transition grids ~50% (¥165: Henan/Hunan/Chongqing/Sichuan/Qinghai/Yunnan/Guangxi), some step to ¥165 from 2026-01-01 (e.g. Jiangsu). Why it matters: separates "keep the plant for reliability" from energy value — structurally underwrites coal's continued presence.
- **Arc:** +2 routes/nav (Gobi, Demand), +2 hooks, +2 agents `.md`; `coal.md` extended; `data/sources/{gobi,demand,coal_capacity_price}.json`; manifest now **11 datasets**; sitemap **45 URLs**; llms.txt +3 links. `build_marquee.py` + `build_summary.py` + `build_feeds.py` extended.
- **Verified:** tsc + vite clean; all three render real sourced data at preview; sector math cross-checked against NEA bulletin (149.4 + 6,636.6 + 1,994.2 + 1,588.0 = 10,368.2 TWh).

## Iteration 24 — 2026-08-07 · ``a308e6e``

*Marquee China-primary features: Provincial scoreboard, green certificates (绿证), Carbon market*

- **New `/provinces` — Provincial power scoreboard.** Where the buildout actually lands: top-10 provinces by installed capacity, by wind capacity, and by generation, from NEA+NBS+China Electricity Council (curated via Bjx (Polaris power news)/China Energy Media). Inner Mongolia leads all three (257.7 GW installed, 86 GW wind, 817.9 TWh generated). Generation figures are shown exactly where a source gave them, otherwise as the confirmed threshold (≥600 TWh tier etc.) — no invented precision.
- **New `/green-certificates` — green-certificate market.** NEA monthly GEC bullets: 2025 issued 29.47 B (18.93 B tradable), traded 9.3 B (2.5 B via green-power deals); annual issuance/trading table 2023–2025; the vintage price split (2024-vintage vs 2025-vintage certificates). Chinese-primary moat — no maintained English series.
- **New `/carbon` — national carbon market.** MEE annual: mandatory ETS 235 million tonnes / ¥14.63 billion in 2025 (+24% y/y), cumulative 865 million tonnes / ¥57.66 billion; 2024 compliance 8.194 billion tonnes due, ~99.99% done; voluntary CCER market avg ¥70.76/t, 9.2194 million tonnes cumulative (¥650 million). Page data uses clean unit conversions (Mt / Gt / bn RMB instead of ¥100-million units), verified against the source.
- **Curated-source pattern:** each dataset is a committed hand-curated snapshot in `data/sources/{green_certificates,carbon,provincial}.json`, shipped by new **`scripts/build_marquee.py`** (adds `generated_at`) to the gitignored `frontend/public/data/`. Wired into `refresh.sh` — refresh = edit source JSON as new bullets land, re-run. All within the **monthly/annual cadence** constraint.
- **Hooks + pages:** `useGreenCert` / `useCarbon` / `useProvincial`, three SPA pages, routes, and three nav links (Provinces, green certificates, Carbon). Agent-facing `green-certificates.md`, `carbon.md`, `provinces.md`.
- **Discovery:** manifest now 8 datasets; llms.txt gains 3 page links + 3 data links; sitemap 38 URLs (3 new SPA routes); `build_summary.py` + `build_feeds.py` extended.
- **Verified:** tsc + vite clean; `/green-certificates`, `/carbon`, `/provinces` render real sourced data at preview; all three data JSONs serve 200; unit conversions spot-checked against sources.
- **Files:** `scripts/build_marquee.py` (new), `scripts/build_summary.py`, `scripts/build_feeds.py`, `scripts/refresh.sh`, `data/sources/{green_certificates,carbon,provincial}.json` (new), `frontend/src/hooks/{useGreenCert,useCarbon,useProvincial}.ts` (new), `frontend/src/pages/{GreenCertificates,Carbon,Provincial}.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `frontend/public/{green-certificates,carbon,provinces}.md` (new), `README.md`, `CHANGELOG.md`.

## Iteration 23 — 2026-08-07 · ``d5e3bea``

*robots.txt + auto-discovery, discovery surface complete*

- **New `frontend/public/robots.txt`** — `Allow: /` for all agents + a `Sitemap:` directive (`https://chinaqueue.com/sitemap.xml`). Served `text/plain`; already excluded from the SPA rewrite in `vercel.json`.
- **`frontend/index.html`** — added `<link rel="alternate" type="application/rss+xml">` to `/feed.xml` (auto-discovery in browsers/feed readers) and `<link rel="sitemap">` to `/sitemap.xml`. Fixed `og:url` from `https://www.chinaqueue.com` → `https://chinaqueue.com` to match the rest of the site's canonical apex.
- **Verified:** dist serves `robots.txt` as `text/plain` (200); served HTML contains both the RSS auto-discovery and sitemap links; feed still `text/xml`; tsc + vite clean.
- **Files:** `frontend/public/robots.txt` (new), `frontend/index.html`, `README.md`, `CHANGELOG.md`.

## Iteration 22 — 2026-08-07 · ``047610c``

*RSS feed + sitemap, both generated from the changelog*

- **New `frontend/public/feed.xml`** — RSS 2.0 "What's New" feed, one item per iteration (title, description, pubDate, isPermaLink=false GUID), self-referencing atom link, generated from **`whatsnew.json`** (parsed from `CHANGELOG.md`).
- **New `frontend/public/sitemap.xml`** — 29 URLs: all 12 SPA routes + 9 agent markdown pages (`/xxx.md`) + `/llms.txt`, `/feed.xml`, `/sitemap.xml` + all 5 data files, with lastmod, changefreq (daily for llms.txt, weekly else) and priority per class.
- **New `scripts/build_feeds.py`** — derives both from `whatsnew.json` + `manifest.json`; wired into `refresh.sh` (4 build steps) and already covered by the `vercel.json` SPA-rewrite exclusion (`xml`).
- **`manifest.json`** `site` now carries `sitemap` + `rss` URLs; **`llms.txt`** gained a Machine-readable changelog data link + a **Discovery** section (sitemap, RSS).
- **Verified:** both files well-formed XML; preview serves `/feed.xml` and `/sitemap.xml` as `text/xml` (HTTP 200); tsc + vite clean.
- **Files:** `scripts/build_feeds.py` (new), `scripts/refresh.sh`, `scripts/build_summary.py`, `frontend/public/{feed.xml,sitemap.xml}` (generated), `README.md`, `CHANGELOG.md`.

## Iteration 21 — 2026-08-07 · ``e7cfd6b``

*What's New is now a live page + self-maintaining*

- **New `/whats-new` SPA page** (nav "What's New", between Methodology and About) — a rendered, newest-first timeline of every iteration, derived entirely from **`CHANGELOG.md` via `whatsnew.json`**: title, subtitle, date, commit hash (links to the GitHub commit), and bullets. Single source of truth: the human changelog.
- **New `scripts/build_whatsnew.py`** — parses `CHANGELOG.md` (`## [Iteration N] — date · hash` sections) into both the agent-facing **`frontend/public/whats-new.md`** (19 entries, 22.4 KB) and the page data **`frontend/public/data/whatsnew.json`** (25.2 KB). Wired into `refresh.sh` (now 4 steps) so both auto-regenerate on every refresh.
- **`manifest.json`** catalog now lists `whatsnew` (5 datasets total).
- **Verified:** page renders the full timeline on `/whats-new` (Iteration 21 → 1, newest-first, commit links live); `.md` + `.json` content-types correct; tsc + vite clean; SPA routes unaffected; nav link present.
- **Files:** `frontend/src/pages/WhatsNew.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `scripts/build_whatsnew.py` (new), `scripts/refresh.sh`, `scripts/build_summary.py`, `frontend/public/{whats-new.md,data/whatsnew.json}` (generated), `README.md`, `CHANGELOG.md`.

## Iteration 20 — 2026-08-07 · ``f2626fa``

*Agent section completes: deep-dive pages + data manifest*

- **Three thesis deep-dive `.md` pages**, served `text/markdown` from `frontend/public/`: `/absorption.md` (0.51× gap, 310→230 h utilization, ~360 TWh curtailment, contract lock), `/coal.md` (543 units / 366.5 GW by status, 2026 front-load, modernization, contract lock), `/storage.md` (403 units / 512.3 GW, 2029–30 ~38 GW peak, State Grid Xinyuan / CSG).
- **`/whats-new.md`** — agent-readable changelog mirroring the human CHANGELOG.
- **`/data/manifest.json`** — machine-readable catalog (site, refresh source/date, all 10 markdown pages, all 4 datasets with live byte sizes), emitted by `build_summary.py`.
- **`llms.txt`** updated — Key resources now lists all 10 pages; Data links the manifest.
- **Verified:** tsc + vite clean; preview serves all new `.md` (`text/markdown`) and `/data/manifest.json` (`application/json`); llms.txt references the new pages; SPA routes unaffected.
- **Files:** `frontend/public/{absorption,coal,storage,whats-new}.md`, `frontend/public/data/manifest.json`, `scripts/build_summary.py`, `README.md`, `CHANGELOG.md`.

## Iteration 19 — 2026-08-07 · ``0349498``

*Agent-readable markdown section (mirrors ercotqueue.com/llms.txt)*

- **`/llms.txt`** — a live-generated agent index, emitted by `build_summary.py` from the real `summary.json` (source, project count, GW totals, refresh date + how-to-use/claim boundaries + links to md pages and data files). Mirrors ercotqueue's `text/plain` llms.txt structure exactly.
- **Five agent-readable `.md` pages** served as static `text/markdown` from `frontend/public/`: `/index.md`, `/about.md`, `/methodology.md`, `/fleet.md`, `/transmission.md` — each with live figures (fleet 23,080 units / 2,467.5 GW; transmission 45 lines / 304.4 GW / 52,304 km; the absorption and coal-paradox numbers), claim boundaries, and provenance.
- **`vercel.json`** updated — `md` added to the SPA-rewrite exclusion so `.md` URLs serve as files (`text/markdown`), not SPA routes.
- **Footer** links "Agent-readable summary (llms.txt)" on every page (discoverable, per ercotqueue).
- **Verified:** tsc + vite clean; preview serves `/llms.txt` (`text/plain`) and all five `.md` (`text/markdown`) with correct HTTP 200 content-types; SPA routes (`/absorption`) unaffected; footer link renders.
- **Files:** `scripts/build_summary.py`, `frontend/public/{llms.txt,index.md,about.md,methodology.md,fleet.md,transmission.md}`, `vercel.json`, `frontend/src/components/Layout.tsx`, `README.md`, `CHANGELOG.md`.

## Iteration 18 — 2026-08-07 · ``adc2a23``

*The why: coal's contract lock*

- **`absorption` page expanded** — the front page has shown the absorption gap since iteration 11, but *why it persists* was only gestured at. This iteration grounds the mechanism in a single cited primary source: the **CREA/GEM "Built for backup, contracted to run" H1-2026 coal review** (6 Aug 2026, surfaced via an authenticated X scan of the China power-buildout discourse).
- **Two figures added, both badged curated (not invented, not a chinadata series):**
- **Contract lock: 60–70%** of prior-year delivered electricity reserved for coal under medium/long-term contracts — a risk-management instrument become a barrier to clean-power integration. The numeric *why* behind the absorption shortfall.
- **Build vs retire: 10:1** — H1-2026 new coal commissioned (30 GW, +43% y/y) vs 2.7 GW retired. The coal fleet keeps growing even as it's used less.
- **New section** "Why the gap persists: coal has a contract lock" between the capacity-vs-generation chart and the cost/momentum grid: two hero metrics + a cited source note linking to energyandcleanair.org.
- **No new aggregate** — static content component; zero data-layer changes, zero summary.json bloat.
- **X-scan decision feed:** confirmed the ~360 TWh curtailment figure already on the page is *not* fabricated — CREA independently reports the same +49% y/y H1-2026 number, and the report confirms "enough to cover all new power demand" (overbuild is systemic).
- **Files:** `frontend/src/pages/Absorption.tsx`, `README.md`, `CHANGELOG.md`.
- **Verified:** tsc + vite clean; `/absorption` renders the new section with 60–70% / 10:1, the source link, and the curtailment card below it intact.

## Iteration 17 — 2026-08-07 · ``2eb2823``

*The grid can't absorb what it's building*

- **New `absorption` page** (`/absorption`) — the *sink* side of the thesis: every prior page showed supply (buildout, fleet, inputs); this one shows the binding constraint on all of it.
- **No new aggregate** — reuses `useNeaMonthly` (`utilization_hours`, `generation_mix_moment`, `solar`/`wind`/`total`, `insights`) from `nea_monthly.json`; every figure derived in the component.
- **Story:** wind + solar = **1,920 GW = 47.9%** of installed capacity but only **24.6%** of H1 2026 generation — a **0.51× absorption gap**. The mechanism is shown live: average fleet utilization falling **310h → 230h** (2023→2026) as China installs generation faster than the grid uses it. Growth momentum (solar 9.7×, wind 4.0× since 2017) sits beside the cost: ~**360 TWh** curtailed in H1 2026 (+49% y/y), badged as a curated CREA release figure, not a chinadata series.
- **Charts:** utilization-hours area chart (16-point series, never charted before) + capacity-vs- generation bar chart; four hero metrics (capacity share, generation share, absorption ratio, utilization).
- **Honesty:** curtailment is carried as a **curated/badged** insight (`~360 TWh`, +49%, solar 5.7→6.6% / wind 6.6→8.5%) with explicit provenance — it is not presented as a timeseries. The absorption ratio is derived from live NEA capacity + generation shares, not estimated.
- **Files:** `frontend/src/pages/Absorption.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `README.md`, `CHANGELOG.md`.
- **Verified:** tsc + vite clean; `/absorption` renders in-browser — H1 "The grid can't absorb what it's building.", hero metrics 47.9% / 24.6% / 0.51× / 230h −26%, both chart sections + two ResponsiveContainers mounted, curtailment badge shown, Absorption nav link present. (Layout measurement reads 5px in the headless dual-engine preview for *all* pages including nav — an environment artifact, not a page defect; body computed width is 1920px and DOM is complete.)

## Iteration 16 — 2026-08-07 · ``9e531f9``

*The machinery that makes the grid*

- **New `inputs` page** (`/inputs`) — the *inputs* side of the buildout, surfaced for the first time. Every prior page watched generators being built; this one watches the factories feeding them.
- **No new aggregate** — reuses the existing `useNeaMonthly` hook + `nea_monthly.json` (`coal_output`, `solar_cells`, `energy_mix` were already in the data, just not surfaced); derived figures computed in the component, not hardcoded. Zero summary.json bloat.
- **Story:** solar-cell manufacturing is ~**794 GW/yr** (from 66.2 GW in 2026-05 ×12) ≈ **63% of all solar China has ever installed**, every year — an export engine with a domestic buildout attached, which is exactly what the home-page absorption gap measures. Raw coal ~**397 Mt/mo**, **2.3×** since 2007 — the fuel the paradox runs on. Primary-energy mix coal **76.2% → 52.5%** since 1990.
- **Honesty:** the energy-mix source series tracks only coal/oil/gas/hydro (wind/solar are zeroed in every row) — so the page shows only those and *flags* that the renewables shift isn't visible in this lens, rather than fabricating a renewables arc.
- **Files:** `frontend/src/pages/Inputs.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `README.md`, `CHANGELOG.md`.
- **Verified:** tsc + vite clean; `/inputs` renders in-browser — H1 "The machinery that makes the grid.", three hero metrics (794.4 GW / 397.2 Mt / 52.5%), three live recharts SVGs (solar cells, raw coal, stacked energy mix), and the wind/solar-omission footnote; Inputs nav link present.

## Iteration 15 — 2026-08-07 · ``e403b47``

*The grid it already runs*

- **New `fleet` page** (`/fleet`) — the operating baseline the whole buildout story sits on. Every page so far covered *what's being built*; none covered *what exists*. This is the grid GEM tracks as already running (funnel_stage `5_operating`).
- **New `fleet` aggregate** in `build_summary.py`:
- *Scale:* 23,080 generators / **2,467.5 GW** operating.
- *By fuel:* Coal 1,022.2 (41.4%) · Solar 485.2 (19.7%) · Wind 443.7 (18.0%) · Storage 247.2 (10.0%) · Gas/Thermal 128.9 · Nuclear 58.1 · Other 57.3 · Hydro 24.9 GW.
- *Modernization flip* (`coal_modernization`): **operating** coal is 65.7% supercritical (SU 671.3 GW) / 34.1% ultra-supercritical (UL 348.6); the **buildout** flips it — 92.4% ultra-supercritical (UL 338.6 GW). China is modernizing the coal fleet even as it adds to it.
- **Honesty:** GEM's operating rows are a project-level subset — hydro in particular is undercounted (24.9 GW vs NEA's real fleet) — flagged explicitly as a lower bound, not the official total.
- **Files:** `scripts/build_summary.py`, `frontend/src/types/project.ts`, `frontend/src/pages/Fleet.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `README.md`, `CHANGELOG.md`.
- **Verified:** builder emits the aggregate; tsc + vite clean; `/fleet` renders in-browser — H1 "The grid China already runs.", fuel metric cards + horizontal bar chart (8 fuels), and the operating-vs-buildout modernization progress bars (operating SU 65.7% / buildout UL 92.4%); Fleet nav link present.

## Iteration 14 — 2026-08-07 · ``a91f799``

*The absorption answer*

- **New `storage` page** (`/storage`) — the direct-opposite pole to the /coal page. Where coal is "the paradox that won't stop" (front-loaded to 2026), storage is "the absorption answer": the mechanism the grid adds to close the central absorption gap (wind+solar are ~48% of capacity but ~25% of generation). Fully derived from existing GEM data (zero new sources, zero fabrication).
- **New `storage_buildout` aggregate** in `build_summary.py`, classified by the same `fuel_display="Storage"` the commissioning curve and UC totals use:
- *Active pipeline:* **403 units / 512.3 GW** (pre-construction 225.5 / 173 · construction 183 / 144 · announced 103.8 / 86).
- *When it lands:* dated units by COD year, peaking **2029–30 at ~38 GW/yr** (2026: 10.1 → 2035: 2.6) — the mirror-image slope of coal's front-loading. **26.1% coverage** (105/403 dated 2026+), flagged lower-bound, not a forecast.
- *Who builds it:* primary-owner grouping (first-listed before `;`/`[`). Table: State Grid Xinyuan 33.9 → CSG Energy Storage 13.6 → Three Gorges 11.5 → Sichuan Tietou 9.9 → ... The `(unknown)` tail (86.9 GW / 70 projects) is surfaced honestly as a dimmed bucket with a dynamically derived footnote.
- **No tech split** — GEM storage rows carry an unreliable technology field (several are labeled hydro), so this surface intentionally omits it rather than mislabel.
- **Files:** `scripts/build_summary.py`, `frontend/src/types/project.ts`, `frontend/src/pages/Storage.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `README.md`, `CHANGELOG.md`.
- **Verified:** builder emits the aggregate; tsc + vite clean; `/storage` renders in-browser — H1 "The absorption answer", the 2029–30 commissioning curve (SVG), status + owner tables, and the dynamic `(unknown)` footnote (87 GW / 70 projects); Storage nav link present.

## Iteration 13 — 2026-08-07 · ``9b9a847``

*The coal paradox, quantified*

- **New `coal` page** (`/coal`) — a dedicated deep-dive making the thesis's sharpest edge concrete: the thermal stack isn't shrinking, it's still being *added to*. Fully derived from existing GEM data (no new source, no fabrication).
- **New `coal_buildout` aggregate** in `build_summary.py` — coal rows are unit-level (a row is a generator), so it aggregates the active coal pipeline by status, COD year, technology, and primary owner:
- *Active pipeline:* **543 units / 367 GW** (construction 258 / 183 GW · pre-construction 216 / 131 GW · announced 69 / 52 GW).
- *When it lands:* dated units by COD year — **2026: 56 GW / 77 units → 2027: 20.3 GW / 28 units**. Forward-only filter (2026+) → honest **~19% coverage** flag (105/543 units carry a 2026+ COD year), labeled lower-bound, not a forecast.
- *Who builds it:* **primary-owner grouping** (first-listed before any `;` joint-venture separator or `[x%]` bracket) — the messy multi-owner strings are collapsed to clean rows. Table: Shenhua 20.6 → China Energy 17.9 → Datang 14.6 → Huadian 14.3 → Huaneng 14.2 → GD Power 13.3 → CN Coal 13.0 → Huaneng Group 10.0 GW.
- *What kind:* technology split — the buildout is nearly all **ultra-supercritical (UL)**, the most-efficient coal class, not retrofits of the old subcritical fleet.
- **Files:** `scripts/build_summary.py`, `frontend/src/types/project.ts`, `frontend/src/pages/Coal.tsx` (new), `frontend/src/App.tsx`, `frontend/src/components/Layout.tsx`, `README.md`, `CHANGELOG.md`.
- **Verified:** builder emits the aggregate (543 units / 367 GW, 2026: 56 GW); tsc + vite clean; `/coal` renders in-browser — H1 "The coal buildout that won't stop", metric cards (543 / 367 GW), commissioning curve, status + tech splits, and the 8-row owner table; Coal nav link present.

## Iteration 12 — 2026-08-07 · ``62136f2``

*Who's building China's grid*

- **New `developers` aggregate** in `build_summary.py` — groups the active pipeline by GEM `developer`, strips ownership-bracket suffixes (`[100%]`) for display, tallies project count + active GW + a per-fuel breakdown. Emitted into `summary.json`.
- **New "Who's building it" panel on the Pipeline page** — a horizontal fuel-bar concentration table of the top developers by active GW (China Huaneng 61.0 → China Three Gorges 11.5). The named "(unknown)" bucket is rendered separately (dimmed tail, derived count in the footnote, not hardcoded) and surfaced honestly: ~413 GW / ~2,169 active projects with no single developer — the distributed solar/wind tail. Reads "nuclear sits with Huaneng/CNNC/CGN, coal with China Energy/Huaneng/Huadian, storage with State Grid Xinyuan."
- Answers the scope doc's "*by whom*?" question — the last unanswered dimension of "how much, where, when, by whom."
- Files: `scripts/build_summary.py`, `frontend/src/types/project.ts`, `frontend/src/pages/Pipeline.tsx`, `README.md`, `CHANGELOG.md`.
- Verified: builder emits 12 developers; tsc + vite clean; panel + dynamic footnote rendered on `/pipeline` in-browser (11 named rows, fuel bars, 413-GW unknown tail).

## Iteration 11 — 2026-08-07 · ``2178c3e``

*When the buildout actually lands*

- **New `commissioning_curve` aggregate** in `build_summary.py` — buckets the active pipeline (construction + pre-construction + announced) by its `cod_year` field into per-year GW, split by fuel. Emitted into `summary.json` with an explicit `note`, `coverage_pct`, and `active_with_year_gw`.
- **New `CommissioningCurve` section on the home page** (after the tension panel) — horizontal stacked bars, one per year (2026: 93.9 GW → 2032), each segment a fuel using the existing fuel-color tokens; legend + per-year GW labels. Honest lower-bound framing: copies the coverage note verbatim ("only 9.6% of active projects carry a COD year — this shows when the *dated* buildout lands, not a full forecast"). Reads "coal leads 2026; storage dominates the later years."
- Data verified: 477/2,780 under-construction projects carry a COD year; curve = 2026: 93.9 GW (coal 56) → 2027: 48 → 2028: 34.6 → 2029: 40.4 → 2030: 43.4 (storage-led) → 2031: 5.7 → 2032: 3.6.
- Files: `scripts/build_summary.py`, `frontend/src/types/project.ts`, `frontend/src/pages/Home.tsx`, `README.md`, `CHANGELOG.md`.
- Verified: builder emits curve; tsc + vite clean; chart + footnote rendered in-browser (paragraph spacing confirmed in real DOM, not just AX snapshot).

## Iteration 10 — 2026-08-07 · ``9ec0785``

*The absorption story, made concrete*

- **New `curtailment` insight** in the NEA adapter — curated CREA-sourced figure (~360 TWh wind+solar curtailed H1 2026, +49% y/y; solar 5.7→6.6%, wind 6.6→8.5%). Explicitly flagged `curated: true` + `source` so it is never conflated with a chinadata timeseries (keeps the "never fabricate" rule in the data model itself).
- **Insights "The read"** now renders a "curated / sourced" amber badge and a per-insight source line on any insight carrying `source`/`curated`.
- **Home absorption-gap tile** ties gap → consequence: derives the magnitude from the curtailment insight and shows "~360 TWh of it was curtailed in H1 2026 (+49% y/y)" under the 47.9%→24.6% share.
- Files: `scripts/fetch_nea_monthly.py`, `frontend/src/hooks/useNeaMonthly.ts`, `frontend/src/pages/Insights.tsx`, `frontend/src/pages/Home.tsx`, `README.md`.
- Verified: adapter emits 4 insights; tsc + vite clean; both surfaces (Insights card + home citation) rendered in-browser.

## Iteration 9 — 2026-08-07 · ``5399756``

*The tension panel on the home page*

- New "The state of China's power system — three numbers that don't add up" section below the hero:
- **Buildout** — 2,493.9 GW prospective vs 880.9 GW under construction.
- **Absorption gap** — wind+solar are 47.9% of installed capacity but only 24.6% of generation ("only 0.5× as much generated as their capacity share").
- **Coal paradox** — 49.7% of generation H1 2026 (first below half) yet 1,514.7 GW of thermal still in the fleet.
- All values derive live from the NEA payload already on the page (no hardcoded stats, no adapter change needed, refresh-proof); panel is gated on the `generation_mix_moment` being present so it never flashes `0% → 0%` while the NEA fetch resolves.
- Files: `frontend/src/pages/Home.tsx`, `README.md`. Verified rendered in-browser (three tiles + narrative).

## Iteration 8 — 2026-08-07 · ``d855522``

*The coal-below-half generation-mix moment*

- Adapter now emits a `generation_mix_moment` block distinct from the primary-energy `energy_mix` series: electricity *generated by fuel*, H1 2026 — coal 49.7% (first time below half, vs 65.5% in 2016), renewables 41.2% (record), wind+solar 24.6%, gas+nuclear 9.1%. Sourced NEA via Reuters 2026-07-30.
- Insights gains a dedicated "Coal below half" panel (stat cards + share bar) with an explicit note that it is *generation by fuel*, NOT the primary-energy mix in Fuel & inputs — keeping the two jurisdictions clearly separated.
- Files: `scripts/fetch_nea_monthly.py`, `frontend/src/hooks/useNeaMonthly.ts`, `frontend/src/pages/Insights.tsx`, `README.md`. Verified: tsc + vite clean, rendered in-browser (4 cards, 3 share segments at 49.7 / 41.2 / 9.1).

## Iteration 7 — 2026-08-07 · ``a01c3f8``

*NEA electricity output (4th dataset) + Fuel & inputs depth*

- **Routing** (`build_uhv_transmission.py`) — new `routing` block derived from operating lines' `start_region`/`end_region`: top exporters (Inner Mongolia 58 GW, Sichuan 57.6, Xinjiang 28, Yunnan 23), top importers (Shandong 43, Jiangsu 39.2, Hubei 26.9, Guangdong 23), and top corridors (Inner Mongolia→Shandong 29 GW, Yunnan→Guangdong 23, Sichuan→Zhejiang 16). Routing framed on capacity only (`res`/`coal` = 0 on operating lines — no misleading fuel split).
- **Momentum** (`fetch_nea_monthly.py`) — `momentum_pct` + `momentum_series` on the generation payload, computed in the adapter: trailing-3-month run-rate vs prior 3 months (calendar quarters would mislead — source has gaps around Jan/Feb 2026). Latest -4.4% (Mar–May 2026 vs Oct–Dec 2025), 196 rolling points, labeled with a seasonality note (winter peak → spring dip).
- Transmission page shows the routing panel; Insights adds a momentum chart (0% ReferenceLine, up/down colored areas). Files: both adapters, `useUhvTransmission.ts`, `useNeaMonthly.ts`, `Transmission.tsx`, `Insights.tsx`, `README.md`. ## [Iteration 5/6] — 2026-08-07 · `0022958` / `fa8dde6`
- **4th dataset** — `china-electricity-generation`: NEA/NBS monthly electricity output (current period, ~784 TWh as of 2026-05, +6.3% y/y, 201 points), surfaced on Insights with a monthly TWh chart.
- **Fuel & inputs** — raw coal output (monthly Mt) and solar cell manufacturing (monthly GW of modules) series, plus the long-run primary-energy mix (1990→2025), as the "inputs that power the buildout" section on Insights. (Wind+solar reported within the hydro+renewables line in that NBS series.)

## Iteration 4 — 2026-08-07 · ``4386a29``

*China UHV transmission insights*

- New UHV transmission tracker from GEM's *Ultra-High-Voltage (UHV) Power Transmission System in China* wiki: 45 operating lines (52,304 km, ~304 GW, 21 AC / 24 DC) + 17 construction→proposed projects. Because gem.wiki sits behind Cloudflare for scripted fetch, the rows live as a versioned, attributed snapshot at `data/sources/uhv_transmission.json` (GEM CC BY-NC-SA, transcribed 2026-08-07); `build_uhv_transmission.py` derives all aggregates + public JSON. Transmission page: cumulative capacity AreaChart, AC/DC BarChart, RES-vs-coal, 62-line sortable table.

## Iteration 3 — 2026-08-07 · ``ad55855``

*China pipeline explorer (lazy, filterable)*

- `/pipeline` — the full 34,295-row China project table as a lazy-loaded filterable explorer (status × fuel × province). `projects.json` (~15.7 MB) is loaded only on this route; `summary.json` aggregates power the instant surfaces (hero, province, fuel, status).

## Iteration 2 — 2026-08-07 · ``63aefea``

*Official NEA monthly scoreboard + Insights page*

- New Insights page anchored on the NEA monthly fleet — installed capacity by fuel, utilization hours, and the China-buildout insight layer ("renewable_share", "thermal_still_rising", "utilization_stress").

## Commit `c74c2b1` — 2026-08-07 · `c74c2b1`

*Refocus on China — US retained as data-layer reserve only*

- Project refocused China-first; the US comparison rows remain in `projects.json` (`us_total_projects`/`us_total_gw`/`us_under_construction_gw`) but are **excluded from `summary.json` + the UI**. The README's earlier "US-vs-China comparison / ~16×" framing is retired from surfaced copy per the standing no-international-peers scope.

## Iteration 1 — 2026-08-07 · ``f66e138``

*Scaffold chinaqueue.com*

- Base app: React 19 + Vite 7 + Tailwind (ercotqueue stack), China Power Buildout framing, author "Matt Prusak". GEM GIPT single-source ingestion → `china_projects.json` (34,295 China rows).
- Home surfaces the core aggregates: 881 GW under construction / 2,494 GW prospective / 6,022 GW tracked, provincial concentration, fuel breakdown.

Full human-readable history: [CHANGELOG](https://chinaqueue.com/CHANGELOG.md).
