Skip to content

Commit 96e7cff

Browse files
Merge pull request #2 from andreibesleaga/v03
draft-03 initial commit
2 parents bf45aee + 4f6e9cd commit 96e7cff

103 files changed

Lines changed: 5517 additions & 530 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/example-scripts.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ jobs:
7171
run: |
7272
set -e
7373
mkdir -p /tmp/nginx-test/logs /tmp/nginx-test/run /tmp/nginx-test/tmp
74-
echo '{"version":"1.1","test":true}' > /tmp/nginx-test/sustainability.json
74+
echo '{"version":"2.0","test":true}' > /tmp/nginx-test/sustainability.json
7575
cat > /tmp/nginx-test/nginx.conf <<'EOF'
7676
worker_processes 1;
7777
error_log /tmp/nginx-test/logs/error.log;
@@ -107,7 +107,7 @@ jobs:
107107
run: |
108108
set -e
109109
mkdir -p /tmp/apache-test/logs /tmp/apache-test/run /tmp/apache-test/htdocs
110-
echo '{"version":"1.1","test":true}' > /tmp/apache-test/htdocs/sustainability.json
110+
echo '{"version":"2.0","test":true}' > /tmp/apache-test/htdocs/sustainability.json
111111
echo '{"error":"method not allowed"}' > /tmp/apache-test/htdocs/sustainability-405.json
112112
cat > /tmp/apache-test/httpd.conf <<EOF
113113
ServerRoot "/tmp/apache-test"

.github/workflows/full-verify.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ jobs:
121121
run: |
122122
set -e
123123
mkdir -p /tmp/nginx-fv/logs /tmp/nginx-fv/run /tmp/nginx-fv/tmp
124-
echo '{"version":"1.1","test":true}' > /tmp/nginx-fv/sustainability.json
124+
echo '{"version":"2.0","test":true}' > /tmp/nginx-fv/sustainability.json
125125
{ echo 'worker_processes 1; pid /tmp/nginx-fv/run/nginx.pid; error_log /tmp/nginx-fv/logs/error.log;'; \
126126
echo 'events{worker_connections 16;} http{ access_log /tmp/nginx-fv/logs/access.log;'; \
127127
echo 'client_body_temp_path /tmp/nginx-fv/tmp/body; proxy_temp_path /tmp/nginx-fv/tmp/proxy;'; \
@@ -140,7 +140,7 @@ jobs:
140140
run: |
141141
set -e
142142
mkdir -p /tmp/apache-fv/logs /tmp/apache-fv/run /tmp/apache-fv/htdocs
143-
echo '{"version":"1.1","test":true}' > /tmp/apache-fv/htdocs/sustainability.json
143+
echo '{"version":"2.0","test":true}' > /tmp/apache-fv/htdocs/sustainability.json
144144
echo '{"error":"method not allowed"}' > /tmp/apache-fv/htdocs/sustainability-405.json
145145
cat > /tmp/apache-fv/httpd.conf <<EOF
146146
ServerRoot "/tmp/apache-fv"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ PUBLISHING.md
88
PRESENTATION.md
99
RESEARCH.md
1010
V03-PLAN.md
11+
V03-EXECUTION-PLAN.md

ADOPTION.md

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,24 @@ fragmentation.
3737
the metadata does not add to the footprint it reports, and it caches cleanly (ETag, 24h).
3838
- **Formally specified.** Dual JTD (RFC 8927) and CDDL (RFC 8610) schemas make conformance
3939
testable and unambiguous; this repo's validators and gateway prove it.
40+
- **Four-way ready, by design.** The same unchanged document is web-ready (a plain HTTPS
41+
GET with standard caching and conditional requests), API/M2M-ready (a stable JSON wire
42+
format with formal schemas and deterministic semantics), human-readable (self-describing
43+
member names plus a mandatory methodology link), and AI/agent-ready (machine-discoverable
44+
at a fixed location, schema-validatable, safe to ingest without negotiation).
4045
- **Interoperable, precisely.** One vendor-neutral field model normalizes data that is
41-
otherwise trapped in incompatible enterprise APIs — and the -02 revision pinned down every
42-
interop edge a hostile review could raise: single-object vs array shape rules, `target-path`
43-
echo (absence = origin-wide), byte-wise segment-boundary `target` matching against a
44-
published prefix set, sorted/non-overlapping/uniform trend arrays, most-recent-first
45-
truncation, UTC periods, and a not-reported sentinel that never silently degrades data.
46+
otherwise trapped in incompatible enterprise APIs — and the submitted -02 revision pinned
47+
down every interop edge a hostile review could raise: single-object vs array shape rules,
48+
scope-attribution echo for path-scoped responses, byte-wise segment-boundary `target`
49+
matching against a published prefix set, sorted/non-overlapping/uniform trend arrays,
50+
most-recent-first truncation, UTC periods, and machine-detectable not-reported semantics
51+
that never silently degrade data. The prepared -03 revision simplifies the model further:
52+
an unreported metric is simply *omitted* (no in-band sentinel), the energy/carbon value
53+
and unit members become optional with wire-level defaults (`kWh`/`gCO2e`), a mandatory
54+
free-form `target` member names the reporting subject (origin host, path prefix, entity,
55+
tenant, or carbon.txt-listed site), and all carbon members align on the CO2e naming
56+
convention — with field-driven compatibility rules keeping historical 1.x documents
57+
processable.
4658
- **Foolproof extensibility without process weight.** Forward compatibility rests on the
4759
must-ignore rule plus open schemas (the RFC 9457 model), not on version negotiation or a
4860
new IANA field registry: the published RFC accommodates all future fields as-is, and the
@@ -173,7 +185,7 @@ substantial organization in this space. An honest per-project comparison (facts
173185
| **carbon.txt** | TOML *disclosure index* at `/carbon.txt` (alt `/.well-known/carbon.txt`, DNS-TXT/header delegation): typed links (`csrd-report`, `certificate`, `sustainability-page`, `ai-model-card`, …) to where an org's evidence lives. "Connect, not collect." Community convention; **not IANA-registered; never submitted to the IETF.** | Links to documents — **the file itself carries zero kWh/gCO2e numbers**. Its validator's CSRD plugin can extract org-level ESRS datapoints from linked, audited iXBRL filings. | **High on ambition, partial on substance**: same discovery instinct, different payload (document index vs live numeric metrics), no query semantics, no metrics schema, no IANA path. Composes with this draft in both directions via `disclosure-uri`. |
174186
| **CO2.js** | JS estimation library (bytes → gCO2e; SWD v4 / OneByte models). Adopted by Firefox Profiler, WebPageTest, Ecograder, Website Carbon, Sitespeed.io (~10k npm downloads/week). | Consumes bytes + grid datasets; produces estimates. **Defines no discovery mechanism or wire format.** | **None on wire format; pure producer.** This repo's gateway ships a CO2.js adapter that emits draft-conformant documents. |
175187
| **Green Web Dataset / greencheck** | The verified green-*hosting* directory (since 2006; ~300 verified providers; millions of green domains; ODbL). | A boolean + provider identity + evidence links per domain — **no energy/carbon quantities**. | None on metrics. Certifies who hosts you, not what you emit. |
176-
| **Grid-aware Websites / IP-to-CO2 API / Grid Intensity CLI** | Grid-intensity tooling (adapt sites to grid conditions; country intensity by IP). | Grid averages — inputs to carbon math. | None; the IP-to-CO2 API is a natural *input* for this draft's `carbon-intensity-gCO2-per-kWh` field. |
188+
| **Grid-aware Websites / IP-to-CO2 API / Grid Intensity CLI** | Grid-intensity tooling (adapt sites to grid conditions; country intensity by IP). | Grid averages — inputs to carbon math. | None; the IP-to-CO2 API is a natural *input* for this draft's `carbon-intensity-gCO2e-per-kWh` field. |
177189
| **Branch magazine / Fellowships** | Community and editorial programs. || None. |
178190

179191
Adjacent but **not** GWF: the **Technology Carbon Standard (TCS)** is Scott Logic's
@@ -229,10 +241,13 @@ non-proprietary metrics.
229241
transport *before* per-vendor proprietary endpoints proliferate is precisely RFC 9547's
230242
recommendation, and is cheaper than harmonizing after the fact.
231243
3. *"Self-asserted numbers are greenwashing; GWF's model is evidence-reviewed."* — Mandatory
232-
`measurement-method` + `methodology-uri`, the machine-readable not-reported sentinel,
233-
the normative MUST-NOT-treat-as-proof rule, and the attestation/disclosure link-outs
234-
make self-assertion *auditable*; note that TCS-via-carbon.txt numbers are also
235-
self-published estimates. Verification composes on top; no format can conjure it in-band.
244+
`measurement-method` + `methodology-uri`, the omission-based not-reported model (a metric
245+
not reported is simply absent — a member present always carries a real value, and
246+
field-driven compatibility rules keep even historical sentinel-bearing 1.x documents
247+
machine-interpretable), the normative MUST-NOT-treat-as-proof rule, and the
248+
attestation/disclosure link-outs make self-assertion *auditable*; note that
249+
TCS-via-carbon.txt numbers are also self-published estimates. Verification composes on
250+
top; no format can conjure it in-band.
236251
4. *"One author, no adoption, no institutional weight."* — Which is exactly what IANA
237252
registration and an RFC add and a community convention cannot: name-collision
238253
protection, a stable citable reference that outlives any NGO's funding cycle, and
@@ -258,11 +273,15 @@ never positioning against it.
258273

259274
## 8. Possible objections — each pre-empted in the -02 text
260275

276+
*(-02 is the submitted revision under ISE review; a -03 revision with a simplified
277+
omission-based data model — schema label `"2.0"` — is prepared, and strengthens rather
278+
than disturbs every answer below.)*
279+
261280
| Objection | Answer (and where the draft already settles it) |
262281
|---|---|
263282
| "Methodologies differ; numbers aren't comparable." | The draft is explicitly a **discovery and semantics** layer, not a methodology mandate; `measurement-method` + `methodology-uri` disclose how each number was derived (§Goals and Non-Goals). |
264-
| "Self-declared data could be greenwashing." | The endpoint *asserts, it does not verify*, and says so: clients MUST NOT treat the document as proof; `verifiable-attestation-uri` and `disclosure-uri` link to independent evidence; a document with **both** required metrics unreported is NOT RECOMMENDED unless it carries a disclosure link — so the guaranteed floor is "real numbers, or a machine-followable pointer to them" (§Security, §Unreported Numeric Metrics). |
265-
| "What can a client actually rely on?" | A stable location, a fixed JSON shape with fixed unit vocabularies, machine-detectable not-reported semantics, `target-path` echo for scope attribution, and deterministic array rules — exactly what aggregators, crawlers, and procurement tooling lack today. |
283+
| "Self-declared data could be greenwashing." | The endpoint *asserts, it does not verify*, and says so: clients MUST NOT treat the document as proof; `verifiable-attestation-uri` and `disclosure-uri` link to independent evidence; and a minimum-reporting floor guarantees "real numbers, or a machine-followable pointer to them" (§Security; in the prepared -03, §Value Constraints and Omitted Metrics ties that floor to the mandatory `methodology-uri`). |
284+
| "What can a client actually rely on?" | A stable location, a fixed JSON shape with fixed unit vocabularies, machine-detectable not-reported semantics, a scope-attribution echo for path-scoped responses (the optional `target-path` member in the submitted -02; the mandatory `target` reporting-subject member in the prepared -03), and deterministic array rules — exactly what aggregators, crawlers, and procurement tooling lack today. |
266285
| "A query API on a well-known URI?" | WebFinger precedent; permitted by RFC 8615 §3; the parameters are optional with a mandatory no-parameter Basic fallback, and -02 fully specifies every parameter interaction (single-object rule, aggregation-or-404, array conditions) — no underspecified corners left (§Optional Extended Query Parameters). |
267286
| "The generic name 'sustainability' is registry squatting." | The metadata is genuinely site-wide (origin-level) — the exact pattern well-known URIs exist for; resource scoping uses a query parameter, not path segments; the IANA section says registration is sought for interoperable discovery, **not** to signal endorsement — pre-answering the expert's own published concern (§IANA Considerations). |
268287
| "Permanent status isn't justified for an ISE doc." | Agreed — the draft requests **provisional** outright, with the RFC 8615 promotion path noted. There is nothing to downgrade (§IANA Considerations). |
@@ -277,11 +296,12 @@ never positioning against it.
277296

278297
## 9. Readiness evidence (in this repository)
279298

280-
- Stable draft at **draft-besleaga-sustainability-wellknown-02**, posted to the Datatracker
281-
and submitted to the ISE (Independent Submission; continues and replaces the -00–-05
282-
series, with the datatracker "Replaces" relationship recorded). Builds strict-clean
283-
(`xml2rfc --strict`, 0 warnings; idnits **0 errors**); all 20 references verified against
284-
authoritative sources, none unused.
299+
- Submitted draft at **draft-besleaga-sustainability-wellknown-02**, posted to the
300+
Datatracker and under ISE review (Independent Submission; continues and replaces the
301+
-00–-05 series, with the datatracker "Replaces" relationship recorded); a **-03** revision
302+
with the simplified omission-based data model is prepared for posting when the submission
303+
window reopens. Both build strict-clean (`xml2rfc --strict`, 0 warnings; idnits
304+
**0 errors**); all references verified against authoritative sources, none unused.
285305
- **Two full pre-submission audit rounds**: a five-stream web-verified ISE-readiness audit
286306
(registry landscape, reference integrity, extensibility, ecosystem positioning,
287307
mailing-list precedent) and a three-reviewer adversarial pass (technical consistency,

0 commit comments

Comments
 (0)