Lowest-carbon feasible region: europe-north1
Verdant evaluated 11 Google Cloud regions for the eu-west user base with a latency budget of 80 ms, then picked the feasible region with the lowest modeled operational SCI. Carbon is a deployment gate, not a dashboard.
Region decision
| Region | Location | Grid zone | gCO2e/kWh | Google CFE | Latency (assumed) | Modeled SCI | Decision |
|---|---|---|---|---|---|---|---|
| europe-north1 | Finland | FI | 29.8 | 98% | 32 ms | 0.04774 | selected |
| europe-west2 | London | GB | 109.4 | 75% | 14 ms | 0.17502 | feasible, higher SCI |
| europe-west1 | Belgium | BE | 126.4 | 79% | 10 ms | 0.20229 | feasible, higher SCI |
| europe-west4 | Eemshaven | NL | 194.3 | 82% | 8 ms | 0.31096 | feasible, higher SCI |
| europe-west10 | Berlin | DE | 275.8 | 70% | 12 ms | 0.44130 | feasible, higher SCI |
| southamerica-east1 | Sāo Paulo | BR-CS | 73.2 | 87% | 200 ms | — | latency 200ms exceeds 80ms budget |
| us-west1 | Oregon | US-NW-BPAT | 97.8 | 83% | 150 ms | — | latency 150ms exceeds 80ms budget |
| asia-east1 | Taiwan | TW | 427.9 | 15% | 260 ms | — | latency 260ms exceeds 80ms budget |
| us-central1 | Iowa | US-MIDW-MISO | 431.9 | 88% | 110 ms | — | latency 110ms exceeds 80ms budget |
| us-east1 | South Carolina | US-CAR-SC | 579.4 | 31% | 95 ms | — | latency 95ms exceeds 80ms budget |
| africa-south1 | Johannesburg | ZA | 641.4 | 15% | 165 ms | — | latency 165ms exceeds 80ms budget |
Decision log
- Evaluated 11 Google Cloud regions for workload 'api' (user base: eu-west).
- Constraints: max_latency=80ms, residency=any, carbon_budget=0.35 g/1k req.
- Selected europe-north1 (Finland, zone FI) at 29.84 gCO2e/kWh, CFE 98%.
- Carbon-unaware baseline (lowest latency): europe-west4 at 194.35 gCO2e/kWh.
- Rejected africa-south1: latency 165ms exceeds 80ms budget.
- Rejected asia-east1: latency 260ms exceeds 80ms budget.
- Rejected europe-west1: feasible but higher modeled SCI (0.20229 vs 0.04774 g/1k req).
- Rejected europe-west10: feasible but higher modeled SCI (0.44130 vs 0.04774 g/1k req).
- Rejected europe-west2: feasible but higher modeled SCI (0.17502 vs 0.04774 g/1k req).
- Rejected europe-west4: feasible but higher modeled SCI (0.31096 vs 0.04774 g/1k req).
- Rejected southamerica-east1: latency 200ms exceeds 80ms budget.
- Rejected us-central1: latency 110ms exceeds 80ms budget.
- Rejected us-east1: latency 95ms exceeds 80ms budget.
- Rejected us-west1: latency 150ms exceeds 80ms budget.
- Carbon gate passed: modeled operational SCI 0.04774 g/1k req <= budget 0.35.
Functional unit: 1,000 successful HTTP requests. Operational SCI follows the ISO/IEC 21031 structure; embodied emissions
(0.004 g/1k req, assumption) are reported separately. Data: Google Cloud region carbon data 2025 (annual average, location-based grid intensity) - github.com/GoogleCloudPlatform/region-carbon-info.
Latency values are indicative assumptions. This is a modeled, incremental comparison — not a compliance claim.
Endpoints
healthz · region (eu-west) · region (us-central) · region (za, carbon gate blocks) · SCI report
Live API
The signed image from this pipeline is live on Render free tier: https://greenops-status-api-latest.onrender.com (free instances sleep when idle; the first request can take about a minute).
Carbon gate in action · Johannesburg
carbon budget breach: best feasible region africa-south1 has modeled SCI 1.02627 g/1k req, above the budget of 0.35 g/1k req. Verdant does not ship it and does not silently pick another region; it hands a human the trade-offs:
- Deploy to europe-west2 (London): latency budget 80 -> 160 ms, modeled SCI 0.1750 g/1k req (83% lower than africa-south1).
- Deploy to europe-west1 (Belgium): latency budget 80 -> 165 ms, modeled SCI 0.2023 g/1k req (80% lower than africa-south1).
- Deploy to europe-north1 (Finland): latency budget 80 -> 190 ms, modeled SCI 0.0477 g/1k req (95% lower than africa-south1).
- Stay in africa-south1 (Johannesburg) and raise the carbon budget from 0.35 to 1.0263 g/1k req (2.9x) - needs an explicit, recorded approval.
Gate proof · 10/10 correct
Every pipeline feeds deliberately bad changes through the real carbon engine, OPA policies and SLO probe. If a bad change gets through, or a good one is blocked, the pipeline fails.
| Scenario | Gate | Expected | Observed | Result |
|---|---|---|---|---|
| Johannesburg users, 80 ms budget: only africa-south1 (641 g/kWh) is fast enough | carbon gate | blocked | blocked | PASS |
| Western-Europe users, 80 ms budget (control) | carbon gate | allowed | allowed | PASS |
| High-severity dependency CVE | OPA policy gate | blocked | blocked | PASS |
| Secret committed to the repository | OPA policy gate | blocked | blocked | PASS |
| Agent branch edits .gitlab-ci.yml to weaken the pipeline | OPA policy gate | blocked | blocked | PASS |
| Agent branch tries an unsupported change type (auth rewrite) | OPA policy gate | blocked | blocked | PASS |
| Agent branch touches more than 12 files | OPA policy gate | blocked | blocked | PASS |
| Agent branch adds a read-only endpoint in app/ (control) | OPA policy gate | allowed | allowed | PASS |
| Bad release: /healthz is green but the API returns HTTP 500 | SLO gate (triggers rollback) | blocked | blocked | PASS |
| Healthy release (the real GreenOps API) | SLO gate (triggers rollback) | allowed | allowed | PASS |
Verdant's own footprint
Measured from real job durations via the GitLab API; Cloud Carbon Footprint coefficients, runner grid {"us-east1": 579.44, "us-east5": 343.48} gCO2e/kWh (headline uses the dirtier). Payback = requests served in the carbon-selected region until the saving vs the lowest-latency region repays the pipeline's own emissions.
Proof ledger · recent pipelines
| Pipeline | Ref | Created (UTC) | Status | Gates passed | CI emissions |
|---|---|---|---|---|---|
| #2985588046 | main | 2026-10-25 01:50 | running | 11/11 | 0.67 g |
| #2985574693 | verdant/3-add_read_only_endpoint | 2026-10-25 01:38 | passed | 11/11 | 0.51 g |
| #2985541461 | verdant/3-add_read_only_endpoint | 2026-10-25 01:11 | passed | 11/11 | 0.54 g |
| #2985541297 | verdant/3-add_read_only_endpoint | 2026-10-25 01:11 | passed | 11/11 | 0.53 g |
| #2985530272 | main | 2026-10-25 01:06 | passed | 11/11 | 0.67 g |
| #2985514338 | main | 2026-10-25 00:57 | passed | 11/11 | 0.66 g |
| #2985413915 | main | 2026-10-24 23:40 | passed | 11/11 | 0.60 g |
| #2985401614 | main | 2026-10-24 23:30 | passed | 11/11 | 0.62 g |
| #2985029367 | verdant/2-add_read_only_endpoint | 2026-10-24 18:56 | passed | 11/11 | 0.71 g |
| #2985029125 | verdant/2-add_read_only_endpoint | 2026-10-24 18:56 | passed | 11/11 | 0.73 g |
| #2985013879 | main | 2026-10-24 18:43 | passed | 11/11 | 0.64 g |
| #2984991148 | main | 2026-10-24 18:25 | passed | 11/11 | 0.81 g |
| #2984972489 | v1.0.0 | 2026-10-24 18:10 | passed | 8/8 | 0.43 g |
| #2984972278 | main | 2026-10-24 18:10 | passed | 11/11 | 0.57 g |
Raw evidence (latest pipeline)
evidence-pack.md · gate-proof.json · ci-footprint.json · ledger.json · policy-decision.json · image-smoke.json · slo.json · sbom.cdx.json · pipeline