{
  "schema": "ecomark-automated-analysis-v1",
  "generated_at": "2026-08-28T03:04:53.843Z",
  "algorithm": {
    "version": "1",
    "status": "current",
    "name": "EcoMark v1",
    "published": "2026-08-28",
    "rubric": {
      "0": "Fails materially or creates clear harm in this criterion.",
      "1": "Poor. Significant problems or unnecessary impact remain.",
      "2": "Mixed. Some good practice is present, but material gaps remain.",
      "3": "Good. The criterion is mostly met with only limited gaps.",
      "4": "Strong. The criterion is deliberately and consistently met."
    },
    "formula": {
      "criterion": "criterion_points = max_points × level ÷ 4",
      "category": "category_score = sum(criterion_points)",
      "overall": "overall_score = round(sum(category_score × category_weight))",
      "ranking": "competition ranking: equal scores share a rank and the next rank skips accordingly (1, 1, 3)",
      "comparison": "rankings compare assessments produced by the same EcoMark version only",
      "historical_cutoff": "historical rankings use published_at, not assessed_on"
    },
    "analysis": {
      "type": "automated-observable-web",
      "rendered_homepage": true,
      "max_pages": 3,
      "max_asset_samples": 24,
      "freshness_hours": 24,
      "rules": {
        "efficiency": {
          "payload": {
            "metric": "average_page_kb",
            "direction": "lower",
            "bands": [
              500,
              1000,
              2000,
              4000
            ],
            "unit": "KB/page"
          },
          "javascript": {
            "metric": "average_javascript_kb",
            "direction": "lower",
            "bands": [
              100,
              250,
              500,
              1000
            ],
            "unit": "KB/page"
          },
          "requests": {
            "metric": "average_resource_references",
            "direction": "lower",
            "bands": [
              20,
              40,
              70,
              100
            ],
            "unit": "resources/page"
          },
          "media": {
            "metric": "media_issue_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              3,
              6
            ],
            "unit": "issues"
          },
          "caching": {
            "metric": "cacheable_asset_percent",
            "direction": "higher",
            "bands": [
              80,
              60,
              40,
              20
            ],
            "unit": "%"
          }
        },
        "privacy": {
          "trackers": {
            "metric": "tracker_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              4
            ],
            "unit": "known trackers"
          },
          "analytics": {
            "metric": "analytics_risk",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              3
            ],
            "unit": "risk level"
          },
          "cookies": {
            "metric": "nonessential_cookie_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              3,
              6
            ],
            "unit": "response cookies"
          },
          "third_party_data": {
            "metric": "third_party_percent",
            "direction": "lower",
            "bands": [
              0,
              10,
              25,
              50
            ],
            "unit": "%"
          },
          "invasive_techniques": {
            "metric": "invasive_tracker_count",
            "direction": "lower",
            "bands": [
              0,
              0,
              0,
              1
            ],
            "unit": "known invasive tools"
          }
        },
        "sovereignty": {
          "provider_jurisdiction": {
            "metric": "us_provider_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              3,
              6
            ],
            "unit": "provider ecosystems"
          },
          "data_location": {
            "metric": "known_non_eu_data_percent",
            "direction": "lower",
            "bands": [
              0,
              10,
              30,
              60
            ],
            "unit": "%"
          },
          "portability": {
            "metric": "proprietary_embed_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              3,
              6
            ],
            "unit": "embeds"
          },
          "concentration": {
            "metric": "top_provider_share_percent",
            "direction": "lower",
            "bands": [
              0,
              40,
              65,
              85
            ],
            "unit": "%"
          },
          "openness": {
            "metric": "first_party_asset_percent",
            "direction": "higher",
            "bands": [
              95,
              80,
              60,
              40
            ],
            "unit": "%"
          }
        },
        "accessibility": {
          "semantics": {
            "metric": "semantic_issue_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              4
            ],
            "unit": "issues"
          },
          "keyboard": {
            "metric": "keyboard_issue_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              3,
              6
            ],
            "unit": "issues"
          },
          "controls": {
            "metric": "unlabelled_control_percent",
            "direction": "lower",
            "bands": [
              0,
              5,
              15,
              30
            ],
            "unit": "%"
          },
          "visual": {
            "metric": "visual_issue_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              4
            ],
            "unit": "issues"
          },
          "resilience": {
            "metric": "raw_text_ratio_percent",
            "direction": "higher",
            "bands": [
              80,
              60,
              40,
              20
            ],
            "unit": "%"
          }
        },
        "responsibility": {
          "transparency": {
            "metric": "missing_transparency_links",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              3
            ],
            "unit": "missing links"
          },
          "security": {
            "metric": "security_header_count",
            "direction": "higher",
            "bands": [
              5,
              4,
              3,
              2
            ],
            "unit": "headers"
          },
          "consent_design": {
            "metric": "consent_issue_score",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              3
            ],
            "unit": "risk level"
          },
          "supplier_disclosure": {
            "metric": "undisclosed_provider_percent",
            "direction": "lower",
            "bands": [
              0,
              25,
              50,
              75
            ],
            "unit": "%"
          },
          "sustainability_governance": {
            "metric": "responsible_default_issue_count",
            "direction": "lower",
            "bands": [
              0,
              1,
              2,
              4
            ],
            "unit": "issues"
          }
        }
      },
      "note": "EcoMark v1 scores observable website behaviour. It does not claim to rate an organisation as ethical or sustainable."
    },
    "grades": [
      {
        "grade": "A",
        "min": 90,
        "max": 100
      },
      {
        "grade": "B",
        "min": 80,
        "max": 89
      },
      {
        "grade": "C",
        "min": 70,
        "max": 79
      },
      {
        "grade": "D",
        "min": 60,
        "max": 69
      },
      {
        "grade": "E",
        "min": 50,
        "max": 59
      },
      {
        "grade": "F",
        "min": 0,
        "max": 49
      }
    ],
    "categories": [
      {
        "key": "efficiency",
        "label": "Efficiency",
        "weight": 0.25,
        "short": "Resource use, page weight and avoidable computation.",
        "criteria": [
          {
            "key": "payload",
            "label": "Payload",
            "max_points": 20,
            "description": "Measured HTML and asset payload is proportionate and optimised."
          },
          {
            "key": "javascript",
            "label": "JavaScript",
            "max_points": 20,
            "description": "Referenced JavaScript weight is kept proportionate."
          },
          {
            "key": "requests",
            "label": "Requests",
            "max_points": 20,
            "description": "Pages avoid excessive resource references and third-party connections."
          },
          {
            "key": "media",
            "label": "Media",
            "max_points": 20,
            "description": "Images and video avoid obvious loading and autoplay waste."
          },
          {
            "key": "caching",
            "label": "Caching and compression",
            "max_points": 20,
            "description": "Sampled static assets expose effective cache policy."
          }
        ]
      },
      {
        "key": "privacy",
        "label": "Privacy",
        "weight": 0.25,
        "short": "Tracking, cookies, profiling, analytics and consent.",
        "criteria": [
          {
            "key": "trackers",
            "label": "Behavioural tracking",
            "max_points": 20,
            "description": "Known advertising pixels and cross-site trackers are absent or minimised."
          },
          {
            "key": "analytics",
            "label": "Analytics minimisation",
            "max_points": 20,
            "description": "Analytics technology is absent or privacy-preserving and proportionate."
          },
          {
            "key": "cookies",
            "label": "Cookies and consent",
            "max_points": 20,
            "description": "Non-essential response cookies are avoided before interaction."
          },
          {
            "key": "third_party_data",
            "label": "Third-party disclosure",
            "max_points": 20,
            "description": "Resource loading does not unnecessarily disclose visits to third parties."
          },
          {
            "key": "invasive_techniques",
            "label": "Invasive techniques",
            "max_points": 20,
            "description": "Known session replay and similarly invasive tools are absent."
          }
        ]
      },
      {
        "key": "sovereignty",
        "label": "Sovereignty",
        "weight": 0.2,
        "short": "Ownership, geography, portability and dependency.",
        "criteria": [
          {
            "key": "provider_jurisdiction",
            "label": "Provider jurisdiction",
            "max_points": 20,
            "description": "Observable dependencies minimise reliance on US-headquartered platform ecosystems."
          },
          {
            "key": "data_location",
            "label": "Third-party geography",
            "max_points": 20,
            "description": "Known non-EU third-party data exposure is minimised."
          },
          {
            "key": "portability",
            "label": "Portable delivery",
            "max_points": 20,
            "description": "Pages minimise proprietary embeds and platform-specific content dependencies."
          },
          {
            "key": "concentration",
            "label": "Supplier concentration",
            "max_points": 20,
            "description": "Third-party resource loading is not dominated by one provider ecosystem."
          },
          {
            "key": "openness",
            "label": "First-party delivery",
            "max_points": 20,
            "description": "Assets are delivered directly from the site where practical."
          }
        ]
      },
      {
        "key": "accessibility",
        "label": "Accessibility",
        "weight": 0.15,
        "short": "Inclusive, semantic and resilient implementation.",
        "criteria": [
          {
            "key": "semantics",
            "label": "Semantics",
            "max_points": 20,
            "description": "HTML exposes basic language, heading and landmark structure."
          },
          {
            "key": "keyboard",
            "label": "Keyboard access",
            "max_points": 20,
            "description": "Markup avoids obvious keyboard-hostile interaction patterns."
          },
          {
            "key": "controls",
            "label": "Forms and controls",
            "max_points": 20,
            "description": "Form controls expose labels or accessible names."
          },
          {
            "key": "visual",
            "label": "Visual accessibility",
            "max_points": 20,
            "description": "Viewport and media markup avoid obvious visual accessibility barriers."
          },
          {
            "key": "resilience",
            "label": "Resilience",
            "max_points": 20,
            "description": "Meaningful text remains present without relying entirely on client rendering."
          }
        ]
      },
      {
        "key": "responsibility",
        "label": "Responsibility",
        "weight": 0.15,
        "short": "Transparency, security basics and responsible choices.",
        "criteria": [
          {
            "key": "transparency",
            "label": "Transparency",
            "max_points": 20,
            "description": "Privacy, cookies, accessibility and contact information are discoverable."
          },
          {
            "key": "security",
            "label": "Security basics",
            "max_points": 20,
            "description": "The main response exposes sensible browser security headers."
          },
          {
            "key": "consent_design",
            "label": "Consent design",
            "max_points": 20,
            "description": "Tracking and consent markup avoids obvious one-sided choice patterns."
          },
          {
            "key": "supplier_disclosure",
            "label": "Supplier disclosure",
            "max_points": 20,
            "description": "Detected material providers are reflected in discoverable privacy information."
          },
          {
            "key": "sustainability_governance",
            "label": "Responsible defaults",
            "max_points": 20,
            "description": "The observable site defaults avoid trackers, autoplay and weak transparency/security."
          }
        ]
      }
    ]
  },
  "algorithm_sha256": "dd30039ccf81a53d7b400927895a018c7bafbf72ecbdbc18fa358e7b84de6ad4",
  "source_fingerprint": "e081c45cb2cf10a030c0817dc2be392b37e64416c8927d4ce97f5bd634fe6e2e",
  "metrics": {
    "pages_checked": 1,
    "browser_rendered_homepage": true,
    "average_page_kb": 176,
    "average_javascript_kb": 92,
    "average_resource_references": 45,
    "media_issue_count": 1,
    "cacheable_asset_percent": 0,
    "tracker_count": 4,
    "analytics_risk": 2,
    "nonessential_cookie_count": 0,
    "third_party_percent": 0,
    "invasive_tracker_count": 0,
    "us_provider_count": 1,
    "known_non_eu_data_percent": 0,
    "proprietary_embed_count": 0,
    "top_provider_share_percent": 0,
    "first_party_asset_percent": 100,
    "semantic_issue_count": 3,
    "keyboard_issue_count": 0,
    "unlabelled_control_percent": 0,
    "visual_issue_count": 1,
    "raw_text_ratio_percent": 24,
    "missing_transparency_links": 1,
    "security_header_count": 3,
    "consent_issue_score": 3,
    "undisclosed_provider_percent": 0,
    "responsible_default_issue_count": 1
  },
  "pages": [
    {
      "url": "https://www.theclimatecoalition.org/",
      "status": 200,
      "browser_rendered": true,
      "html_bytes": 49989
    }
  ],
  "providers": [],
  "tracker_urls": [
    "https://www.theclimatecoalition.org/%22https://connect.facebook.net/signals/config/967915715299033?v=2.9.385&amp;r=stable&amp;domain=www.theclimatecoalition.org&amp;hme=1a72ec78e057d90ba48afa55a82b063b1c9b6ab7c0155009fecc72226a622ed2&amp;ex_m=113%2C218%2C164%2C25%2C78%2C79%2C156%2C74%2C73%2C11%2C174%2C98%2C19%2C148%2C136%2C43%2C81%2C86%2C144%2C169%2C176%2C29%2C17%2C30%2C31%2C32%2C34%2C52%2C157%2C83%2C121%2C21%2C23%2C48%2C44%2C46%2C45%2C91%2C100%2C104%2C119%2C155%2C158%2C50%2C120%2C27%2C24%2C128%2C75%2C40%2C160%2C159%2C161%2C152%2C150%2C28%2C39%2C63%2C118%2C171%2C76%2C20%2C123%2C89%2C72%2C22%2C93%2C94%2C125%2C92%2C146%2C145%2C149%2C105%2C170%2C173%2C38%2C53%2C122%2C51%2C8%2C4%2C5%2C7%2C6%2C3%2C99%2C110%2C177%2C185%2C232%2C80%2C245%2C244%2C243%2C14%2C26%2C37%2C59%2C112%2C65%2C10%2C69%2C106%2C107%2C108%2C114%2C139%2C35%2C33%2C141%2C142%2C143%2C138%2C137%2C165%2C82%2C168%2C166%2C167%2C54%2C64%2C132%2C18%2C172%2C49%2C293%2C294%2C292%2C307%2C329%2C225%2C214%2C66%2C215%2C213%2C332%2C323%2C56%2C226%2C116%2C140%2C88%2C130%2C58%2C129%2C135%2C134%2C62%2C70%2C68%2C162%2C84%2C85%2C124%2C41%2C36%2C57%2C60%2C109%2C175%2C1%2C133%2C16%2C131%2C12%2C2%2C61%2C101%2C15%2C71%2C67%2C127%2C97%2C96%2C178%2C179%2C102%2C103%2C9%2C111%2C55%2C153%2C95%2C87%2C77%2C126%2C115%2C47%2C154%2C0%2C90%2C147%2C151%2C163%2C42%2C117%2C13%2C180\\%22",
    "https://www.theclimatecoalition.org/%22https://connect.facebook.net/en_US/bundle/sdk.js//%22",
    "https://www.theclimatecoalition.org/%22//connect.facebook.net/en_US/sdk.js/%22",
    "https://www.theclimatecoalition.org/%22https://connect.facebook.net/en_US/fbevents.js/%22"
  ],
  "assessment": {
    "id": "e3e58bd4-8d18-4c6b-a2cb-adaefb5dd87b",
    "domain": "theclimatecoalition.org",
    "site_name": "The Climate Coalition",
    "website_url": "https://www.theclimatecoalition.org/",
    "ecomark_version": "1",
    "overall_score": 74,
    "grade": "C",
    "summary": "Automated EcoMark v1 analysis of 1 public page. The homepage was browser-rendered.",
    "assessed_on": "2026-08-28",
    "categories": [
      {
        "category": "efficiency",
        "score": 65,
        "criteria": {
          "payload": {
            "level": 4,
            "points": 20
          },
          "javascript": {
            "level": 4,
            "points": 20
          },
          "requests": {
            "level": 2,
            "points": 10
          },
          "media": {
            "level": 3,
            "points": 15
          },
          "caching": {
            "level": 0,
            "points": 0
          }
        },
        "priority": "medium",
        "finding": "1 pages · ~176 KB measured/page · 45 resource references/page · 0% sampled assets cacheable.",
        "evidence": "1 pages · ~176 KB measured/page · 45 resource references/page · 0% sampled assets cacheable.",
        "why_it_matters": "Lighter pages consume less bandwidth and device work and remain usable on slower connections.",
        "action": "Add long-lived cache headers to versioned static assets."
      },
      {
        "category": "privacy",
        "score": 75,
        "criteria": {
          "trackers": {
            "level": 1,
            "points": 5
          },
          "analytics": {
            "level": 2,
            "points": 10
          },
          "cookies": {
            "level": 4,
            "points": 20
          },
          "third_party_data": {
            "level": 4,
            "points": 20
          },
          "invasive_techniques": {
            "level": 4,
            "points": 20
          }
        },
        "priority": "medium",
        "finding": "4 known trackers · 0 tracking-style response cookies · 0% third-party resource references.",
        "evidence": "4 known trackers · 0 tracking-style response cookies · 0% third-party resource references.",
        "why_it_matters": "Minimising tracking and third-party disclosure reduces profiling and unnecessary visitor data exposure.",
        "action": "Remove behavioural advertising pixels and cross-site trackers."
      },
      {
        "category": "sovereignty",
        "score": 95,
        "criteria": {
          "provider_jurisdiction": {
            "level": 3,
            "points": 15
          },
          "data_location": {
            "level": 4,
            "points": 20
          },
          "portability": {
            "level": 4,
            "points": 20
          },
          "concentration": {
            "level": 4,
            "points": 20
          },
          "openness": {
            "level": 4,
            "points": 20
          }
        },
        "priority": "low",
        "finding": "1 US-headquartered provider ecosystems · 100% first-party assets · 0 proprietary embeds.",
        "evidence": "1 US-headquartered provider ecosystems · 100% first-party assets · 0 proprietary embeds.",
        "why_it_matters": "A more portable and less concentrated stack gives organisations more control over technology and jurisdiction.",
        "action": "Reduce critical dependence on large non-European platform ecosystems where practical."
      },
      {
        "category": "accessibility",
        "score": 65,
        "criteria": {
          "semantics": {
            "level": 1,
            "points": 5
          },
          "keyboard": {
            "level": 4,
            "points": 20
          },
          "controls": {
            "level": 4,
            "points": 20
          },
          "visual": {
            "level": 3,
            "points": 15
          },
          "resilience": {
            "level": 1,
            "points": 5
          }
        },
        "priority": "medium",
        "finding": "3 semantic issues · 0 keyboard markup issues · 0% unlabelled controls · 24% raw/rendered text ratio.",
        "evidence": "3 semantic issues · 0 keyboard markup issues · 0% unlabelled controls · 24% raw/rendered text ratio.",
        "why_it_matters": "Accessible, resilient markup works for more people, assistive technology and older or constrained devices.",
        "action": "Fix basic document semantics: language, one clear H1 and meaningful landmarks/headings."
      },
      {
        "category": "responsibility",
        "score": 65,
        "criteria": {
          "transparency": {
            "level": 3,
            "points": 15
          },
          "security": {
            "level": 2,
            "points": 10
          },
          "consent_design": {
            "level": 1,
            "points": 5
          },
          "supplier_disclosure": {
            "level": 4,
            "points": 20
          },
          "sustainability_governance": {
            "level": 3,
            "points": 15
          }
        },
        "priority": "medium",
        "finding": "3/5 security headers · 1 missing transparency links · 0% detected providers undisclosed.",
        "evidence": "3/5 security headers · 1 missing transparency links · 0% detected providers undisclosed.",
        "why_it_matters": "Transparent, secure defaults make digital impact understandable and give visitors meaningful choices.",
        "action": "Where consent is required, make reject and accept choices equally clear and do not track beforehand."
      }
    ]
  }
}
