diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0deb9c78..96b31bbd 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -33,6 +33,8 @@ jobs: run: npm install -g mystmd - name: Build HTML run: myst build --html --strict + - name: Copy interactive figures into the site + run: mkdir -p _build/html/interactive && cp figures/interactive/*.html _build/html/interactive/ - name: Publish to the hub's eeio/ folder uses: peaceiris/actions-gh-pages@v4 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index fe6de9af..fc38d08f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,7 +1,8 @@ # Build every PR, publish a preview, and check links. # Previews are served from this repo's gh-pages branch at -# https://cornerstone-data.github.io/eeio-docs/pr-preview/pr-/ -# (or under docs.cornerstonedata.org/eeio-docs/ once the hub has its custom domain). +# https://docs.cornerstonedata.org/pr-preview/pr-/ +# (this repo's Pages site has the custom domain docs.cornerstonedata.org, so the +# base path is /pr-preview/pr-, not /eeio-docs/...). name: PR build and preview on: pull_request: @@ -17,7 +18,7 @@ jobs: build-preview: runs-on: ubuntu-latest env: - BASE_URL: /eeio-docs/pr-preview/pr-${{ github.event.number }} + BASE_URL: /pr-preview/pr-${{ github.event.number }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -30,6 +31,9 @@ jobs: - name: Build HTML (fails on errors) if: github.event.action != 'closed' run: myst build --html --strict + - name: Copy interactive figures into the site + if: github.event.action != 'closed' + run: mkdir -p _build/html/interactive && cp figures/interactive/*.html _build/html/interactive/ - name: Deploy or remove preview # Fork PRs can't push to gh-pages; they still get the build check above. if: github.event.pull_request.head.repo.full_name == github.repository diff --git a/README.md b/README.md index a4ccd853..b4d57e9b 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ myst build --html --strict # the same build CI runs | `releases/` | One page per model release | | `versions/` | Version records (one data file per release) | | `figures/` | Hand-made diagrams, figure generator scripts, `figures.csv` inventory | +| `drafts/` | Unpublished drafts kept in the repo; excluded from the build in `myst.yml` | | `data/` | Small cached data extracts for figures | | `references.bib` | Bibliography; add entries as pages cite them, reusing keys from the `papers` repo where they exist | | `_parts/` | Navbar, footer, and custom CSS | diff --git a/benchmarking/index.md b/benchmarking/index.md index 4e21a035..40dbc674 100644 --- a/benchmarking/index.md +++ b/benchmarking/index.md @@ -14,7 +14,7 @@ Plan §3.6.1 · target: **RC (Oct 27)** **Planned content** - Validation asks "did we build the model correctly?"; benchmarking asks "are the results plausible compared with independent evidence?" Both feed the next release -- Headline v0.6 benchmark results for the RC +- Headline v0.6 benchmark results for 2026-rc.1 **Key visuals** @@ -25,5 +25,5 @@ Plan §3.6.1 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/drafts/update-cadence-version-1.md b/drafts/update-cadence-version-1.md new file mode 100644 index 00000000..abc199e6 --- /dev/null +++ b/drafts/update-cadence-version-1.md @@ -0,0 +1,23 @@ +--- +title: "Update cadence, version 1 (draft, not published)" +--- + +:::{note} Draft +Option 1 for the update-cadence section of [](../factors/whats-in-a-release.md), to follow the shared opening paragraph on annual releases: two parallel versions, with five-year stable methods and a new time series at each major update. Not published; this folder is excluded in `myst.yml`. +::: + +The Cornerstone EEIO is developed in two parallel versions, each with its own release cycle (see {numref}`release-cycle`). + +**Research version.** This version is updated continuously and has many releases. It is where new science is developed and tested. + +**Corporate version.** This version is released every October with data updates, bug fixes and small improvements. Each annual release adds that year's emission factors to the existing time series. Its methods stay stable for five years, so companies can make plans, set targets and measure progress against a consistent model. + +**Major updates.** Every five years, a major update brings the science proven in the research version into the corporate version and starts a new time series built with the updated methods. The following annual releases extend that series for five years. The first series, built with the 2026 methods, starts in 2017 and is extended through 2030, and the next major update is in 2031. + +:::{figure} ../figures/diagrams/release-cycle.svg +:label: release-cycle +:alt: USEEIO and CEDA merge into the Cornerstone EEIO, which follows a research version updated continuously with many releases, and a corporate version released every October. Each annual release adds one year to the existing time series, and a major update every five years starts a new time series. +:width: 100% + +USEEIO and CEDA merge into the Cornerstone EEIO, which follows two parallel versions. The research version is updated continuously, with many releases. The corporate version is released every October with data updates, bug fixes and small improvements, and keeps its methods stable for five years. Each annual release adds one year to the existing time series, and every five years a major update brings proven science from the research version into the corporate version and starts a new time series. +::: diff --git a/drafts/update-cadence-version-2.md b/drafts/update-cadence-version-2.md new file mode 100644 index 00000000..2db26956 --- /dev/null +++ b/drafts/update-cadence-version-2.md @@ -0,0 +1,21 @@ +--- +title: "Update cadence, version 2 (draft, not published)" +--- + +:::{note} Draft +Option 2 for the update-cadence section of [](../factors/whats-in-a-release.md), to follow the shared opening paragraph on annual releases: a version lifecycle, with a new methodology version about every two years. Not published; this folder is excluded in `myst.yml`. +::: + +The Cornerstone EEIO follows a version lifecycle, similar to the long-term support model used in software. About every two years, we release a new version with a large methodology update, named after its release year (for example, the 2026 methods and the 2028 methods). + +Each version is supported for about five years. For at least three years, it receives annual updates every October with data updates and bug fixes, and its methods do not change. It then moves into extended support for two more years. + +Companies can adopt a version when they are ready and know they will have about five years of support to set targets and measure progress, while new versions keep improving the model. + +:::{figure} ../figures/diagrams/release-lifecycle.svg +:label: release-lifecycle +:alt: About every two years a new methodology version is released. Each version has at least three years of annual maintenance and data updates, then two years of extended support. +:width: 100% + +About every two years, a new version with a large methodology update is released. Each version receives annual maintenance and data updates for at least three years, then two years of extended support, so companies can rely on about five years of support from the version they adopt. +::: diff --git a/ee/country-tiers.md b/ee/country-tiers.md index f815ecf1..72627c1f 100644 --- a/ee/country-tiers.md +++ b/ee/country-tiers.md @@ -167,5 +167,5 @@ See [Validation](#validation-hub). :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/ee/index.md b/ee/index.md index 318c2e1e..0b93d080 100644 --- a/ee/index.md +++ b/ee/index.md @@ -92,5 +92,5 @@ See [Validation](#validation-hub). :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/factors/choose-a-factor.md b/factors/choose-a-factor.md deleted file mode 100644 index 793a5c88..00000000 --- a/factors/choose-a-factor.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "How-to 1: Choose the right emission factor" ---- - -:::{tip} Summary -*To be written.* -::: - -:::{note} Draft placeholder -:class: dropdown -Plan §3.4.2 · target: **RC (Oct 27)** - - -**Planned content** - -- Match purchases to commodities (not industries); commodity codes and the NAICS crosswalk; broad categories; purchases spanning several commodities -- Choose the country of production; supplier location as a proxy; unknown origin (default to settle) -- Total (`N`), not direct (`D`), for purchased goods and services -- What the factors don't cover: purchased electricity, government services, taxes/fees/interest, used assets -- Special cases: distributors and trading companies, services, capital goods, investments -- Matching to Scope 3 categories - -**Key visuals** - -- 🖼 Decision tree: what did you buy → from which country → is it covered? -- 🖼 Example mapping of five common purchases -::: - -## Worked example - -*To be written.* - -:::{warning} Common mistakes -*To be written.* -::: - -## Learn more - -- **From the field:** *to be added* -- **Cornerstone papers:** *to be added* -- **Code:** *to be added* - -+++ - -:::{div} -:class: page-status -Applies to: RC · Last reviewed: RC -::: diff --git a/factors/downloads.md b/factors/downloads.md deleted file mode 100644 index c795ef52..00000000 --- a/factors/downloads.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Downloads and citation" ---- - -:::{tip} Summary -*To be written.* -::: - -:::{note} Draft placeholder -:class: dropdown -Plan §3.4.7 · target: **RC (Oct 27)** - - -**Planned content** - -- Zenodo DOIs, license, attribution requirement -::: - -+++ - -:::{div} -:class: page-status -Applies to: RC · Last reviewed: RC -::: diff --git a/factors/prices-and-margins.md b/factors/prices-and-margins.md deleted file mode 100644 index 91c9c6e3..00000000 --- a/factors/prices-and-margins.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "How-to 2: Purchaser vs. producer price, and margins" ---- - -:::{tip} Summary -*To be written.* -::: - -:::{note} Draft placeholder -:class: dropdown -Plan §3.4.3 · target: **RC (Oct 27)** - - -**Planned content** - -- The price layer cake; factors are per dollar of purchaser price -- The three columns and when to use each (retailer/wholesaler vs. direct from producer with transport counted elsewhere; high mark-up sellers) -- If you only have producer prices; taxes; price basis for other countries - -**Key visuals** - -- 🖼 Layer cake with the three columns mapped onto it -- 🖼 Decision diagram: who did you buy from, and is transport counted elsewhere? -::: - -## Worked example - -*To be written.* - -:::{warning} Common mistakes -*To be written.* -::: - -## Learn more - -- **From the field:** *to be added* -- **Cornerstone papers:** *to be added* -- **Code:** *to be added* - -+++ - -:::{div} -:class: page-status -Applies to: RC · Last reviewed: RC -::: diff --git a/factors/user-guidance.md b/factors/user-guidance.md new file mode 100644 index 00000000..f5f6e14b --- /dev/null +++ b/factors/user-guidance.md @@ -0,0 +1,99 @@ +--- +title: "User guidance" +--- + +:::{tip} Summary +This guidance walks you through how to apply the emission factors to your corporate carbon footprint. The factors are cradle-to-gate: they cover the emissions of producing a good or service up to the point where you buy it. They are typically used for Scope 3, categories 3.1 (purchased goods and services) and 3.2 (capital goods). They can also be used for category 3.15 (investments) to estimate financed emissions, using a company's revenue as the proxy for spend, following PCAF's guidance. +::: + +This user guidance covers two topics: + +1. How to choose the right emission factor: the country, the year and the exchange rate. +2. How to choose between purchaser and producer price. + +A separate guide explains how to think about the margin emission factors, relevant only for previous USEEIO users. + +## Choose the right emission factor + +Every emission factor is defined by a sector, a location, a year and a price basis. The steps below take you from a line in your spend data to the factor that fits it, and then to an emissions number. + +### Step 1: Match the purchase to a sector + +Find the sector that best describes what you bought, using the sector descriptions that come with the factors. Pick the sector for the final good or service you purchased. You do not add up factors along a supply chain, because each factor already includes the upstream emissions of that sector. A purchase of steel products, for example, already includes the emissions of making the steel. + +Each sector is related to a commodity and follows the BEA standard classification. For crosswalks to other industry classifications such as GICS, NACE and ANZSIC, please enquire about the [Watershed enterprise product](https://watershed.com/en-GB/solutions/ceda). + +### Step 2: Choose the country + +Use the location where the good or service was produced. When you do not know it for every supplier, work down this hierarchy and stop at the first one you have: + +1. Country of manufacture +2. Country of the supplier +3. Country of purchase +4. Country of your company's headquarters + +If a country has no factor of its own for that sector, use the regional factor for the country's region, and use the global average only when neither is available. + +**Why country matters.** The same sector can have very different emissions per dollar in different places, because of each country's energy mix, the structure of its economy and its trade. The chart shows the 2026 producer-price factor for management consulting in six locations. + +:::{figure} ../images/user-guidance-ef-by-country.png +:label: user-guidance-ef-by-country +:alt: Horizontal bar chart of the 2026 producer-price emission factor for management consulting, in kg CO2e per USD. China 0.315, India 0.137, global average 0.0948, United Kingdom 0.0449 (highlighted), United States 0.0391, France 0.0390. +:width: 100% + +**Emission factor for management consulting by location, 2026, producer price (kg CO₂e per USD).** The United Kingdom is highlighted because it is used in the worked example below. +::: + +Applying one country's factor to all of your spend would misstate the emissions of suppliers elsewhere. A supplier in China has a factor about eight times the US factor for the same sector. A model with global coverage lets you use the factor of the country where the work is done. + +### Step 3: Choose the year + +Use the factor year that matches the year of your spend. Each factor is expressed in dollars of its own year, so a 2026 factor applies to spend in 2026 dollars. The factors for different years are not interchangeable: the same sector and country has a different factor for each year. + +- If your reporting year is not the calendar year, use the factors for the calendar year that holds most of your data. If the data splits evenly between two years, use the newer factors. For example, a reporting year from April 2025 to March 2026 has nine months in 2025 and three in 2026, so it uses the 2025 factors. + +### Step 4: Convert the factor to your currency + +The factors are per US dollar. Convert either the factor or your spend to the same currency using the recommended exchange rate information. + +**Factor per unit of local currency = factor per USD ÷ exchange rate** + +Use the rate for the year of the spend, not the rate on the day you do the calculation. + +### Worked example: consulting services in the United Kingdom + +A company paid £10,000 for management consulting services from a UK supplier in 2026. The 2026 factor for management consulting in the United Kingdom is 0.0449 kg CO₂e per USD, and the 2026 exchange rate is 0.74283 pounds per US dollar. + +:::{figure} ../images/user-guidance-worked-example.png +:label: user-guidance-worked-example +:alt: Four boxes joined by arrows. Your spend, £10,000 of management consulting in the UK in 2026. Look up the emission factor, 0.0449 kg CO2e per USD. Divide by 0.74283 to get the factor in pounds, 0.0604 kg CO2e per pound. Multiply by £10,000 to get emissions of 604 kg CO2e, or 0.60 tonnes. +:width: 100% + +**From spend to emissions.** Look up the factor, convert it to pounds, and multiply by the spend. +::: + +To see the breakdown by gas, apply the same steps to the factor for each gas. + +## Choose between purchaser and producer price + +Each year has two sets of factors. The producer price factors value a good at what the producer receives. The purchaser price factors value it at what the buyer pays, which adds the trade and transport margins on the way to the buyer. The same purchase therefore has a larger dollar value at purchaser price, and each dollar carries less emissions. + +**If you are unsure, use producer price.** Margins are hard to estimate globally, even for government statistical offices, and producer price is the more conservative choice, meaning it gives the higher emissions estimate for the same spend. + +| Your situation | Use | +|---|---| +| You are unsure what your spend includes | Producer price | +| You are buying off-the-shelf goods at retail, so what you paid includes the usual wholesale and retail margins | Purchaser price | +| You buy directly from the producer and account for transport and distribution separately in your footprint | Producer price | +| You buy a service | Either: the two sets give the same factor in most service sectors | + +The consulting example shows the last case. The management consulting factor for the United Kingdom is 0.0449 at both producer and purchaser price, because a service has no trade margin. + +For goods, the choice changes the result. The 2026 factor for computers in the United Kingdom is 0.0814 kg CO₂e per USD at producer price and 0.0539 at purchaser price. In pounds, that is 0.1096 and 0.0726 kg CO₂e per £, so £10,000 of spend gives about 1,096 kg CO₂e at producer price and 726 kg CO₂e at purchaser price, a difference of about a third. Match the factor to the price basis of your spend data: if your invoice is what you paid at retail, pair it with purchaser price. + ++++ + +:::{div} +:class: page-status +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 +::: diff --git a/factors/whats-in-a-release.md b/factors/whats-in-a-release.md index d7ca1f8a..10f4c452 100644 --- a/factors/whats-in-a-release.md +++ b/factors/whats-in-a-release.md @@ -3,28 +3,67 @@ title: "What's in a release" --- :::{tip} Summary -*To be written.* +The Cornerstone EEIO model is updated annually and versioned with the year of the release, so Cornerstone EEIO 2026 is released in 2026 and the 2027 version will be released in 2027. Every year, the releases will be publicly available in October. Each release publishes emission factors covering 405 sectors across 148 countries, 21 regions and one global average. To download the latest version, check out [Zenodo](https://zenodo.org/doi/10.5281/zenodo.23396891). ::: -:::{note} Draft placeholder -:class: dropdown -Plan §3.4.1 · target: **RC (Oct 27)** +## The release +The release includes one Excel workbook that contains: a cover, a data dictionary, a producer-price tab and a purchaser-price tab for each year the data is available for, and five auxiliary tabs. -**Planned content** +### Cover -- Files and columns, described from the published tables: `CornerstoneSupplyChainGHG_CO2e_USD{year}.csv`, one file per dollar year; commodity code and name; GHG; unit (kg CO₂e per dollar, purchaser price); the three factor columns: without margins, margins, with margins -- What isn't in the table and why (electricity, government sectors) -- Optional `M` and `N` matrices; tables for other countries (format to confirm) +The first tab introduces the dataset and the release details: -**Key visuals** +- Description: cradle-to-gate greenhouse gas emission factors in kg CO₂e per USD, by good or service, location and year, in producer and purchaser price. Prices are in current-year dollars, so the dollar year matches the data year. +- Coverage: 148 countries and 21 regions, and 405 categories of goods and services (government services are not covered). The total and each gas (CO₂, CH₄, N₂O, HFCs, PFCs, NF₃, SF₆) are given in CO₂e, annually. +- Version, date and DOI: the release version, its release date and the Zenodo DOI. +- Publisher and license: Cornerstone Sustainability Data Initiative, under a Creative Commons Attribution 4.0 International license. -- 🖼 Annotated table extract -::: +Below these details, the cover lists every other tab with a one-line description and points readers to the data dictionary and the model documentation. + +### Producer and purchaser price tabs + +There are two tabs for each year, with identical layouts: `{YEAR}PRO` for producer prices and `{YEAR}PUR` for purchaser prices. The producer price is the cost to the producer plus their profits and taxes paid. The purchaser price adds the value of sales and distribution. Read more about how to choose between purchaser and producer prices in [](user-guidance.md). + +Each row is one sector in one location, and the columns are: + +| Column | Meaning | +|---|---| +| Code | Good or service code, based on the BEA input-output commodity codes, which derive from NAICS. There are 405 categories. | +| Name | Name of the good or service. | +| Location | A UN three-letter country code, with additions for multi-country regions. | +| Location Name | Full name of the location. | +| Total GHGs | Sum of all greenhouse gases, in kg CO₂e per USD. Totals may not equal the sum of the gas values due to rounding. | +| CO2 | Carbon dioxide, in kg CO₂e per USD. | +| CH4 | Methane, in kg CO₂e per USD. | +| N2O | Nitrous oxide, in kg CO₂e per USD. | +| HFCs | Hydrofluorocarbons, in kg CO₂e per USD. | +| PFCs | Perfluorocarbons, in kg CO₂e per USD. | +| SF6 | Sulfur hexafluoride, in kg CO₂e per USD. | +| NF3 | Nitrogen trifluoride, in kg CO₂e per USD. | + +Values are in current-year dollars: a factor in a 2024 tab applies to spend in 2024 dollars. + +### Auxiliary tabs + +The data dictionary and five other tabs support the data tabs. The data dictionary is the second tab in the workbook; the others follow the price tabs. + +| Tab | What it contains | +|---|---| +| Data Dictionary | Definitions of each field in the data tabs. | +| Exchange Rates | Local currency units per US dollar for 221 countries and territories, with the columns Country Code, Country Name, LCU (local currency unit), Unit, and one column per year. Rates come from Open Exchange Rates (openexchangerates.org) and are Cornerstone's recommended rates for converting spend in local currency before applying the factors. | +| GWP | The 100-year global warming potentials from the IPCC AR6 that express each gas in CO₂e: CO₂ 1, CH₄ 29.8 (fossil) or 27.0 (non-fossil), N₂O 273, SF₆ 24,300 and NF₃ 17,400. HFCs and PFCs are already in CO₂e in the published factors, so their factor is 1. | +| NAICS to Cornerstone mapping | The correspondence between NAICS 2017 codes and Cornerstone codes, with the columns NAICS 2017 Code, NAICS Name, Cornerstone Code, Cornerstone Name and Weight. When a NAICS industry is split across several Cornerstone codes, the weights show each share and add up to 1. | +| Sector Descriptions | The 405 sectors with their Code, Name and Description. Cornerstone recommends using this description to map spend categories to emission factors. | +| Locations | Every location used in the model, with the columns Location, Location Name, Region, Region Name and Has Country EFs (whether the location has its own country factors). It lists 249 locations, 148 of which have country factors. | + +## Update cadence + +The Cornerstone EEIO follows an annual update cycle. Every year we release a version named after the release year, so Cornerstone 2027 will be released in 2027. Releases are publicly available every October so companies can plan accordingly. Cornerstone EEIO 2026 will stay methodologically stable for at least the next five years, giving companies a consistent basis to rebaseline and set new targets. +++ :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/factors/year-and-currency.md b/factors/year-and-currency.md deleted file mode 100644 index 3b845315..00000000 --- a/factors/year-and-currency.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "How-to 3: Find the right EF for the purchase" ---- - -:::{tip} Summary -*Temp: Find the matching commodity, country/region, year, etc.* -::: - -:::{note} Draft placeholder -:class: dropdown -Plan §3.4.4 · target: **RC (Oct 27)** - - -**Planned content** - -- Pick the file for your spend year (RC dollar years to confirm) -- How the 2024, 2025, and 2026 factors are made from the same data: price indices used, and the exception for Tier 3 countries, whose direct intensities are not re-priced from 2018 dollars -- Spend in another year: sector-specific price indices vs. general CPI -- Spend in another currency: market exchange rate for the year of spend, then the factor for that year -- Reporting across years and recalculating when a new release comes out -- End-to-end worked example: a small purchase ledger taken through all three guides - -**Key visuals** - -- 🖼 Flow diagram: € 2023 spend → 2023 USD → factor file → kg CO₂e -::: - -## Worked example - -*To be written.* - -:::{warning} Common mistakes -*To be written.* -::: - -## Learn more - -- **From the field:** *to be added* -- **Cornerstone papers:** *to be added* -- **Code:** *to be added* - -+++ - -:::{div} -:class: page-status -Applies to: RC · Last reviewed: RC -::: diff --git a/faq.md b/faq.md index c3c22e92..8d7e3972 100644 --- a/faq.md +++ b/faq.md @@ -2,82 +2,174 @@ title: Frequently asked questions --- -:::{note} Draft placeholder -:class: dropdown -Plan §3.9 · target: **RC (Oct 27)**, roughly the top 10 questions. Each answer is short and links to the page with the full explanation. New questions come from support emails, GitHub issues, and user conversations, reviewed at each release. +:::{tip} Summary +Short answers to the questions we hear most about Cornerstone EEIO 2026. Each answer links to the page with the full explanation. Cornerstone EEIO is the successor of USEEIO and CEDA, so many answers compare it with those models. ::: -## Using the factors +## About Cornerstone EEIO 2026 + +:::{dropdown} What is the Cornerstone Sustainability Data Initiative, and how does it relate to USEEIO and CEDA? +Cornerstone launched in August 2025 to bring USEEIO and CEDA together into one open, comprehensive dataset of Scope 3 spend-based emission factors. Cornerstone EEIO 2026 is the first release of that combined model. It is the continuation of both USEEIO v1.4 and CEDA 2025. Today Cornerstone is the home of 3 additional datasets: eGRID, the GHG EF Hub and Orbae. Learn more at [cornerstonedata.org](https://cornerstonedata.org/), and see the [release candidate note](releases/rc.md) for what is in this release. +::: + +:::{dropdown} What is changing compared with USEEIO and CEDA? +Three groups of changes: + +1. **A more current US economy that accounts for imports.** US tables are rebuilt for every year from 2017 to 2024, manufacturing uses facility-reported emissions, and imports are modeled where they are made. +2. **Newer data for Europe, the UK and China, and better gap-filling for other countries.** +3. **A validation process that feeds back into the model.** Third-party benchmarks review the sectors behind about 50% of global emissions. + +Examples with numbers are in [What changed](releases/rc.md#what-changed) in the release candidate note. The full list is in the [](releases/change-log.md). Side-by-side summaries are in [](releases/summary-useeio.md) and [](releases/summary-ceda.md). +::: + +:::{dropdown} Are the changes driven by methodology or by real-world change? +Both. Data updates reflect real-world change, such as new economic, trade and emissions data. Methodology changes reflect modeling improvements, such as modeling US imports by origin and the auto-balanced structural reflection (ABSR) method. See the [](releases/change-log.md) and, for the size of each driver, [](releases/summary-ceda.md#what-drives-the-change-for-ceda-users) and [](releases/summary-useeio.md#what-drives-the-change-for-useeio-users). +::: + +:::{dropdown} Why is it called a "release candidate"? +2026 is the first time CEDA and USEEIO are combined in one model, and the first time a time series is released. The two-phase release gives companies time to assess the impact on their most recent year of measurements while the time series is under development. The release candidate (2026-rc.1) is published on October 27, 2026. The final version (2026-v0.1), with the 2017–2026 time series, follows in early December 2026. See [](releases/rc.md). +::: + +:::{dropdown} Will the 2024–2026 factors change between the release candidate and the final version? +We don't foresee significant changes, but some sector–country combinations could move because of improvements made while developing the time series. If you need numbers for reporting or rebaselining, wait for the final version. See [](releases/rc.md) for what to expect from the time series. +::: + +:::{dropdown} When is the next update? +Releases are published every October so companies can plan for them. The next, Cornerstone EEIO 2027, will be released in October 2027. Cornerstone EEIO 2026 will stay methodologically stable for at least five years, so you have a consistent basis to rebaseline and set targets. See [](releases/index.md) and [](factors/whats-in-a-release.md#update-cadence). +::: + +:::{dropdown} Did the sectors change? +Yes, slightly. Cornerstone EEIO uses 405 sectors, based on the BEA input-output commodity codes. When the USEEIO and CEDA teams reconciled their US models, they resolved the differences in sector definitions as follows. + +**Changes compared to USEEIO** + +- Electric utilities are aggregated into one sector (221100). USEEIO split them across three. +- Government and private transit are aggregated into one sector. USEEIO kept them separate. + +**Changes compared to CEDA** + +- Waste is split into seven sectors. CEDA had a single waste sector. +- Aluminum is split into primary and secondary sectors. CEDA merged them. +- Home appliances are one sector, as in the BEA tables. CEDA had four. + +See the [model reconciliation](releases/change-log.md#change-log-model-reconciliation) section of the change log for all 18 differences. +::: + +:::{dropdown} Did the file format change? +Yes. The new release is different from open CEDA and from the USEEIO v1.4. See [](factors/whats-in-a-release.md) for more details. +::: + +## Moving from USEEIO or CEDA + +:::{dropdown} How much will my footprint change? +It depends on which sectors and countries your spend falls in. + +- **Coming from CEDA 2025:** global production-weighted factors fall by 23.3%. In a sample of 400 corporate footprints, the median company sees a 14% decrease. +- **Coming from USEEIO v1.4:** US factors change by −0.8% overall. In the same sample, the median company sees a 1.3% decrease. -### Should I use `D` or `N`? -*Almost always `N` for purchased goods and services. Answer to be written.* +A small median can hide large moves in individual sectors, in both directions. See [](releases/rc.md#how-do-the-emission-factors-change), [](releases/summary-ceda.md) and [](releases/summary-useeio.md). +::: -### What year and currency are the factors in, and how do I adjust my spend data to match? -*To be written. See [](factors/year-and-currency.md).* +:::{dropdown} I was using CEDA or USEEIO. Do I need to rebaseline or restate previous years? +We do expect the majority of companies to be above the SBTi rebaselining threshold, but every company will have a different experience and ultimately whether to restate is a decision under your own company's policy and your target framework. This year, the release of the time series is designed for exactly this purpose. Because every year from 2017 to 2026 is built with one methodology, you can recalculate prior years on a consistent basis and compare them. See [](releases/rc.md) for what to expect from the time series, and [](releases/summary-ceda.md) and [](releases/summary-useeio.md) for how much your factors may move. +::: -### Do I apply the factors to purchaser prices (what I paid) or producer prices? -*To be written. See [](factors/prices-and-margins.md).* +:::{dropdown} Can I keep using CEDA 2025 or USEEIO for 2026? +We recommend using Cornerstone EEIO 2026 for 2026 measurements, since it supersedes both. If you have a reason to stay on a previous version, apply a price index to it, and explain the choice to your verifier. See [](releases/summary-ceda.md) and [](releases/summary-useeio.md) for what changed. +::: -### How do I find the right sector for a purchase? What if it spans several sectors? -*To be written. See [](factors/choose-a-factor.md).* +:::{dropdown} I'd like to explain the switch to Cornerstone in my report. What do you recommend? +State the source (Cornerstone EEIO 2026) and the years you are applying the model to. -### How do I use the factors for goods bought from, or made in, another country? -*To be written.* +Suggested wording: "The changes this year are due to adopting Cornerstone EEIO 2026. The Cornerstone model combines CEDA's global coverage with USEEIO's detailed US data into a single model that supersedes them both. This model was adopted as an improvement in data quality, as it provides a more current picture of the global economy." -### Are the factors suitable for GHG Protocol Scope 3 reporting and target setting? -*To be written.* +For numbers you can cite, see [What changed](releases/rc.md#what-changed) in the release candidate note, [](releases/summary-ceda.md) and [](releases/summary-useeio.md). +::: -### Which release should I use, and what do I do when a new release comes out? -*To be written.* +## Using the factors -## Understanding the results +:::{dropdown} How do I choose between producer and purchaser price? +The producer price is what the producer receives. The purchaser price adds trade and transport margins, and is what you pay for a ready-to-buy product. If you're unsure, use producer prices, which are more conservative. If you're confident your spend includes typical margins, for example buying off-the-shelf goods at retail, use purchaser prices. See [](factors/user-guidance.md#choose-between-purchaser-and-producer-price). +::: -### Why did a factor change between releases? -*To be written.* +:::{dropdown} How do I use the factors for goods bought from, or made in, another country? +Choose the country where the product was produced. If you don't know it, use this order, from most to least relevant: -### Why do factors differ from USEEIO, CEDA, EXIOBASE, or other datasets? -*To be written.* +1. Country of manufacture +2. Country of the supplier +3. Country of purchase +4. Country of your company's headquarters -### Why does the same sector have very different factors in different countries? -*To be written.* +If a country has no factors of its own, use its regional average. The **Locations** tab shows which of the 249 locations have their own country factors (148 do) and which region each belongs to. See [](factors/user-guidance.md#step-2-choose-the-country). +::: -### What does a country's tier mean for how much I can rely on its factors? -*To be written. See [](io/country-tiers.md).* +:::{dropdown} What if my supplier is in a country with no data? +Use the factor for the region it belongs to, or the global average if the region isn't clear. See the **Locations** tab, [](reference/methods-by-country.md) and [](factors/user-guidance.md#step-2-choose-the-country). +::: -### What's included: cradle-to-gate only? Capital goods? Biogenic CO₂? Land-use change? -*To be written.* +:::{dropdown} What do the Scope 3 categories cover? +The factors cover upstream emissions up to the point of purchase, so they apply to the upstream categories: purchased goods and services (1), capital goods (2), upstream transportation and distribution (4), waste generated in operations (5), business travel (6), and upstream leased assets (8), as well as the upstream part of category 3. They don't cover downstream emissions (categories 9–15). See [](factors/user-guidance.md). +::: -### Are emissions counted where they occur or by the producer's country of residence? -*To be written.* +:::{dropdown} Why does the same sector have very different factors in different countries? +Three reasons: the emissions intensity of each country (for example its electricity grid), the economic structure of the sector in that country, and the trade structure, meaning where its inputs are imported from. Factors for a sector in countries with detailed data differ for real reasons, but see the tier question below for countries with less data. For worked examples, see [](releases/rc.md#new-data-for-china) and [](releases/rc.md#new-data-for-europe). +::: -### Do the factors come with uncertainty ranges? -*To be written.* +## Boundaries and reporting -## For verifiers and auditors +:::{dropdown} Are the factors suitable for GHG Protocol Scope 3 reporting and for target setting? +Yes. Cornerstone factors are designed for spend-based Scope 3 calculations under the GHG Protocol Corporate Value Chain (Scope 3) Standard, and they follow its minimum boundary conditions: a cradle-to-gate boundary that covers all upstream emissions up to the point of purchase, all seven GHGs reported in CO₂e with IPCC AR6 100-year global warming potentials, and no downstream emissions. See [](factors/user-guidance.md) and [](ee/index.md). +::: -### How do I trace a factor back to its data sources and methods? -*To be written.* +:::{dropdown} Does Cornerstone EEIO follow a cradle-to-gate boundary? +Yes. The factors cover all upstream emissions, from raw material extraction up to the point of purchase. Downstream use and end-of-life emissions are not included. See [](factors/user-guidance.md). +::: -### How do I cite a specific release, and where are the exact docs and data for it? -*To be written. See [](releases/index.md).* +:::{dropdown} Does Cornerstone EEIO account for direct land use change and land management emissions? +The factors do not account for direct land use change, but they do include land management emissions. Farming emissions are counted in the farm sectors, including methane from livestock and rice, N₂O from agricultural soils, and CO₂ from liming and urea. Land use, land-use change and forestry (LULUCF), including carbon removals, is not counted. See [](ee/index.md#what-is-and-isnt-counted). +::: -### How is the model validated and benchmarked, and where are the results? -*To be written. See [](validation/index.md).* +:::{dropdown} Does Cornerstone EEIO exclude any of the seven GHGs (CO₂, CH₄, N₂O, HFCs, PFCs, SF₆, NF₃)? +No. All seven GHGs are included. The release reports each gas separately, alongside the total, in kg CO₂e per USD. See [](ee/index.md#gases-and-global-warming-potentials) and [](factors/whats-in-a-release.md#producer-and-purchaser-price-tabs). +::: -### Is the model open? Where are the code and data? -*To be written.* +:::{dropdown} Are biogenic emissions included in the factors? +No, biogenic emissions are not included. +::: + +:::{dropdown} Which GWP version is used? +IPCC AR6, 100-year time horizon. Sources that report in AR5 CO₂-equivalents are converted to AR6 gas by gas. Prior versions of USEEIO used earlier GWPs, so a share of the change versus those models comes from the GWP update. Cornerstone EEIO 2026 also fixes a double application of the AR5-to-AR6 conversion. See [](ee/index.md#gases-and-global-warming-potentials), the GWP tab described in [](factors/whats-in-a-release.md#auxiliary-tabs) and the bug fixes in the [](releases/change-log.md). +::: -## Practical +## Verification, licensing and support -### What license are the factors under, and what attribution is required? -*To be written. See [](factors/downloads.md).* +:::{dropdown} How do I trace a factor back to its data sources and methods? +Start with [](reference/methods-by-country.md), which lists the data and methods behind every country. The [IO model](io/index.md) and [GHG extension](ee/index.md) pages describe the method step by step, and the [](releases/change-log.md) lists what changed against USEEIO and CEDA. Methodology decisions are discussed openly on [GitHub](https://github.com/cornerstone-data/methods/discussions). Benchmark results are in [](benchmarking/index.md). +::: -### How do I report a possible error or ask a question? -Open an issue on [GitHub](https://github.com/cornerstone-data/eeio-docs/issues). +:::{dropdown} How do I cite a specific release? +Cite the version and the release date. For example the Cornerstone EEIO 2026-rc.1 released on October 27th, 2026. See [](factors/whats-in-a-release.md#cover) and [](releases/index.md). +::: + +:::{dropdown} What license are the factors under, and what attribution is required? +The factors are published by the Cornerstone Sustainability Data Initiative under a Creative Commons Attribution 4.0 International (CC BY 4.0) license. You can use and redistribute them, including commercially, as long as you give credit and indicate any changes. Please attribute the factors to Cornerstone EEIO. See [](factors/whats-in-a-release.md#cover). +::: + +:::{dropdown} What does a country's tier mean for how much I can rely on its factors? +Countries are grouped in four tiers by the input-output data available for them. Tier 0 (US) has detailed annual tables, Tier 1 (China, Japan, South Korea, UK) uses detailed national tables, Tier 2 (60 countries) uses coarser multi-regional tables from FIGARO or ICIO, and Tier 3 (83 countries) has no usable table and uses a template built from other countries. Factors for Tier 3 countries carry more uncertainty. See [](io/country-tiers.md) for the IO data, [](ee/country-tiers.md) for the emissions data and [](reference/methods-by-country.md). +::: + +:::{dropdown} Can I get help applying the changes to my footprint? +For more detail, or custom support on how the changes affect your footprint, you can sign up for a demo of the enterprise product [here](https://watershed.com/en-GB/solutions/ceda). +::: + +:::{dropdown} How do I report a possible error or ask a question? +Open an issue on [GitHub](https://github.com/cornerstone-data/eeio-docs/issues). Please include the sector code, the country, the year and the tab (`PRO` or `PUR`), so we can reproduce it. For additional support, enquire about the enterprise product [here](https://watershed.com/en-GB/solutions/ceda). +::: +++ :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/figures/diagrams/release-cycle.png b/figures/diagrams/release-cycle.png new file mode 100644 index 00000000..14cb4819 Binary files /dev/null and b/figures/diagrams/release-cycle.png differ diff --git a/figures/diagrams/release-cycle.svg b/figures/diagrams/release-cycle.svg new file mode 100644 index 00000000..fc71f308 --- /dev/null +++ b/figures/diagrams/release-cycle.svg @@ -0,0 +1,90 @@ + +USEEIO and CEDA merge into Cornerstone EEIO, which follows a research version and a corporate version from 2026 to 2040 +USEEIO and CEDA merge into the Cornerstone EEIO. The research version is updated continuously with many releases. The corporate version is released every October and keeps its methodology stable for five years. A major update every five years brings proven science from the research version into a new time series, and each annual release adds one year to the existing series. + + + +USEEIO + +CEDA + + + + + +Cornerstone +EEIO + +Research version +Tests new science +Continuously updated, with many releases + + + + + + + + + + + + + + + + + +Corporate version +For targets and reporting +One release every October, stable methods + + + +2026 methods +Stable 5 years + +2017–2026 + + + + +2026 +2030 + +2031 methods +Stable 5 years + + + + + +2031 +2035 + +2036 methods +Stable 5 years + + + + + +2036 +2040 + + +Proven science + + +Proven science +Each October release: data updates, bug fixes and small improvements + +Research release + +Annual release: adds that year to the time series + +Major update, every 5 years: starts a new time series + diff --git a/figures/diagrams/release-lifecycle.png b/figures/diagrams/release-lifecycle.png new file mode 100644 index 00000000..a5ab0d5c Binary files /dev/null and b/figures/diagrams/release-lifecycle.png differ diff --git a/figures/diagrams/release-lifecycle.svg b/figures/diagrams/release-lifecycle.svg new file mode 100644 index 00000000..254f129e --- /dev/null +++ b/figures/diagrams/release-lifecycle.svg @@ -0,0 +1,85 @@ + +Cornerstone version lifecycle: a new methodology version about every two years, each with three years of annual updates and two years of extended support +About every two years a new version with a large methodology update is released. Each version gets at least three years of maintenance with an annual data update every October, then two years of extended support, so companies can adopt a version and rely on about five years of support. + + + + +2026 + +2027 + +2028 + +2029 + +2030 + +2031 + +2032 + +2033 + +2034 + +2035 + +2036 + +2037 + +2038 +2026 methods + +Annual updates + + + + +2 years + +2028 methods + +Annual updates + + + + +2 years + +2030 methods + +Annual updates + + + + +2 years + +2032 methods + +Annual updates + + + + +2 years + +About 5 years of support per version + + + +~2 years + +Maintenance and data updates, 3+ years + +Extended support, 2 years + +Large methodology update: a new version + +Annual update, every October + diff --git a/figures/figures.csv b/figures/figures.csv index 095dd2ce..2a977432 100644 --- a/figures/figures.csv +++ b/figures/figures.csv @@ -1,4 +1,14 @@ id,page,type,data_source,generator_script,owner,status +release-cycle,factors/whats-in-a-release.md,diagram,none (hand-drawn schematic),figures/scripts/release_cycle.py,Yohanna Maldonado,draft +release-lifecycle,factors/whats-in-a-release.md,diagram,none (hand-drawn schematic),figures/scripts/release_lifecycle.py,Yohanna Maldonado,draft (option 2) +summary-vs-useeio,releases/summary-useeio.md,chart,"Change log working Doc (summary chart)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft +summary-vs-ceda,releases/summary-ceda.md,chart,"Roundtable 2 deck, slide 15 (percent steps)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft +company-footprint-change,releases/summary-useeio.md,chart,"Change log working Doc (histogram; heights read off the image)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft (approximate) +drivers-vs-useeio,releases/summary-useeio.md,chart,"Change log working Doc (driver waterfall)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft (steps do not sum to the net change) +drivers-vs-ceda,releases/summary-ceda.md,chart,"Change log working Doc (driver waterfall)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft (steps sum to -23.2% against the -23.3% net) +company-footprint-change-ceda,releases/summary-ceda.md,chart,"Change log working Doc (histogram)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft (bar heights approximate) +cement-ef,releases/summary-useeio.md,chart,"Change log working Doc (values 4.35 and 5.21; kg CO2e per USD)",figures/scripts/rc_summary_figures.py,Yohanna Maldonado,draft +absr-diagram,releases/summary-ceda.md,diagram,"Provided by Yohanna Maldonado",,Yohanna Maldonado,draft (image provided, not generated from a script) io-supply-use,io/index.md,diagram (SVG),hand-made,,,draft io-domestic-imported,io/index.md,diagram (SVG),hand-made,,,draft io-tables-to-a,io/index.md,diagram (SVG),hand-made,,,draft @@ -6,3 +16,5 @@ io-mrio-blocks,io/index.md,diagram (SVG),hand-made (after CEDA team slide 19),,, country-tiers-map,io/country-tiers.md,map (SVG),data/country_tiers.csv + Natural Earth 1:50m admin-0,figures/scripts/tier_map.py,,draft ghg-pipeline,ee/index.md,diagram (SVG),hand-made,,,draft eeio-overview,intro/what-is-eeio.md,diagram (SVG),hand-made,,,draft +user-guidance-ef-by-country,factors/user-guidance.md,chart,"Cornerstone GHG Emission Factors workbook, 2026-rc.1 (2026PRO, sector 541610)",figures/scripts/user_guidance_figures.py,Yohanna Maldonado,draft +user-guidance-worked-example,factors/user-guidance.md,diagram,"Worked example from the 2026-rc.1 workbook (factor 0.0449; GBP rate 0.74283)",figures/scripts/user_guidance_figures.py,Yohanna Maldonado,draft diff --git a/figures/interactive/drivers-waterfall.html b/figures/interactive/drivers-waterfall.html new file mode 100644 index 00000000..c99dfe5f --- /dev/null +++ b/figures/interactive/drivers-waterfall.html @@ -0,0 +1,97 @@ + + + + + +Drivers of change + + + +
+
Data updateMethodology
+
+
+
+
+ + + diff --git a/figures/scripts/rc_figures.py b/figures/scripts/rc_figures.py new file mode 100644 index 00000000..9cc1d352 --- /dev/null +++ b/figures/scripts/rc_figures.py @@ -0,0 +1,175 @@ +"""Write the three charts on the release candidate page to images/. + +Redrawn from the Practitioners Forum Roundtable 2 deck so they read cleanly in the text: white +background, no title and no source line on the image (those live in the figure caption). + +- rc-factor-comparison.png: emission factors, Cornerstone 2026 vs CEDA 2025 and vs USEEIO v1.4. + Step sizes are the slide labels; the methodology bar is drawn to the stated end value. +- rc-china-battery.png: China battery production. Totals are the slide labels. The split by + battery type is read off the slide graphic, so it is approximate. +- rc-germany-power.png: Germany's power factor, share of the change from a cleaner grid vs prices. +- rc-us-parts-imports.png: estimated origin of the components of a US-assembled light truck, as one + stacked bar. US + Canada together = 47%, the unweighted mean of the NHTSA AALA parts content for 87 + US-assembled light trucks, model year 2025 (as compiled on Wikipedia, "List of automobiles + manufactured in the United States"; ranges at their midpoint). The AALA data does not separate the + US from Canada, so Canada is estimated: it supplies 10% of US auto parts imports (International Trade + Administration data as reported by MNI, March 2025), so with total imports I (incl. Canada), + Canada = 0.10 * I and the rest of the world = 0.90 * I = 53%, giving I = 58.9%, Canada = 5.9% and + the US = 47% - 5.9% = 41.1%. The other origins use the same 2024 import mix (parts for all vehicle + types; Europe and ASEAN are combined regions in the source; Other is the remainder). Indicative only. + +Run from the repo root (needs matplotlib): + uv run --with matplotlib python figures/scripts/rc_figures.py +""" +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 + +OUT = Path(__file__).resolve().parents[2] / "images" +INK, MUTED = "#2C2C2A", "#5F5E5A" +BASE, END, UP, DOWN = "#B4B2A9", "#5F5E5A", "#D85A30", "#1D9E75" +DARK_TEAL, LIGHT_TEAL = "#0F6E56", "#9FE1CB" +plt.rcParams.update({"font.family": ["Helvetica", "Arial", "DejaVu Sans"], "font.size": 11}) + + +def clean(ax, bottom=True): + for s in ("top", "right", "left"): + ax.spines[s].set_visible(False) + ax.spines["bottom"].set_color("#B4B2A9") + ax.set_yticks([]) + ax.tick_params(axis="x", length=0, colors=INK) + if not bottom: + ax.spines["bottom"].set_visible(False) + + +def panel(ax, start_label, start, steps, end_label, end, net): + """steps: [(label, pct)] in order; the last step is drawn to land on `end`.""" + level = start + xs, labels = [0], [start_label] + ax.bar(0, start, color=BASE, width=0.62) + ax.text(0, start * 1.015, f"{start:.4f}", ha="center", va="bottom", color=INK, fontweight="medium") + prev_top = start + for i, (label, pct) in enumerate(steps, start=1): + new = level + start * pct / 100 + if i == len(steps): + new = end + lo, hi = min(level, new), max(level, new) + colour = "#D85A30" if label.startswith("Data") else "#1D9E75" # data update / methodology, as on the summary pages + ax.bar(i, hi - lo, bottom=lo, color=colour, width=0.62) + txt = f"{pct:+.1f}%".replace("-", "−") + ax.text(i, hi * 1.015, txt, ha="center", va="bottom", color=colour, fontweight="medium") + ax.plot([i - 0.69, i - 0.31], [level, level], color="#B4B2A9", lw=0.9, ls=(0, (3, 3))) + level = new + xs.append(i); labels.append(label) + n = len(steps) + 1 + ax.plot([n - 0.69, n - 0.31], [level, level], color="#B4B2A9", lw=0.9, ls=(0, (3, 3))) + ax.bar(n, end, color=END, width=0.62) + ax.text(n, end * 1.015, f"{end:.4f}\n{net} net", ha="center", va="bottom", color=INK, fontweight="medium", linespacing=1.3) + xs.append(n); labels.append(end_label) + ax.set_xticks(xs); ax.set_xticklabels(labels, fontsize=10) + ax.set_ylim(0, start * 1.28) + clean(ax) + + +def comparison(): + fig, axes = plt.subplots(1, 2, figsize=(11, 3.7), dpi=200) + panel(axes[0], "CEDA\n2025", 0.6942, [("Data\nupdates", 5.8), ("Methodology\nchanges", -27.5)], + "Cornerstone\n2026", 0.5324, "−23.3%") + panel(axes[1], "USEEIO\nv1.4 (US)", 0.2474, [("Data\nupdates", 0.4), ("Methodology\nchanges", -1.2)], + "Cornerstone\n2026", 0.2454, "−0.8%") + fig.tight_layout(w_pad=3) + fig.savefig(OUT / "rc-factor-comparison.png", facecolor="white") + plt.close(fig) + + +def china(): + fig, ax = plt.subplots(figsize=(6, 4), dpi=200) + data = {"2020": (150, 232), "2023": (946, 237)} # (lithium-ion, lead-acid) GWh, approximate split + for x, (yr, (li, pb)) in enumerate(data.items()): + ax.bar(x, pb, color=LIGHT_TEAL, width=0.5) + ax.bar(x, li, bottom=pb, color=DARK_TEAL, width=0.5) + ax.text(x, li + pb + 20, f"{li + pb:,} GWh", ha="center", va="bottom", fontweight="medium", color=INK) + ax.text(1.29, 237 + 946 / 2, "Lithium-ion", va="center", color=DARK_TEAL, fontweight="medium") + ax.text(1.29, 237 / 2, "Lead-acid", va="center", color="#3C8F77", fontweight="medium") + ax.set_xticks([0, 1]); ax.set_xticklabels(list(data), fontsize=11) + ax.set_xlim(-0.5, 1.95); ax.set_ylim(0, 1350) + clean(ax) + fig.tight_layout() + fig.savefig(OUT / "rc-china-battery.png", facecolor="white") + plt.close(fig) + + +def germany(): + fig, ax = plt.subplots(figsize=(8, 1.7), dpi=200) + ax.barh(0, 25, color=DARK_TEAL, height=0.5) + ax.barh(0, 75, left=25, color=LIGHT_TEAL, height=0.5) + ax.text(12.5, 0, "~25%", ha="center", va="center", color="white", fontweight="medium") + ax.text(62.5, 0, "~75%", ha="center", va="center", color=DARK_TEAL, fontweight="medium") + ax.text(0, -0.5, "Cleaner grid", ha="left", va="top", color=DARK_TEAL, fontweight="medium") + ax.text(100, -0.5, "Higher prices", ha="right", va="top", color="#3C8F77", fontweight="medium") + ax.text(0, 0.42, "Share of the 60% fall in Germany's power factor", ha="left", va="bottom", color=MUTED, fontsize=10) + ax.set_xlim(0, 100); ax.set_ylim(-0.95, 0.85); ax.axis("off") + fig.tight_layout() + fig.savefig(OUT / "rc-germany-power.png", facecolor="white") + plt.close(fig) + + +def parts_origin(): + us_canada = 47.0 # US and Canadian content, mean of 87 light trucks (AALA, MY2025) + mix = [("Mexico", 41.0), ("Europe", 11.9), ("Canada", 10.0), ("China", 9.3), ("Japan", 8.0), + ("ASEAN", 7.0), ("South Korea", 6.4)] + mix.append(("Other", 100 - sum(v for _, v in mix))) # remainder of parts imports (6.4%) + canada_share = dict(mix)["Canada"] / 100 + rest_of_world = 100 * (1 - canada_share) * 0 + sum(v for n, v in mix if n != "Canada") # 90.0 + imports_total = (100 - us_canada) / (rest_of_world / 100) # imports incl. Canada, as % of components + raw = [(n, imports_total * v / 100) for n, v in mix] # each origin's share of components + us = us_canada - dict(raw)["Canada"] + parts = [("Made in the US", us)] + raw + floors = [int(v) for _, v in parts] + order = sorted(range(len(parts)), key=lambda i: parts[i][1] - floors[i], reverse=True) + for i in order[: 100 - sum(floors)]: + floors[i] += 1 + # draw order: US first, then imports by size + idx = [0] + sorted(range(1, len(parts)), key=lambda i: (-floors[i], i)) + parts = [parts[i] for i in idx]; floors = [floors[i] for i in idx] + palette = {"Made in the US": "#5F5E5A", "Mexico": "#0F6E56", "Canada": "#5DCAA5", "Europe": "#378ADD", + "China": "#D85A30", "Japan": "#BA7517", "ASEAN": "#7F77DD", "South Korea": "#D4537E", + "Other": "#B4B2A9"} + dark_text = {"Canada", "Other"} + fig, ax = plt.subplots(figsize=(9.5, 3.1), dpi=200) + left = 0 + handles = [] + for (name, _), pct in zip(parts, floors): + ax.barh(0, pct, left=left, color=palette[name], height=0.55, edgecolor="white", linewidth=1.2) + ax.text(left + pct / 2, 0, f"{pct}%", ha="center", va="center", fontsize=10.5, fontweight="medium", + color=INK if name in dark_text else "white") + handles.append(plt.Rectangle((0, 0), 1, 1, color=palette[name])) + left += pct + d = floors[0] + for x0, x1, label in ((0, d, "Made in the US"), (d, 100, "Imported")): + ax.plot([x0 + 0.4, x1 - 0.4], [0.5, 0.5], color="#888780", lw=1) + ax.text((x0 + x1) / 2, 0.58, label, ha="center", va="bottom", color=INK, fontsize=10.5) + ax.set_xlim(0, 100); ax.set_ylim(-0.45, 0.95); ax.axis("off") + labels = [n for n, _ in parts] + n = len(labels); rows = (n + 4) // 5 + cols = (n + rows - 1) // rows + order_rm = [r + c * rows for r in range(rows) for c in range(cols) if r + c * rows < n] + pad = [i for i in range(n) if i not in order_rm] + # matplotlib fills legend columns first; reorder so it reads in bar order across rows + grid = [[None] * cols for _ in range(rows)] + for k in range(n): + grid[k // cols][k % cols] = k + seq = [grid[r][c] for c in range(cols) for r in range(rows) if grid[r][c] is not None] + ax.legend([handles[i] for i in seq], [labels[i] for i in seq], loc="upper center", bbox_to_anchor=(0.5, -0.02), + ncol=cols, frameon=False, fontsize=9.5, labelcolor=INK, columnspacing=1.6, handlelength=1.1, handleheight=1.0) + fig.tight_layout() + fig.savefig(OUT / "rc-us-parts-imports.png", facecolor="white") + plt.close(fig) + print("light-truck component origin (%):", dict(zip(labels, floors)), "sum", sum(floors), "| imports incl. Canada:", round(imports_total, 1)) + + +comparison(); china(); germany(); parts_origin() +print("wrote", *(p.name for p in sorted(OUT.glob("rc-*.png")))) diff --git a/figures/scripts/rc_summary_figures.py b/figures/scripts/rc_summary_figures.py new file mode 100644 index 00000000..d8d32fad --- /dev/null +++ b/figures/scripts/rc_summary_figures.py @@ -0,0 +1,186 @@ +"""Write the charts for the release candidate "Summary of changes" pages to images/. + +Redrawn from the Doc "Change log" working draft so they read cleanly in the text: white background, +no title and no source line on the image (those live in the figure caption). + +- summary-vs-useeio.png: US emission factor, USEEIO v1.4 to Cornerstone 2026, split into data updates + and methodology changes (+0.4% and -1.2%; 0.2474 to 0.2454, -0.8% net). +- summary-vs-ceda.png: global emission factor, CEDA 2025 to Cornerstone 2026 (+5.8% and -27.5%; + 0.6942 to 0.5324, -23.3% net). The methodology bar is drawn to the stated end value. +- company-footprint-change-ceda.png: the same histogram against CEDA (median -14.0%); bar heights read + off the draft, so approximate. +- drivers-vs-ceda.png: the drivers of the change against CEDA (percentages from the draft; the steps sum + to -23.2% against the -23.3% net, and the last step is drawn to land on the end value). +- company-footprint-change.png: distribution of the change in the footprint of 400 corporate + footprints against USEEIO (median -1.3%). Bar heights are relative and were read off the draft's + histogram, so they are approximate; the y-axis is not labelled. +- drivers-vs-useeio.png: the drivers of the change against USEEIO (percentages from the draft). The + steps do not sum to the net change stated in the draft; the last step is not forced to land on it. +- cement-ef.png: cement emission factor, USEEIO vs Cornerstone (4.35 and 5.21, values from the draft). + +Run from the repo root (needs matplotlib): + uv run --with matplotlib python figures/scripts/rc_summary_figures.py +""" +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +from matplotlib.patches import Rectangle # noqa: E402 + +OUT = Path(__file__).resolve().parents[2] / "images" +INK, MUTED = "#2C2C2A", "#5F5E5A" +BASE, END = "#B4B2A9", "#5F5E5A" +DATA, METHOD = "#D85A30", "#1D9E75" # data update, methodology change +plt.rcParams.update({"font.family": ["Helvetica", "Arial", "DejaVu Sans"], "font.size": 11}) + + +def clean(ax, left=False): + for s in ("top", "right") + (() if left else ("left",)): + ax.spines[s].set_visible(False) + ax.spines["bottom"].set_color("#B4B2A9") + if not left: + ax.set_yticks([]) + ax.tick_params(axis="x", length=0, colors=INK) + + +def legend(ax, loc="lower right", anchor=(1.0, 1.0)): + handles = [plt.Rectangle((0, 0), 1, 1, color=DATA), plt.Rectangle((0, 0), 1, 1, color=METHOD)] + ax.legend(handles, ["Data update", "Methodology"], loc=loc, bbox_to_anchor=anchor, ncol=2, frameon=False, + fontsize=10, labelcolor=INK, borderaxespad=0.2) + + +def summary(name, start_label, start, steps, end, net, size=(7.2, 3.9)): + """steps: [(label, pct, colour)]; the last step is drawn to land on `end`.""" + fig, ax = plt.subplots(figsize=size, dpi=200) + level = start + ax.bar(0, start, color=BASE, width=0.6) + ax.text(0, start * 1.015, f"{start:.4f}", ha="center", va="bottom", color=INK, fontweight="medium") + xs, labels = [0], [start_label] + for i, (label, pct, colour) in enumerate(steps, start=1): + new = end if i == len(steps) else level + start * pct / 100 + lo, hi = min(level, new), max(level, new) + ax.bar(i, hi - lo, bottom=lo, color=colour, width=0.6) + ax.text(i, hi * 1.015, f"{pct:+.1f}%".replace("-", "−"), ha="center", va="bottom", color=colour, fontweight="medium") + ax.plot([i - 0.7, i - 0.3], [level, level], color="#B4B2A9", lw=0.9, ls=(0, (3, 3))) + level = new + xs.append(i); labels.append(label) + n = len(steps) + 1 + ax.plot([n - 0.7, n - 0.3], [level, level], color="#B4B2A9", lw=0.9, ls=(0, (3, 3))) + ax.bar(n, end, color=END, width=0.6) + ax.text(n, end * 1.015, f"{end:.4f}\n{net} net", ha="center", va="bottom", color=INK, fontweight="medium", linespacing=1.3) + xs.append(n); labels.append("Cornerstone\n2026") + ax.set_xticks(xs); ax.set_xticklabels(labels, fontsize=10) + ax.set_ylim(0, start * 1.3) + clean(ax); legend(ax) + fig.tight_layout() + fig.savefig(OUT / name, facecolor="white", bbox_inches="tight") + plt.close(fig) + + +def histogram(name, median, inside, outside, label_x, label_y, ymax): + """inside/outside: [(centre of the 2.5-point bin in %, relative height read off the draft's histogram)].""" + fig, ax = plt.subplots(figsize=(7.2, 3.3), dpi=200) + ax.axvspan(-20, 20, color="#EFEDE6", zorder=0) + ax.bar([x for x, _ in inside], [h for _, h in inside], width=2.3, color="#C9CAD1", zorder=2) + ax.bar([x for x, _ in outside], [h if h > 2 else 3 for _, h in outside], width=2.3, color=METHOD, zorder=2) + ax.axvline(median, color="#A33F2E", ls=(0, (4, 3)), lw=1.4, zorder=3) + ax.axvline(0, color=INK, lw=0.8, zorder=3) + ax.text(label_x, label_y, f"Median {median:.1f}%".replace("-", "−"), ha="right", va="center", color="#A33F2E", fontweight="medium") + ax.text(0, -ymax * 0.16, "Within ±20%", ha="center", va="top", color=MUTED, fontsize=9.5) + ax.set_xlim(-100, 100); ax.set_ylim(0, ymax) + ax.set_xticks([-100, -50, -20, 0, 20, 50, 100]) + ax.set_xticklabels(["−100%", "−50%", "−20%", "0%", "+20%", "+50%", "+100%"], color=INK) + clean(ax) + fig.tight_layout() + fig.savefig(OUT / name, facecolor="white") + plt.close(fig) + + +def drivers(name, base_label, base, end, net, steps, bands, ylim, n_ticks_label=9, force_last=False): + """steps: [(label, pct, colour, badge)]; bands: [(x0, x1, label, colour)]. The last step lands on `end` only with force_last.""" + fig, ax = plt.subplots(figsize=(9.6, 5.0), dpi=200) + span = ylim[1] - ylim[0] + for x0, x1, label, colour in bands: + ax.add_patch(Rectangle((x0 + 0.04, ylim[0]), x1 - x0 - 0.08, span, fc=colour, ec="none", zorder=0)) + ax.text((x0 + x1) / 2, ylim[1] - span * 0.045, label, ha="center", va="center", color=MUTED, fontsize=9.5, + fontweight="medium") + ax.bar(0, base - ylim[0], bottom=ylim[0], color=BASE, width=0.6, zorder=2) + ax.text(0, base + span * 0.012, f"{base:.4f}", ha="center", va="bottom", color=INK, fontweight="medium") + level = base + xs, labels = [0], [base_label] + for i, (label, pct, colour, badge) in enumerate(steps, start=1): + new = end if (force_last and i == len(steps)) else level + base * pct / 100 + lo, hi = min(level, new), max(level, new) + ax.bar(i, max(hi - lo, span * 0.002), bottom=lo, color=colour, width=0.6, zorder=2) + text = "~0%" if abs(pct) < 0.05 else f"{pct:+.1f}%".replace("-", "−") + ax.text(i, hi + span * 0.012, text, ha="center", va="bottom", color=colour, fontweight="medium") + ax.plot([i - 0.7, i - 0.3], [level, level], color="#B4B2A9", lw=0.9, ls=(0, (3, 3)), zorder=1) + level = new + xs.append(i); labels.append(label) + n = len(steps) + 1 + ax.plot([n - 0.7, n - 0.3], [level, level], color="#B4B2A9", lw=0.9, ls=(0, (3, 3)), zorder=1) + ax.bar(n, end - ylim[0], bottom=ylim[0], color=END, width=0.6, zorder=2) + ax.text(n, end + span * 0.012, f"{end:.4f}\n{net} net", ha="center", va="bottom", color=INK, fontweight="medium", linespacing=1.3) + xs.append(n); labels.append("Cornerstone\n2026") + ax.set_xticks(xs); ax.set_xticklabels(labels, fontsize=n_ticks_label) + ax.set_xlim(-0.6, n + 0.6); ax.set_ylim(*ylim) + ax.set_ylabel("kg CO$_2$e per 2024 USD", color=MUTED) + ax.tick_params(axis="y", colors=MUTED, length=0) + ax.grid(axis="y", color="#E8E6DF", lw=0.8, zorder=0) + clean(ax, left=True); ax.spines["left"].set_visible(False) + legend(ax) + fig.tight_layout() + fig.savefig(OUT / name, facecolor="white", bbox_inches="tight") + plt.close(fig) + + +def drivers_useeio(): + steps = [("Model\nreconciliation", -3.5, METHOD, 1), ("US\ndata", 0.4, DATA, None), + ("Nowcasting &\nfacility reported\ndata", -5.8, METHOD, 2), ("Trade\nimpact", 8.6, METHOD, 3), + ("Benchmark-\ninformed\nimprovements", 0.2, METHOD, None)] + bands = ((0.5, 3.5, "US MODEL", "#F1EEE8"), (3.5, 5.5, "GLOBAL MODEL (US PORTION)", "#E8EEEE")) + drivers("drivers-vs-useeio.png", "Baseline\nUSEEIO v1.4", 0.2474, 0.2454, "−0.8%", steps, bands, (0.215, 0.262)) + + +def drivers_ceda(): + steps = [("Model\nreconciliation", 0.0, METHOD, None), ("US\ndata", 0.1, DATA, None), + ("Nowcasting &\nfacility reported\ndata", -0.7, METHOD, None), ("Bug\nfixes", -0.2, METHOD, None), + ("UK & global\ntrade data", 0.0, DATA, None), ("China\ndata", 7.6, DATA, 1), + ("Europe & other\nglobal data", -1.8, DATA, 2), ("ABSR", -11.0, METHOD, 3), + ("Benchmark-\ninformed\nimprovements", -17.2, METHOD, 4)] + bands = ((0.5, 3.5, "US MODEL", "#F1EEE8"), (3.5, 9.5, "GLOBAL MODEL", "#E8EEEE")) + drivers("drivers-vs-ceda.png", "Baseline\nCEDA 2025", 0.6942, 0.5324, "−23.3%", steps, bands, (0.50, 0.80), 8.5, force_last=True) + + +def cement(): + fig, ax = plt.subplots(figsize=(6.2, 2.0), dpi=200) + for y, (label, v, colour, bold) in enumerate((("USEEIO", 4.35, BASE, False), ("Cornerstone", 5.21, "#0F6E56", True))): + ax.barh(y, v, color=colour, height=0.5) + ax.text(v + 0.08, y, f"{v:.2f}", va="center", color=INK, fontweight="medium" if bold else "normal") + ax.set_yticks([0, 1]); ax.set_yticklabels(["USEEIO", "Cornerstone"], color=INK) + ax.invert_yaxis(); ax.set_xlim(0, 6.2) + for s in ("top", "right", "bottom"): + ax.spines[s].set_visible(False) + ax.spines["left"].set_color("#B4B2A9"); ax.set_xticks([]); ax.tick_params(axis="y", length=0) + ax.set_xlabel("kg CO$_2$e per USD", color=MUTED, fontsize=9.5, loc="left") + fig.tight_layout() + fig.savefig(OUT / "cement-ef.png", facecolor="white") + plt.close(fig) + + +summary("summary-vs-useeio.png", "USEEIO\nv1.4 (US)", 0.2474, [("Data\nupdates", 0.4, DATA), ("Methodology\nchanges", -1.2, METHOD)], 0.2454, "−0.8%") +summary("summary-vs-ceda.png", "CEDA\n2025", 0.6942, [("Data\nupdates", 5.8, DATA), ("Methodology\nchanges", -27.5, METHOD)], 0.5324, "−23.3%") +histogram("company-footprint-change.png", -1.3, + [(-16.3, 16), (-13.9, 19), (-11.3, 52), (-8.9, 93), (-6.2, 111), (-3.8, 100), (-1.5, 272), (1.2, 152), + (3.6, 55), (6.2, 31), (8.6, 16), (11.3, 16), (13.7, 13), (16.0, 7), (18.7, 10)], + [(-48.9, 1), (-33.8, 1), (-28.8, 4), (-24.0, 4), (-21.4, 7), (21.1, 4), (23.6, 7), (31.3, 1), (36.2, 1), + (38.7, 1), (43.8, 1), (46.3, 1), (68.8, 1), (76.3, 1)], -4, 300, 330) +histogram("company-footprint-change-ceda.png", -14.0, + [(-18.7, 231), (-16.3, 244), (-11.5, 211), (-9.0, 184), (-6.5, 184), (-4.0, 132), (-1.4, 310), + (1.2, 5), (6.0, 5), (8.5, 5)], + [(-38.8, 19), (-36.5, 12), (-34.2, 12), (-31.4, 19), (-28.9, 72), (-26.6, 98), (-24.0, 164), (-21.5, 164)], + -16.5, 330, 350) +drivers_useeio(); drivers_ceda(); cement() +print("wrote", *(p.name for p in sorted(OUT.glob("*.png")))) diff --git a/figures/scripts/release_cycle.py b/figures/scripts/release_cycle.py new file mode 100644 index 00000000..95e18a73 --- /dev/null +++ b/figures/scripts/release_cycle.py @@ -0,0 +1,106 @@ +"""Write figures/diagrams/release-cycle.svg: the Cornerstone EEIO development and release cycle. + +Hand-drawn schematic (no data source). Run from the repo root: + python3 figures/scripts/release_cycle.py +""" +from pathlib import Path + +OUT = Path(__file__).resolve().parents[1] / "diagrams" / "release-cycle.svg" +W, H = 680, 404 + +INK, MUTED, LINE = "#2C2C2A", "#5F5E5A", "#888780" +PURPLE = dict(fill="#EEEDFE", stroke="#534AB7", ink="#3C3489", line="#7F77DD", tint="#F6F5FF") +TEAL = dict(fill="#E1F5EE", stroke="#0F6E56", ink="#085041", tint="#F2FAF6") +CORAL = dict(fill="#FAECE7", stroke="#993C1D", line="#D85A30", ink="#712B13") +GRAY = dict(fill="#F1EFE8", stroke="#5F5E5A") + +els = [] +add = els.append + + +def text(x, y, s, cls="t", anchor="start", fill=None): + f = f' fill="{fill}"' if fill else "" + add(f'{s}') + + +def rect(x, y, w, h, fill, stroke, rx=8, sw=1): + add(f'') + + +def dot(cx, cy, r, c): + add(f'') + + +def right_arrow(x1, x2, y, color=LINE): + add(f'') + add(f'') + + +def down_arrow(x, y1, y2, color=LINE): + add(f'') + add(f'') + + +# predecessors merge into Cornerstone EEIO +rect(40, 84, 62, 40, GRAY["fill"], GRAY["stroke"]); text(71, 104, "USEEIO", "th", "middle") +rect(40, 214, 62, 40, GRAY["fill"], GRAY["stroke"]); text(71, 234, "CEDA", "th", "middle") +right_arrow(102, 118, 104); right_arrow(102, 118, 234) +rect(120, 24, 98, 290, "#FFFFFF", LINE) +text(169, 160, "Cornerstone", "th", "middle"); text(169, 178, "EEIO", "th", "middle") + +# lane 1: research version +LX, LW = 238, 402 +rect(LX, 24, LW, 88, PURPLE["tint"], PURPLE["stroke"], rx=10) +text(LX + 14, 44, "Research version", "th", fill=PURPLE["ink"]) +text(LX + LW - 14, 44, "Tests new science", "ts", "end", fill=PURPLE["stroke"]) +text(LX + 14, 62, "Continuously updated, with many releases", "ts", fill=PURPLE["stroke"]) +add(f'') +for cx in (262, 284, 306, 328, 350, 384, 440, 462, 486, 520, 570, 592, 614): + dot(cx, 92, 6, PURPLE) +right_arrow(222, 236, 68, PURPLE["line"]) + +# lane 2: corporate version +rect(LX, 158, LW, 156, TEAL["tint"], TEAL["stroke"], rx=10) +text(LX + 14, 178, "Corporate version", "th", fill=TEAL["ink"]) +text(LX + LW - 14, 178, "For targets and reporting", "ts", "end", fill=TEAL["stroke"]) +text(LX + 14, 196, "One release every October, stable methods", "ts", fill=TEAL["stroke"]) +right_arrow(222, 236, 234, TEAL["stroke"]) +bands = [(246, "2026"), (378, "2031"), (510, "2036")] +for x0, yr in bands: + rect(x0, 208, 124, 96, "#FFFFFF", LINE) + text(x0 + 62, 224, f"{yr} methods", "th", "middle") + text(x0 + 62, 241, "Stable 5 years", "ts", "middle") + # time series bar: one wide block (new series) then one small block per annual release + rect(x0 + 6, 256, 66, 22, CORAL["fill"], CORAL["stroke"], rx=3) + if yr == "2026": # later series coverage is not decided yet, so those blocks stay blank + text(x0 + 39, 267, "2017–2026", "ts", "middle", fill=CORAL["ink"]) + for k in range(4): + rect(x0 + 76 + 11 * k, 256, 8, 22, TEAL["fill"], TEAL["stroke"], rx=2) + text(x0 + 39, 292, yr, "ts", "middle") + text(x0 + 118, 292, str(int(yr) + 4), "ts", "end") + +# proven science: research into the major updates (arrows point at the new-series blocks) +for x0 in (378, 510): + down_arrow(x0 + 39, 116, 154, CORAL["line"]) + text(x0 + 47, 135, "Proven science", "ts") + +text(340, 336, "Each October release: data updates, bug fixes and small improvements", "ts", "middle") + +# legend +dot(46, 362, 6, PURPLE); text(58, 362, "Research release", "ts") +rect(190, 357, 10, 10, TEAL["fill"], TEAL["stroke"], rx=2); text(208, 362, "Annual release: adds that year to the time series", "ts") +rect(40, 377, 16, 10, CORAL["fill"], CORAL["stroke"], rx=2); text(64, 382, "Major update, every 5 years: starts a new time series", "ts") + +svg = f''' +USEEIO and CEDA merge into Cornerstone EEIO, which follows a research version and a corporate version from 2026 to 2040 +USEEIO and CEDA merge into the Cornerstone EEIO. The research version is updated continuously with many releases. The corporate version is released every October and keeps its methodology stable for five years. A major update every five years brings proven science from the research version into a new time series, and each annual release adds one year to the existing series. + + +{chr(10).join(els)} + +''' +OUT.write_text(svg, encoding="utf-8") +print("wrote", OUT) diff --git a/figures/scripts/release_lifecycle.py b/figures/scripts/release_lifecycle.py new file mode 100644 index 00000000..b9682afc --- /dev/null +++ b/figures/scripts/release_lifecycle.py @@ -0,0 +1,81 @@ +"""Write figures/diagrams/release-lifecycle.svg: the Cornerstone EEIO version lifecycle (option 2). + +Hand-drawn schematic (no data source). A new methodology version about every two years; +each gets 3+ years of annual maintenance and data updates, then 2 years of extended support. +Run from the repo root: + python3 figures/scripts/release_lifecycle.py +""" +from pathlib import Path + +OUT = Path(__file__).resolve().parents[1] / "diagrams" / "release-lifecycle.svg" +W, H = 680, 334 +INK, MUTED, LINE = "#2C2C2A", "#5F5E5A", "#888780" +TEAL = dict(fill="#E1F5EE", stroke="#0F6E56", ink="#085041", mark="#1D9E75") +GRAY = dict(fill="#F1EFE8", stroke="#5F5E5A", ink="#444441") +CORAL = dict(fill="#FAECE7", stroke="#993C1D") + +X0, PY = 170, 39.1 +x = lambda year: round(X0 + (year - 2026) * PY, 1) + +els = [] +add = els.append + + +def text(px, py, s, cls="ts", anchor="start", fill=None): + f = f' fill="{fill}"' if fill else "" + add(f'{s}') + + +def rect(px, py, w, h, c, rx=0): + add(f'') + + +def marker(cx, cy): + add(f'') + + +# time axis +add(f'') +for yr in range(2026, 2039): + add(f'') + text(x(yr), 254, yr, "ts", "middle") + +# one row per version +for i, yr in enumerate((2026, 2028, 2030, 2032)): + cy = 48 + 52 * i + s, m, e = x(yr), x(yr + 3), x(yr + 5) + text(40, cy, f"{yr} methods", "th") + rect(s, cy - 17, round(m - s, 1), 34, TEAL, rx=3) + text(round((s + m) / 2 + 4, 1), cy - 7, "Annual updates", "ts", "middle", fill=TEAL["ink"]) + for k in range(3): + marker(round(s + PY * (k + 0.5), 1), cy + 8) + rect(m, cy - 17, round(e - m, 1), 34, GRAY, rx=3) + text(round((m + e) / 2, 1), cy, "2 years", "ts", "middle", fill=GRAY["ink"]) + add(f'') + +text(381, 48, "About 5 years of support per version") +add(f'') +for yr in (2026, 2028): + add(f'') +text(round((x(2026) + x(2028)) / 2, 1), 88, "~2 years", "ts", "middle") + +# legend +rect(40, 278, 14, 12, TEAL, rx=2); text(62, 284, "Maintenance and data updates, 3+ years") +rect(330, 278, 14, 12, GRAY, rx=2); text(352, 284, "Extended support, 2 years") +add(f'') +text(62, 306, "Large methodology update: a new version") +marker(337, 306); text(352, 306, "Annual update, every October") + +svg = f''' +Cornerstone version lifecycle: a new methodology version about every two years, each with three years of annual updates and two years of extended support +About every two years a new version with a large methodology update is released. Each version gets at least three years of maintenance with an annual data update every October, then two years of extended support, so companies can adopt a version and rely on about five years of support. + + +{chr(10).join(els)} + +''' +OUT.write_text(svg, encoding="utf-8") +print("wrote", OUT) diff --git a/figures/scripts/user_guidance_figures.py b/figures/scripts/user_guidance_figures.py new file mode 100644 index 00000000..10045aef --- /dev/null +++ b/figures/scripts/user_guidance_figures.py @@ -0,0 +1,63 @@ +"""Write the two graphics on the User guidance page to images/. + +- user-guidance-ef-by-country.png: 2026 producer-price factor for management consulting (sector 541610) + in six locations, kg CO2e per USD, from the 2026-rc.1 release workbook. +- user-guidance-worked-example.png: GBP 10,000 of UK management consulting taken to kg CO2e, using the + 0.0449 kg CO2e per USD factor and the 2026 rate of 0.74283 GBP per USD (0.0449 / 0.74283 = 0.0604). + +Run from the repo root (needs matplotlib): + uv run --with matplotlib python figures/scripts/user_guidance_figures.py +""" +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from matplotlib.patches import FancyBboxPatch, FancyArrowPatch + +OUT = Path(__file__).resolve().parents[2] / "images" +INK, MUTED, GRID = "#1F2933", "#5B6770", "#E3E7EA" +BASE, HI = "#A9BFCC", "#1F5F8B" +plt.rcParams["font.family"] = "DejaVu Sans" + +# Chart 1: EF by location +data = [("China", 0.315), ("India", 0.137), ("Global average", 0.0948), + ("United Kingdom", 0.0449), ("United States", 0.0391), ("France", 0.0390)] +fig, ax = plt.subplots(figsize=(8, 3.6), dpi=200) +labels = [d[0] for d in data][::-1]; vals = [d[1] for d in data][::-1] +cols = [HI if l == "United Kingdom" else BASE for l in labels] +bars = ax.barh(labels, vals, color=cols, height=0.62) +for b, v in zip(bars, vals): + ax.text(v + 0.006, b.get_y() + b.get_height()/2, f"{v:.3g}" if v>=0.1 else f"{v:.4f}".rstrip("0") if False else (f"{v:.3f}" if v>=0.1 else f"{v:.4f}"), va="center", fontsize=10, color=INK) +ax.set_xlim(0, 0.36) +ax.set_xlabel("kg CO₂e per USD (2026, producer price)", fontsize=9, color=MUTED) +ax.xaxis.grid(True, color=GRID, lw=0.8); ax.set_axisbelow(True) +for s in ("top", "right", "left"): ax.spines[s].set_visible(False) +ax.spines["bottom"].set_color(GRID) +ax.tick_params(axis="y", length=0, labelsize=10, labelcolor=INK) +ax.tick_params(axis="x", labelsize=9, labelcolor=MUTED, colors=GRID) +fig.tight_layout(); fig.savefig(str(OUT / "user-guidance-ef-by-country.png"), facecolor="white"); plt.close(fig) + +# Chart 2: worked example flow +fig, ax = plt.subplots(figsize=(10, 2.7), dpi=200) +ax.set_xlim(0, 101); ax.set_ylim(0, 27); ax.axis("off") +boxes = [ + ("£10,000", "Management consulting,\nUnited Kingdom, 2026", "Your spend", BASE, INK), + ("0.0449", "kg CO₂e per USD", "Emission factor", BASE, INK), + ("0.0604", "kg CO₂e per £\n(0.0449 ÷ 0.74283)", "Factor in pounds", BASE, INK), + ("604 kg", "CO₂e\n(0.60 t)", "Emissions", HI, "white"), +] +w, gap, x = 18, 9.2, 1 +for i, (big, small, tag, fc, tc) in enumerate(boxes): + ax.add_patch(FancyBboxPatch((x, 3), w, 18, boxstyle="round,pad=0,rounding_size=1.5", + fc=fc if fc == HI else "#EEF3F6", ec=fc, lw=1.4)) + ax.text(x + w/2, 24.2, tag, ha="center", va="center", fontsize=9, color=MUTED) + ax.text(x + w/2, 15.2, big, ha="center", va="center", fontsize=16, fontweight="bold", color=tc) + ax.text(x + w/2, 8.2, small, ha="center", va="center", fontsize=8, color=tc if fc == HI else MUTED, linespacing=1.3) + if i < 3: + ax.text(x + w + gap/2, 15, ["look up", "÷ 0.74283", "× £10,000"][i], ha="center", va="center", fontsize=7, color=MUTED) + ax.add_patch(FancyArrowPatch((x + w + 0.6, 11.5), (x + w + gap - 0.6, 11.5), arrowstyle="-|>", + mutation_scale=12, color=MUTED, lw=1.4)) + x += w + gap +ax.text(1 + 2*(w+gap) + w + gap/2 + 0.0, 0.0, "", fontsize=1) +fig.savefig(str(OUT / "user-guidance-worked-example.png"), facecolor="white", bbox_inches="tight", pad_inches=0.1); plt.close(fig) diff --git a/images/absr-diagram.png b/images/absr-diagram.png new file mode 100644 index 00000000..5285df81 Binary files /dev/null and b/images/absr-diagram.png differ diff --git a/images/cement-ef.png b/images/cement-ef.png new file mode 100644 index 00000000..cbd05475 Binary files /dev/null and b/images/cement-ef.png differ diff --git a/images/company-footprint-change-ceda.png b/images/company-footprint-change-ceda.png new file mode 100644 index 00000000..b319d2c8 Binary files /dev/null and b/images/company-footprint-change-ceda.png differ diff --git a/images/company-footprint-change.png b/images/company-footprint-change.png new file mode 100644 index 00000000..6518e39e Binary files /dev/null and b/images/company-footprint-change.png differ diff --git a/images/drivers-vs-ceda.png b/images/drivers-vs-ceda.png new file mode 100644 index 00000000..23aa3cd2 Binary files /dev/null and b/images/drivers-vs-ceda.png differ diff --git a/images/drivers-vs-useeio.png b/images/drivers-vs-useeio.png new file mode 100644 index 00000000..bb44e54d Binary files /dev/null and b/images/drivers-vs-useeio.png differ diff --git a/images/rc-china-battery.png b/images/rc-china-battery.png new file mode 100644 index 00000000..b45913e1 Binary files /dev/null and b/images/rc-china-battery.png differ diff --git a/images/rc-factor-comparison.png b/images/rc-factor-comparison.png new file mode 100644 index 00000000..442e96ae Binary files /dev/null and b/images/rc-factor-comparison.png differ diff --git a/images/rc-germany-power.png b/images/rc-germany-power.png new file mode 100644 index 00000000..f2efde0c Binary files /dev/null and b/images/rc-germany-power.png differ diff --git a/images/rc-us-parts-imports.png b/images/rc-us-parts-imports.png new file mode 100644 index 00000000..ab7589ef Binary files /dev/null and b/images/rc-us-parts-imports.png differ diff --git a/images/summary-vs-ceda.png b/images/summary-vs-ceda.png new file mode 100644 index 00000000..864d8d7d Binary files /dev/null and b/images/summary-vs-ceda.png differ diff --git a/images/summary-vs-useeio.png b/images/summary-vs-useeio.png new file mode 100644 index 00000000..738d4fcb Binary files /dev/null and b/images/summary-vs-useeio.png differ diff --git a/images/user-guidance-ef-by-country.png b/images/user-guidance-ef-by-country.png new file mode 100644 index 00000000..894a9323 Binary files /dev/null and b/images/user-guidance-ef-by-country.png differ diff --git a/images/user-guidance-worked-example.png b/images/user-guidance-worked-example.png new file mode 100644 index 00000000..6c19eceb Binary files /dev/null and b/images/user-guidance-worked-example.png differ diff --git a/intro/ee-part.md b/intro/ee-part.md index c1c8ebef..5bd8006b 100644 --- a/intro/ee-part.md +++ b/intro/ee-part.md @@ -31,5 +31,5 @@ Plan §3.1.4 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/intro/emission-factors.md b/intro/emission-factors.md index a783cc08..46030ce3 100644 --- a/intro/emission-factors.md +++ b/intro/emission-factors.md @@ -32,5 +32,5 @@ Plan §3.1.5 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/intro/io-part.md b/intro/io-part.md index e22ef539..17681951 100644 --- a/intro/io-part.md +++ b/intro/io-part.md @@ -32,5 +32,5 @@ Plan §3.1.2 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/intro/multi-regional.md b/intro/multi-regional.md index 9684028a..03052f36 100644 --- a/intro/multi-regional.md +++ b/intro/multi-regional.md @@ -32,5 +32,5 @@ Plan §3.1.3 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/intro/uses-and-limits.md b/intro/uses-and-limits.md index 9192b36a..66c62194 100644 --- a/intro/uses-and-limits.md +++ b/intro/uses-and-limits.md @@ -31,5 +31,5 @@ Plan §3.1.7 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/io/country-tiers.md b/io/country-tiers.md index cfebce55..84d940ab 100644 --- a/io/country-tiers.md +++ b/io/country-tiers.md @@ -92,13 +92,13 @@ All tables are converted to 2024 U.S. dollars. Sector lists are reconciled in th - **Assumption:** Countries publish their tables on different price bases (basic, producer, or purchaser prices, and sometimes a mix within one table). We use each table as published and assume these differences do not materially change the direct requirements (`A`). - **Why we make it:** Converting every table to one price basis needs product-level tax, subsidy, and margin data for each country, which is not consistently available. -- **How it affects results:** Where product taxes or trade and transport margins are large, as for fuels, input coefficients could differ from those on a common price basis. See [](../factors/prices-and-margins.md). +- **How it affects results:** Where product taxes or trade and transport margins are large, as for fuels, input coefficients could differ from those on a common price basis. See [](../factors/user-guidance.md). **U.S. margins for purchaser prices** - **Assumption:** Factors are converted from producer to purchaser prices using U.S. trade and transport margins for every country. - **Why we make it:** Margin data comparable to the U.S. tables are not available for every country. -- **How it affects results:** Where a country's wholesale, retail, or transport margins differ from U.S. margins, its purchaser-price factors could be too high or too low. Producer-price factors are not affected. See [](../factors/prices-and-margins.md). +- **How it affects results:** Where a country's wholesale, retail, or transport margins differ from U.S. margins, its purchaser-price factors could be too high or too low. Producer-price factors are not affected. See [](../factors/user-guidance.md). **Tier 3 countries share one recipe** diff --git a/myst.yml b/myst.yml index b86fc29f..fc7bc400 100644 --- a/myst.yml +++ b/myst.yml @@ -13,6 +13,7 @@ project: - README.md - CONTRIBUTING.md - _parts/** + - drafts/** exports: - id: guide-pdf format: typst @@ -32,10 +33,7 @@ project: - title: Emission factors children: - file: factors/whats-in-a-release.md - - file: factors/choose-a-factor.md - - file: factors/prices-and-margins.md - - file: factors/year-and-currency.md - - file: factors/downloads.md + - file: factors/user-guidance.md - file: validation/index.md - file: benchmarking/index.md - title: Reference @@ -47,12 +45,16 @@ project: - file: releases/index.md children: - file: releases/rc.md + children: + - file: releases/summary-useeio.md + - file: releases/summary-ceda.md + - file: releases/change-log.md - file: faq.md site: template: book-theme nav: - title: Get the factors - url: /factors/downloads + url: https://zenodo.org/doi/10.5281/zenodo.23396891 - title: FAQs url: /faq options: diff --git a/reference/data-sources.md b/reference/data-sources.md index 61b9cc6b..98dcdfeb 100644 --- a/reference/data-sources.md +++ b/reference/data-sources.md @@ -20,5 +20,5 @@ Plan §3.8 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/reference/glossary.md b/reference/glossary.md index 30bd2ec1..f5466887 100644 --- a/reference/glossary.md +++ b/reference/glossary.md @@ -76,5 +76,5 @@ Territorial basis :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/reference/methods-by-country.md b/reference/methods-by-country.md index 69d2c86f..5018664b 100644 --- a/reference/methods-by-country.md +++ b/reference/methods-by-country.md @@ -21,7 +21,7 @@ The rest-of-world region is not in the table. Its input recipe and emission inte ## 2024, 2025, and 2026 emission factors -The release candidate's 2024, 2025, and 2026 factors are all built from the same data, below. Each is expressed in its own year's dollars; see [](../factors/year-and-currency.md). +The release candidate's 2024, 2025, and 2026 factors are all built from the same data, below. Each is expressed in its own year's dollars; see [](../factors/user-guidance.md). @@ -182,5 +182,5 @@ The release candidate's 2024, 2025, and 2026 factors are all built from the same :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/reference/notation.md b/reference/notation.md index c520dbf9..30b61d4a 100644 --- a/reference/notation.md +++ b/reference/notation.md @@ -34,5 +34,5 @@ Team to confirm the final list and whether any others (e.g., value added, `U`/`V :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/releases/change-log.md b/releases/change-log.md new file mode 100644 index 00000000..c6b53c6c --- /dev/null +++ b/releases/change-log.md @@ -0,0 +1,108 @@ +--- +title: "Change log" +--- + +:::{tip} Summary +This table summarizes all the data and methodology changes behind Cornerstone EEIO 2026, compared to both USEEIO v1.4 and CEDA 2025. +::: + +```{list-table} +:header-rows: 1 +:widths: 15 20 65 + +* - Type of change + - Category + - What changed? +* - Data update + - US data + - + - Updated the U.S. GHG emissions data (totals and by sector) released by the **University of Maryland Greenhouse Gas Inventory and Analysis (UMD GHGIA)** [(link)](https://ghgi.cgs.umd.edu/data.html) from **2023 to 2024**. +* - Data update + - UK data + - + - Updated the UK IO tables released by the **U.K. Office for National Statistics** [(link)](https://www.ons.gov.uk/economy/nationalaccounts/supplyandusetables/datasets/ukinputoutputanalyticaltablesdetailed) from **2022 to 2023**, incorporating the most recent benchmark IO tables. + - Updated the U.K. GHG emissions data released by the **U.K. Office for National Statistics** [(link)](https://www.ons.gov.uk/economy/environmentalaccounts/datasets/ukenvironmentalaccountsatmosphericemissionsgreenhousegasemissionsbyeconomicsectorandgasunitedkingdom) from **2022 to 2023**, incorporating the most recent benchmark IO tables. +* - Data update + - China data + - + - Updated the China IO tables released by the **National Bureau of Statistics of China (NBS)** [(link)](https://www.stats.gov.cn/sj/ndsj/2025/html/sm03.htm) from **2020 to 2023**, incorporating the most recent benchmark IO tables. + - Updated the China GHG emissions data released by **Our World in Data (OWID)** [(link)](https://github.com/owid/co2-data), **Community Emissions Data System (CEDS)** [(link)](https://zenodo.org/records/10904361), and **Emissions Database for Global Atmospheric Research (EDGAR)** [(link)](https://edgar.jrc.ec.europa.eu/dataset_ghg80) from **2020 to 2023**, incorporating the most recent benchmark IO tables. +* - Data update + - Europe & other global data + - + - Updated the tier 2 country IO tables using Eurostat's Full International and Global Accounts for Research in Input-Output Analysis (FIGARO) [(link)](https://ec.europa.eu/eurostat/en/web/esa-supply-use-input-tables/database) for **2023** data where available and otherwise to **2020 OECD IO tables** [(link)](https://www.oecd.org/en/data/datasets/inter-country-input-output-tables.html). + - Updated the tier 2 country emissions data using **FIGARO's 2023 data** [(link)](https://ec.europa.eu/eurostat/en/web/esa-supply-use-input-tables/database) where available and otherwise to **2020 OECD IO tables** [(link)](https://www.oecd.org/en/data/datasets/inter-country-input-output-tables.html). +* - Data update + - Global trade data + - + - Updated global trade data released by the **United Nations Comtrade (BACI)** [(link)](https://www.cepii.fr/DATA_DOWNLOAD/baci/doc/baci_webpage.html) from **2023 to 2024**. + - Global trade data is supplemented with **FIGARO trade data** [(link)](https://ec.europa.eu/eurostat/en/web/esa-supply-use-input-tables/database) to fill gaps in BACI data. +* - Methodology improvements + - Model reconciliation + - + - USEEIO and CEDA teams reviewed 18 differences between the models for the US and either adopted one of the model's approaches or proposed an improvement. The differences can be categorized into 3 types: sectors schema, treatment of economic data and GHG attribution. For details on the differences, see the [model reconciliation section](#change-log-model-reconciliation) below. +* - Methodology improvements + - Auto-balancing structural reflection (ABSR) + - + - Improved disaggregation of non-US economic data into detailed sectors using a new block scaling method. +* - Methodology improvements + - US nowcasting and facility reported data + - + - Estimated detailed 2024 US IO tables from primary sources from 2017 to 2024, replicating the tables produced by the BEA. + - Used facility reported data to allocate emissions of manufacturing sectors, instead of survey data. +* - Methodology improvements + - Bug fixes + - + - Corrected errors in HS mapping. + - Corrected double application of AR5 to AR6 conversion. + - Corrected loading of the UK IO table. +* - Methodology improvements + - Benchmark informed improvements + - + - Leveraged third-party benchmark data created with ~1,000 data sources to review key sectors that drive ~50% of global emissions, producing one of three outcomes: benchmark improvements, model improvements or documentation of known discrepancies. More on why we benchmark in [](../benchmarking/index.md). +``` + +(change-log-model-reconciliation)= +## Model reconciliation + +The USEEIO and the US portion of CEDA had 18 methodological differences. Cornerstone EEIO adopted either one of the approaches for each difference or improved the approach. For more details on each topic, see our open discussions on [GitHub](https://github.com/cornerstone-data/methods/discussions). + +### Sectors schema + +| Item | USEEIO | CEDA | Cornerstone | +|---|---|---|---| +| **Waste sector** ([#8](https://github.com/cornerstone-data/methods/discussions/8)) | Split into 7 sectors | Single sector | **USEEIO: split into 7** | +| **Aluminum** ([#9](https://github.com/cornerstone-data/methods/discussions/9)) | Primary and secondary separate | Merged | **USEEIO: separate** | +| **Home appliances** ([#24](https://github.com/cornerstone-data/methods/discussions/24)) | One sector, as BEA | Four sectors | **USEEIO: one sector** | +| **Accounting-only commodities** ([#1](https://github.com/cornerstone-data/methods/discussions/1)) | Kept in tables (inferred) | Removed, output recalculated | **CEDA: remove** | + +### Economic data + +| Item | USEEIO | CEDA | Cornerstone | +|---|---|---|---| +| **Redefinitions** ([#3](https://github.com/cornerstone-data/methods/discussions/3)) | Before | After | **CEDA: after** | +| **Electric utilities** ([#7](https://github.com/cornerstone-data/methods/discussions/7)) | 3 separate industries | One aggregated industry | **CEDA: aggregate** | +| **Transit** ([#44](https://github.com/cornerstone-data/methods/discussions/44)) | Government and private separate | Aggregated | **CEDA: aggregate** | +| **B matrix steps** ([#16](https://github.com/cornerstone-data/methods/discussions/16)) | Adjust price, divide, convert | Divide, convert, adjust price | **USEEIO** | +| **Scrap** ([#5](https://github.com/cornerstone-data/methods/discussions/5)) | Adjusted out in v1, kept in v2 | Adjusted out of Make table | **Adjust scrap out** | + +### GHG attribution + +| Item | USEEIO | CEDA | Cornerstone | +|---|---|---|---| +| **Electricity across sectors** ([#33](https://github.com/cornerstone-data/methods/discussions/33)) | Split across 3 electric sectors | All in one sector (221100) | **CEDA: no split** | +| **Core GHG schema** ([#47](https://github.com/cornerstone-data/methods/discussions/47)) | NAICS codes, mapped to BEA later | BEA sectors directly | **Hybrid: NAICS plus BEA** | +| **Mobile Combustion Emissions** ([#39](https://github.com/cornerstone-data/methods/discussions/39)) | GHGI Table 3-13 by vehicle type | Two-layer fuel allocation, wide government spread | **Hybrid: Updated approach** | +| **Households** ([#41](https://github.com/cornerstone-data/methods/discussions/41)) | Tracked as sector F01000 | Not always tracked | **USEEIO: track F01000** | +| **Use table for attribution** ([#45](https://github.com/cornerstone-data/methods/discussions/45)) | Supply-Use, before redefinitions | Make/Use, after redefinitions | **CEDA: after redefinitions** | + +For the summaries of these changes, see [](summary-useeio.md) and [](summary-ceda.md). + +For even additional details or custom support on how to navigate the changes in your footprint, sign up for a demo of the enterprise product [here](https://watershed.com/en-GB/solutions/ceda). + ++++ + +:::{div} +:class: page-status +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 +::: diff --git a/releases/index.md b/releases/index.md index 4e406fb4..7b3213bc 100644 --- a/releases/index.md +++ b/releases/index.md @@ -2,6 +2,6 @@ title: Releases --- -One permanent page per model release: what changed and how much it moved `D` and `N`, methodology choices, data sources and vintages, validation and benchmark summaries, downloads and DOI, and a link to the archived docs snapshot (plan §7.1). +This is where the release note and change log for every Cornerstone EEIO release will live. For direct download of the data, check out [Zenodo](https://zenodo.org/doi/10.5281/zenodo.23396891). - [](rc.md) diff --git a/releases/rc.md b/releases/rc.md index 05c06d5d..89dfa349 100644 --- a/releases/rc.md +++ b/releases/rc.md @@ -1,23 +1,112 @@ --- -title: Release candidate (2024–2026 factors) +title: "2026-rc.1 (Release Candidate)" +subtitle: "Release note · Release date: October 27, 2026" --- -:::{note} Draft placeholder +:::{tip} Summary +The 2026-rc.1 (Release Candidate) is the first stage of a phased approach to releasing the Cornerstone EEIO 2026 model, the successor of USEEIO and CEDA. It is a global environmentally-extended input-output (EEIO) model that produces spend-based emission factors, in kg CO₂e per USD for 405 sectors across 148 countries, plus 21 regional averages and one global average. It uses 2024 as the base year and is available to use for 2024, 2025 and 2026 measurements. + +This release candidate will be superseded in December by the release of the 2026-v0.1 (final version), which will include a time series from 2017 to 2026. + +Download this release on [Zenodo](https://zenodo.org/doi/10.5281/zenodo.23396891) here. +::: + +:::{note} Why have a Release Candidate? :class: dropdown -Plan §8.1 · target: **RC (Oct 27)**. Written by hand for the RC; generated from the version record from v1.0 on. Open: which model version the RC is built on (v0.6?) and which dollar years it publishes (plan Q9, Q10). +2026 is an unprecedented year of development because it is the first time we are combining CEDA and USEEIO into one model and also the first time we are releasing a time series. The intention behind having a two phased approach to the release is to give companies additional time for impact assessments on their most recent year of measurements, while the time series is under development. This enables companies to understand footprint changes before applying the time series. ::: -## Release summary -*Release date, model version, Zenodo DOI, download links.* +:::{note} Will there be any changes for years 2024 to 2026 once the time series is released? +:class: dropdown +We do not foresee significant changes, but some sector-country combinations could be impacted by improvements driven from the time series model development. Users should consider this version as a release candidate and wait for the final 2026 version of this model that will be released in early December for reporting and rebaselining purposes. +::: + +:::{note} What to expect from the time series? +:class: dropdown +The time series (2017-2026) will use the same methodology for all years and only change the underlying data that represents each country’s economic structure and emissions data. For example, in the US each year of the dataset will use the US electricity grid emissivity for each year, capturing any decarbonization on this sector year over year. + +This is the first time that either USEEIO or CEDA releases a time series built this way. In the past CEDA has released a time series built with inflation adjustments for years prior and after the base year. Moving forward the Cornerstone EEIO will only apply inflation adjustments to the years after the base year, for which there is no reported data (e.g. 2025 and 2026 are inflation adjusted from the 2024 base year). + +To learn more about the methodology behind Cornerstone EEIO refer to [the IO model](../io/index.md) and [the GHG extension](../ee/index.md). +::: ## What changed -*Changes since the previous release and how much they moved `D` and `N`. Includes: FIGARO replaced ICIO for FIGARO-covered Tier 2 countries (v0.6).* -## Methods and data vintages -*Rendered from `versions/rc.yaml`.* +Cornerstone EEIO 2026 combines USEEIO’s detailed picture of the US economy with CEDA’s global coverage and trade modeling, representing a step change improvement to both models. + +Three groups of improvements sit behind the changes. + +1. **A more current picture of the US economy that accounts for imports**. US input-output tables are rebuilt for every year from 2017 to 2024, manufacturing uses facility-reported emissions, and imports are modeled where they are made. +2. **Newer data for Europe, the UK and China, and better gap-filling for the rest.** Europe moves from the OECD’s ICIO tables to Eurostat’s FIGARO (through 2023). China moves to the latest National Bureau of Statistics tables (through 2023), with more sectors. Countries without data are filled with the auto-balanced structural reflection method. +3. **A validation process that feeds back into the model.** Third-party benchmarks review the sectors behind about 50% of global emissions. Gaps are traced and fixed in the data or the method and documented when unresolved. + +Together these make the 2017–2026 time series possible. + +## Why do these improvements matter? + +They translate real world changes to corporate footprints. Three examples show how: + +### New data for China + +Cornerstone adopts the most recent economic data released by the Chinese National Bureau of Statistics (2023 vs. 2020), which reflects methodology changes, changes in the economic structure, and sector-specific decarbonization. + +For example, China’s battery factor rises by ~30% driven by a change in the composition of battery production in China. From 2020 to 2023, battery production more than tripled, but more importantly it shifted to require more Lithium-ion and less Lead-acid as inputs. This is because the majority of the market growth in batteries are in EVs and grid storage that require lithium-ion. Lithium-ion needs lithium chemicals and power-hungry cell factories, being more carbon intensive per dollar than lead-acid batteries, driving the emission factor up. + +:::{figure} ../images/rc-china-battery.png +:label: rc-china-battery +:alt: Stacked bar chart of China battery production. In 2020, output was 382 GWh, mostly lead-acid. In 2023, output was 1,183 GWh, mostly lithium-ion. +:width: 65% + +**China battery production, 2020 and 2023.** Output in GWh. The split by battery type is approximate. Sources: NBS input-output tables 2020 and 2023; MIIT; China lead-acid battery industry statistics. +::: + +### New data for Europe + +Cornerstone adopts the most recent release of FIGARO, Eurostat’s official input-output and emissions dataset. FIGARO is more granular than the OECD dataset for Europe, is available as a time series through 2023, and is updated every year, matching Cornerstone’s release cadence. -## Validation and benchmarking -*Headline results.* +This data update lowers European factors by about 4% in median. The most significant change is in electricity factors, which fall in every EU country. This change is driven by an increase in renewable energy and by an increase in energy prices due to the gas-supply shocks the Ukraine war has caused in Europe. For example, Germany’s power factor fell by 60%, as renewables grew from 35% to over 50% of generation and wholesale power prices more than doubled. + +:::{figure} ../images/rc-germany-power.png +:label: rc-germany-power +:alt: Bar showing that about 25% of the fall in Germany's power emission factor comes from a cleaner grid and about 75% from higher prices. +:width: 100% + +**Germany's power emission factor falls by 60%.** About 25% of the change comes from a cleaner grid, as renewables grew from 35% to over 50% of generation, and about 75% from higher prices, as wholesale power prices more than doubled, from about €44 to €95 per MWh. Sources: Ember, Öko-Institut, SMARD, Vattenfall. +::: + +### Incorporation of imports in the US + +USEEIO treated the US as a closed economy: every product used in the US was assumed to be made in the US. Cornerstone uses trade data to model each import in the country that produced it. Many imports come from more emissions-intensive economies such as China and India, so US factors tend to rise by 10 to 30% on average. This is the main upward pressure and the main reason for the change for USEEIO users. One example is light trucks and utility vehicles. The US factor rises by ~24%, mostly because many of their components are now modeled as imports from the countries that make them. Public data suggests that about 60% of the components of a US-assembled light truck are imported, with Mexico the largest source, followed by Europe and Canada (see {numref}`rc-us-parts-imports`). + +:::{figure} ../images/rc-us-parts-imports.png +:label: rc-us-parts-imports +:alt: One horizontal stacked bar showing the estimated origin of light-truck components. Made in the US 41%. Imported: Mexico 24%, Europe 7%, Canada 6%, China 5%, Japan 5%, ASEAN 4%, South Korea 4%, other 4%. +:width: 100% + +**Estimated origin of the components of a US-assembled light truck.** Sources: [NHTSA AALA parts content data](https://www.nhtsa.gov/part-583-american-automobile-labeling-act-reports); [International Trade Administration data as reported by MNI (March 2025)](https://www.mnimarkets.com/articles/us-auto-tariffs-impact-broad-based-across-regions-1743036084321). +::: -## Give feedback -[Open an issue on GitHub](https://github.com/cornerstone-data/eeio-docs/issues/new). +## How do the emission factors change? + +The charts compare the new factors with each model they replace. + +:::{figure} ../images/rc-factor-comparison.png +:label: rc-factor-comparison +:alt: Two waterfall charts. Against CEDA 2025, the factor goes from 0.6942 to 0.5324 (23.3% lower), with data updates adding 5.8% and methodology changes removing 27.5%. Against USEEIO v1.4 for the US, it goes from 0.2474 to 0.2454 (0.8% lower), with data updates adding 0.4% and methodology changes removing 1.2%. +:width: 100% + +**Emission factors fall 23.3% against CEDA 2025 and 0.8% against USEEIO v1.4 (US).** Production-weighted totals in kg CO₂e per 2024 USD, split into data updates and methodology changes. +::: + +:::{important} Your footprint may not follow the median +A company’s change depends on which sectors and countries its spend falls in. A small median can hide large moves in individual sectors, in both directions. +::: + +For a more detailed summary of the changes against USEEIO or CEDA, please refer to [](summary-useeio.md) and [](summary-ceda.md). The full list of data and methodology changes is in the [](change-log.md). For even additional details or custom support on how to navigate the changes in your footprint, sign up for a demo of the enterprise product [here](https://watershed.com/en-GB/solutions/ceda). + ++++ + +:::{div} +:class: page-status +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 +::: diff --git a/releases/summary-ceda.md b/releases/summary-ceda.md new file mode 100644 index 00000000..9102ab83 --- /dev/null +++ b/releases/summary-ceda.md @@ -0,0 +1,101 @@ +--- +title: "Summary of changes vs. CEDA" +--- + +:::{tip} Summary +Cornerstone EEIO 2026 is the continuation of CEDA 2025. For global factors, the net change is on median −23.3% in kg CO₂e per 2024 USD (production-weighted), driven by a combination of data and methodology changes. +::: + +:::{figure} ../images/summary-vs-ceda.png +:label: summary-vs-ceda +:alt: Waterfall chart of the global emission factor. From CEDA 2025 at 0.6942, data updates add 5.8% and methodology changes remove 27.5%, ending at 0.5324 for Cornerstone 2026, 23.3% lower. +:width: 80% + +**Cornerstone 2026 against CEDA 2025 (global).** Global production-weighted total emission factor, in kg CO₂e per 2024 USD, split into data updates and methodology changes. +::: + +::::{important} Your footprint may not follow the median +:class: dropdown +A company's change depends on which sectors and countries its spend falls in. A small median can hide large moves in individual sectors, in both directions. From a sample of 400 corporate footprints, the median company will experience a decrease of 14%. + +:::{figure} ../images/company-footprint-change-ceda.png +:label: company-footprint-change-ceda +:alt: Histogram of the change in the footprint of 400 companies against CEDA. Nearly all companies decrease, mostly between 0% and 40%, with a median of a 14% decrease. A few companies change by less than 1% or increase slightly. +:width: 90% + +**Change in the footprint of 400 companies, Cornerstone 2026 against CEDA 2025.** Each bar groups companies by the percentage change in their total footprint. Bars outside the shaded ±20% band are in green. Bar heights are approximate. +::: +:::: + +## What drives the change for CEDA users + +Four changes drive ~95% of the impact: China data, Europe and global data, ABSR and benchmark-informed improvements. + +:::{iframe} ../../interactive/drivers-waterfall.html?d=ceda +:label: drivers-vs-ceda +:width: 100% + +**Change in the global production-weighted emission factor from CEDA 2025 to Cornerstone 2026, by driver.** Percentages are changes relative to the CEDA 2025 baseline. Hover over a bar for details. The vertical axis does not start at zero. +::: + +### New data for China + +Cornerstone adopts the most recent economic data released by the Chinese National Bureau of Statistics (2023 vs. 2020), which reflects methodology changes, changes in the economic structure, and sector-specific decarbonization. + +For example, China's battery factor rises by ~30% driven by a change in the composition of battery production in China. From 2020 to 2023, battery production more than tripled, but more importantly it shifted to require more lithium-ion and less lead-acid as inputs. This is because the majority of the market growth in batteries is in EVs and grid storage, which require lithium-ion. Lithium-ion needs lithium chemicals and power-hungry cell factories, being more carbon intensive per dollar than lead-acid batteries, driving the emission factor up. + +:::{figure} ../images/rc-china-battery.png +:label: summary-china-battery +:alt: Stacked bar chart of China battery production. In 2020, output was 382 GWh, mostly lead-acid. In 2023, output was 1,183 GWh, mostly lithium-ion. +:width: 65% + +**China battery production, 2020 and 2023.** Output in GWh. The split by battery type is approximate. Sources: NBS input-output tables 2020 and 2023; MIIT; China lead-acid battery industry statistics. +::: + +### New data for Europe + +Cornerstone adopts the most recent release of FIGARO, Eurostat's official input-output and emissions dataset. FIGARO is more granular than the OECD dataset for Europe, is available as a time series through 2023, and is updated every year, matching Cornerstone's release cadence. + +This data update lowers European factors by about 4% in median. The most significant change is in electricity factors, which fall in every EU country. This change is driven by an increase in renewable energy and by an increase in energy prices due to the gas-supply shocks the Ukraine war has caused in Europe. For example, Germany's power factor fell by 60%, as renewables grew from 35% to over 50% of generation and wholesale power prices more than doubled. + +### Auto-balanced structural reflection (ABSR) + +Structural reflection is the method CEDA uses to maintain the same sectoral granularity across all countries. + +The ABSR method is an improvement in this methodology. It achieves two goals that are hard to deliver together in a global model: + +- All countries share the same 405 sectors, so emission factors compare like for like. +- Each economy balances production and consumption in terms of monetary transactions and emissions. + +:::{figure} ../images/absr-diagram.png +:label: absr-diagram +:alt: Diagram of the ABSR method. Countries A, B and C start with different numbers of sectors, so the sector granularity varies by country. ABSR disaggregates and balances each economy, giving every country the same 405 sectors, with row and column totals that check out. +:width: 100% + +**How ABSR works.** ABSR disaggregates each country's economy into the same 405 sectors and balances it, so that production and consumption match in both money and emissions. +::: + +## Third-party benchmarking + +Cornerstone uses benchmark data built from about 1,000 sources to review the key sectors that drive about 50% of global emissions. Each review ends in one of three outcomes: + +- **Sharper benchmark.** Scope and price assumptions are aligned, so the external reference is directly comparable to the model. +- **Model improvement.** The gap is traced to a data source or an allocation method, and fixed with more data or a corrected implementation. +- **Known discrepancy.** The difference is documented, because of a limitation in how the model is built or a gap in the data. + +| Outcome | Example | Gap before and after | +|---|---|---| +| Sharper benchmark | US electricity: the benchmark covered only private utilities, while the model also includes state and local utilities. Aligning scope reduces the gap. | 15% to 3% | +| Model improvement | Brazil dairy: the model was allocating methane from beef to dairy for lack of country-specific data. The model now uses Brazil's national accounts of emissions and output for this sector, reducing the gap. | 51% to 5% | +| Known discrepancy | US oil and gas: the benchmark roughly doubles methane using aerial and satellite measurements. The model uses the EPA inventory, as for every other sector. This is documented as a known discrepancy. | 22% (stays) | + +For the full list of data and methodology changes, see the [](change-log.md). For the equivalent summary against USEEIO, see [](summary-useeio.md). + +For even additional details or custom support on how to navigate the changes in your footprint, sign up for a demo of the enterprise product [here](https://watershed.com/en-GB/solutions/ceda). + ++++ + +:::{div} +:class: page-status +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 +::: diff --git a/releases/summary-useeio.md b/releases/summary-useeio.md new file mode 100644 index 00000000..44129f54 --- /dev/null +++ b/releases/summary-useeio.md @@ -0,0 +1,84 @@ +--- +title: "Summary of changes vs. USEEIO" +--- + +:::{tip} Summary +Cornerstone EEIO 2026 is the continuation of the USEEIO Supply Chain GHG Emission Factors v1.4. For US factors, the net change is on median −0.8% in kg CO₂e per 2024 USD (production-weighted), driven by a combination of data and methodology changes. +::: + +:::{figure} ../images/summary-vs-useeio.png +:label: summary-vs-useeio +:alt: Waterfall chart of the US emission factor. From USEEIO v1.4 at 0.2474, data updates add 0.4% and methodology changes remove 1.2%, ending at 0.2454 for Cornerstone 2026, 0.8% lower. +:width: 80% + +**Cornerstone 2026 against USEEIO v1.4 (US).** US production-weighted total emission factor, in kg CO₂e per 2024 USD, split into data updates and methodology changes. +::: + +::::{important} Your footprint may not follow the median +:class: dropdown +A company's change depends on which sectors and countries its spend falls in. A small median can hide large moves in individual sectors, in both directions. From a sample of 400 corporate footprints, the median company will experience a decrease of 1.3%. + +:::{figure} ../images/company-footprint-change.png +:label: company-footprint-change +:alt: Histogram of the change in the footprint of 400 companies against USEEIO. Most companies change by less than 20% in either direction, clustered around zero, with a median of a 1.3% decrease and a few companies changing by more than 20%. +:width: 90% + +**Change in the footprint of 400 companies, Cornerstone 2026 against USEEIO v1.4.** Each bar groups companies by the percentage change in their total footprint. Bars outside the shaded ±20% band are in green. Bar heights are approximate. +::: +:::: + +## What drives the change for USEEIO users + +Three changes drive ~95% of the impact: model reconciliation, nowcasting and facility-reported data, and the modeling of imports. + +:::{iframe} ../../interactive/drivers-waterfall.html?d=useeio +:label: drivers-vs-useeio +:width: 100% + +**Change in the US production-weighted emission factor from USEEIO v1.4 to Cornerstone 2026, by driver.** Percentages are changes relative to the USEEIO baseline. Hover over a bar for details. The vertical axis does not start at zero. +::: + +### Model reconciliation + +The USEEIO and CEDA teams reviewed 18 differences between the two models for the US. For each, they adopted one model's approach or proposed an improvement. The differences can be categorized into 3 types: sectors schema, treatment of economic data and GHG attribution. For details on the differences, see the [model reconciliation section](#change-log-model-reconciliation) of the change log. + +One example of these differences is using the BEA after redefinition input output tables instead of the before redefinition tables. A detailed explanation of why this is the approach can be found on GitHub [here](https://github.com/cornerstone-data/methods/discussions/3). + +### Nowcasting and facility-reported data + +BEA publishes detailed (about 400-sector) US input-output tables only every 10 years, with a five-year lag. The latest is for 2017. Nowcasting rebuilds these tables for every year from 2017 to 2024, in BEA's own structure, using the same official statistics BEA uses. This methodology improvement enables building the time series and providing a more current picture of the US economy. More than 50% of the economic data behind the factors is now backed by reported annual data, beyond inflation adjustments. + +Cornerstone EEIO also uses facility-level reported emissions data from the US EPA's Greenhouse Gas Reporting Program (GHGRP) where most of the facilities in a sector report them, in place of using estimates based on 4-yr frequency fuel use data. The 2024 data includes 6,127 facility reports across 84 industries. This improvement provides a more accurate picture of the US economy. For example, the US sector emissions now match the totals reported across 87 cement plants (61 MT) in 2024. USEEIO undercounted them by ~20%, driving an increase in emission factors in kg CO₂e/USD. + +:::{figure} ../images/cement-ef.png +:label: cement-ef +:alt: Bar chart of the cement sector emission factor in kg CO₂e per USD. USEEIO 4.35, Cornerstone 5.21. +:width: 60% + +**Cement sector emission factor, USEEIO v1.4 and Cornerstone 2026.** In kg CO₂e per USD. +::: + +### Trade impact: modeling imports + +USEEIO treated the US as a closed economy: every product used in the US was assumed to be made in the US. Cornerstone uses trade data to model each import in the country that produced it. Many imports come from more emissions-intensive economies such as China and India, so US factors tend to rise by 10 to 30% on average. This is the main upward pressure and the main reason for the change for USEEIO users. + +One example is light trucks and utility vehicles. The US factor rises by ~24%, mostly because many of their components are now modeled as imports from the countries that make them. Public data suggests that about 60% of the components of a US-assembled light truck are imported, with Mexico the largest source, followed by Europe and Canada (see {numref}`us-parts-imports`). + +:::{figure} ../images/rc-us-parts-imports.png +:label: us-parts-imports +:alt: One horizontal stacked bar showing the estimated origin of light-truck components. Made in the US 41%. Imported: Mexico 24%, Europe 7%, Canada 6%, China 5%, Japan 5%, ASEAN 4%, South Korea 4%, other 4%. +:width: 100% + +**Estimated origin of the components of a US-assembled light truck.** Sources: [NHTSA AALA parts content data](https://www.nhtsa.gov/part-583-american-automobile-labeling-act-reports); [International Trade Administration data as reported by MNI (March 2025)](https://www.mnimarkets.com/articles/us-auto-tariffs-impact-broad-based-across-regions-1743036084321). +::: + +For the full list of data and methodology changes, see the [](change-log.md). For the equivalent summary against CEDA, see [](summary-ceda.md). + +For even additional details or custom support on how to navigate the changes in your footprint, sign up for a demo of the enterprise product [here](https://watershed.com/en-GB/solutions/ceda). + ++++ + +:::{div} +:class: page-status +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 +::: diff --git a/validation/index.md b/validation/index.md index aa86c1bb..6f22191e 100644 --- a/validation/index.md +++ b/validation/index.md @@ -27,5 +27,5 @@ Plan §3.5 · target: **RC (Oct 27)** :::{div} :class: page-status -Applies to: RC · Last reviewed: RC +Applies to: 2026-rc.1 · Last reviewed: 2026-rc.1 ::: diff --git a/versions/rc.yaml b/versions/rc.yaml index 8a8b0c44..e01b8fa0 100644 --- a/versions/rc.yaml +++ b/versions/rc.yaml @@ -4,7 +4,7 @@ release: rc model_version: v0.6 # to confirm (plan Q9) release_date: 2026-10-27 -zenodo_doi: null +zenodo_doi: 10.5281/zenodo.23396891 base_year: 2024 dollar_years: [2024, 2025, 2026] # to confirm (plan Q10) gwp: AR6-100