SKILL.md v4 sustainability
CRP Assemble Figures
Assembles the baseline and current figures, category and top-source breakdowns, the named Scope 3 sources and the scope-and-phase reduction table behind an organisation's carbon reduction analysis, across every scope the organisation reports. Reads the commitment, emissions reports and identity already in the organisation's memory, runs the bundled assemble_figures.py, and writes crp-data.json. Reports against targets the organisation has already set; never sets them.
No reviews yet 0 installs
carbonemissionsreportingcrp
Versions
- v4 # Changelog ## 5.0.0 `scope3Sources` keeps the emissions report's grouping: one list per Scope 3 category, keyed by that category, instead of every category's lines in one list. Line names have their whitespace collapsed, and lines whose names differ only in spacing are one line. ## 4.0.0 Targets and emissions reports are read from `organization/me/` in memory: `organization/me/targets/sbti/least-ambitious.json` (and `most-ambitious.json` when it exists) and `organization/me/emissions/<period>/report.json`. `<CORTEX>` is stated as `/organization/local`. ## 3.0.0 Targets are read from `targets/sbti/least-ambitious.json`, and from `targets/sbti/most-ambitious.json` when it exists. The script's stdin takes `commitments`, one target document per tier, in place of `commitment`. A document holding both tiers is no longer read. ## 2.2.0 `crp-data.json` carries `scenarioByTier`, each commitment tier's scope-and-phase table. The least ambitious tier was the only one read, so nothing downstream could measure the agreed initiatives against the most ambitious commitment. ## 2.1.0 `crp-data.json` carries `scope1Sources` and `scope2Sources` alongside `scope3Sources`. The named lines behind every scope were already walked and all but the top eight overall discarded, so a scenario prompt for Scope 1 carried the scope total and nothing else. ## 2.0.0 `crp-data.json` carries only what is read: the two periods' figures, the named Scope 3 sources and `targets` normalised to the commitment's own rates, plus `scenarioByScope`. Removed `scenario`, `trajectory`, `scope3Present`, `ppnScope3Coverage`, each period's `breakdown`, and `targets.shape` / `scopesCovered` / `framework` / `source`, all of which were built for a report renderer that no longer exists. Every block in this file widens the set of figures the scenario's figure gate admits, so a block with no consumer loosens a check for nothing. `build_figures` no longer takes `commitment_path`, and the stdin payload no longer accepts `commitmentPath`. `crp_targets` keeps `normalise` and drops `detect_framework`, `describe`, `buildable` and `find_targets`, which had no caller once `targets.framework` went. ## 1.4.0 `crp-data.json` carries the platform's supplier and product rankings. Each of `baseline` and `current` gains `attributionCoverage`, `suppliers`, `productsOrServices` and `unattributedTCO2e`, read from the optional `attribution` block on `report.json`. An organisation whose emissions were never attributed to a supplier reports coverage `absent` with empty rankings, which is the normal case and not an error. `none` is distinct: the platform attributed nothing rather than not attempting it. Rankings keep the order the platform emitted. The figures are read, never derived — nothing else in the workspace is matched against emission totals to produce them. ## 1.3.0 The entry gate no longer requires both a Scope 1+2 and a Scope 3 target: it requires at least one complete scope grouping (both an `intermediate` and a `final` phase, each with a `year` and a `reductionPercentage`). A scope the organisation reports emissions for but holds no complete grouping against is still reported in the breakdown, the category tables and initiative selection; it simply carries no scenario row. Target documents are read through a new `crp_targets` module rather than assumed to be `leastAmbitious`/`mostAmbitious` SBTi ambition bands. A `scope-split` document (`scope1And2` and/or `scope3` at the top level) and a `flat` document (one rate applied to every reported scope) both normalise to the same `targets` shape the ambition-banded layout always produced. `targets.shape` and `targets.scopesCovered` record which layout and which scopes were found. `targets.framework` now carries provenance: `{id, name, confidence, evidence}`, where `confidence` is `declared` (a `framework` block on the commitment), `inferred` (ambition-banded shape alone), `mentioned` (the framework's name appears only in free text) or `none`. A `crp-data.json` from before this version has no `targets.shape`, `scopesCovered` or `framework` key; re-run this skill to regenerate it. ## 1.2.0 The report now carries the organisation's legal entity name. ## 1.1.0 Added a `trajectory` key to crp-data.json: the baseline, intermediate-target and final-target points the contraction chart in CRP Compose Report plots. Needed because that chart's own printed labels have no other source in the data, and the figure gate refuses any number the document prints that the data does not carry. A `crp-data.json` written before this version has no `trajectory` key and will fail CRP Compose Report's figure gate; re-run this skill to regenerate it. ## 1.0.0 Added the initial workflow: entry gate against the SBTi commitment, derived baseline and current period resolution, and the bundled assemble_figures.py run producing crp-data.json. 9/29/2026
- v3 # Changelog ## 4.0.0 Targets and emissions reports are read from `organization/me/` in memory: `organization/me/targets/sbti/least-ambitious.json` (and `most-ambitious.json` when it exists) and `organization/me/emissions/<period>/report.json`. `<CORTEX>` is stated as `/organization/local`. ## 3.0.0 Targets are read from `targets/sbti/least-ambitious.json`, and from `targets/sbti/most-ambitious.json` when it exists. The script's stdin takes `commitments`, one target document per tier, in place of `commitment`. A document holding both tiers is no longer read. ## 2.2.0 `crp-data.json` carries `scenarioByTier`, each commitment tier's scope-and-phase table. The least ambitious tier was the only one read, so nothing downstream could measure the agreed initiatives against the most ambitious commitment. ## 2.1.0 `crp-data.json` carries `scope1Sources` and `scope2Sources` alongside `scope3Sources`. The named lines behind every scope were already walked and all but the top eight overall discarded, so a scenario prompt for Scope 1 carried the scope total and nothing else. ## 2.0.0 `crp-data.json` carries only what is read: the two periods' figures, the named Scope 3 sources and `targets` normalised to the commitment's own rates, plus `scenarioByScope`. Removed `scenario`, `trajectory`, `scope3Present`, `ppnScope3Coverage`, each period's `breakdown`, and `targets.shape` / `scopesCovered` / `framework` / `source`, all of which were built for a report renderer that no longer exists. Every block in this file widens the set of figures the scenario's figure gate admits, so a block with no consumer loosens a check for nothing. `build_figures` no longer takes `commitment_path`, and the stdin payload no longer accepts `commitmentPath`. `crp_targets` keeps `normalise` and drops `detect_framework`, `describe`, `buildable` and `find_targets`, which had no caller once `targets.framework` went. ## 1.4.0 `crp-data.json` carries the platform's supplier and product rankings. Each of `baseline` and `current` gains `attributionCoverage`, `suppliers`, `productsOrServices` and `unattributedTCO2e`, read from the optional `attribution` block on `report.json`. An organisation whose emissions were never attributed to a supplier reports coverage `absent` with empty rankings, which is the normal case and not an error. `none` is distinct: the platform attributed nothing rather than not attempting it. Rankings keep the order the platform emitted. The figures are read, never derived — nothing else in the workspace is matched against emission totals to produce them. ## 1.3.0 The entry gate no longer requires both a Scope 1+2 and a Scope 3 target: it requires at least one complete scope grouping (both an `intermediate` and a `final` phase, each with a `year` and a `reductionPercentage`). A scope the organisation reports emissions for but holds no complete grouping against is still reported in the breakdown, the category tables and initiative selection; it simply carries no scenario row. Target documents are read through a new `crp_targets` module rather than assumed to be `leastAmbitious`/`mostAmbitious` SBTi ambition bands. A `scope-split` document (`scope1And2` and/or `scope3` at the top level) and a `flat` document (one rate applied to every reported scope) both normalise to the same `targets` shape the ambition-banded layout always produced. `targets.shape` and `targets.scopesCovered` record which layout and which scopes were found. `targets.framework` now carries provenance: `{id, name, confidence, evidence}`, where `confidence` is `declared` (a `framework` block on the commitment), `inferred` (ambition-banded shape alone), `mentioned` (the framework's name appears only in free text) or `none`. A `crp-data.json` from before this version has no `targets.shape`, `scopesCovered` or `framework` key; re-run this skill to regenerate it. ## 1.2.0 The report now carries the organisation's legal entity name. ## 1.1.0 Added a `trajectory` key to crp-data.json: the baseline, intermediate-target and final-target points the contraction chart in CRP Compose Report plots. Needed because that chart's own printed labels have no other source in the data, and the figure gate refuses any number the document prints that the data does not carry. A `crp-data.json` written before this version has no `trajectory` key and will fail CRP Compose Report's figure gate; re-run this skill to regenerate it. ## 1.0.0 Added the initial workflow: entry gate against the SBTi commitment, derived baseline and current period resolution, and the bundled assemble_figures.py run producing crp-data.json. 9/22/2026
- v2 # Changelog ## 1.2.0 The report now carries the organisation's legal entity name. ## 1.1.0 Added a `trajectory` key to crp-data.json: the baseline, intermediate-target and final-target points the contraction chart in CRP Compose Report plots. Needed because that chart's own printed labels have no other source in the data, and the figure gate refuses any number the document prints that the data does not carry. A `crp-data.json` written before this version has no `trajectory` key and will fail CRP Compose Report's figure gate; re-run this skill to regenerate it. ## 1.0.0 Added the initial workflow: entry gate against the SBTi commitment, derived baseline and current period resolution, and the bundled assemble_figures.py run producing crp-data.json. 8/14/2026
- v1 # Changelog ## 1.1.0 Added a `trajectory` key to crp-data.json: the baseline, intermediate-target and final-target points the contraction chart in CRP Compose Report plots. Needed because that chart's own printed labels have no other source in the data, and the figure gate refuses any number the document prints that the data does not carry. A `crp-data.json` written before this version has no `trajectory` key and will fail CRP Compose Report's figure gate; re-run this skill to regenerate it. ## 1.0.0 Added the initial workflow: entry gate against the SBTi commitment, derived baseline and current period resolution, and the bundled assemble_figures.py run producing crp-data.json. 8/11/2026