Inspiration
I work in climate and ESG data, and I kept running into the same problem: sustainability reports are full of claims like "we reduced our carbon footprint by 30%," and there's no fast way to tell which ones are backed by real, auditable numbers and which ones are marketing language wearing a metric as a costume. With disclosure rules like the EU's CSRD and the SEC's climate rules raising the stakes on these claims, I wanted to build something that could triage a report in minutes instead of hours.
What it does
ScopeCheck reads a corporate sustainability report and flags every quantified emissions-reduction or net-zero claim that's written in a way that can't actually be verified. It works in three steps: extract every claim verbatim with its source sentence, score each one against a 7-criterion credibility rubric (baseline year, GHG scope, absolute vs. intensity framing, third-party verification, time-bound targets, offset disclosure, and named methodology), and report back a tiered verdict with the full reasoning behind every criterion, not just a color.
Tested against a real 2025 corporate sustainability report, it caught a 19.1% Scope 3 emissions increase that was stated plainly in body text but never appeared on the report's own highlights page.
How I built it
The pipeline runs on Claude through the Anthropic API in two separate, independent calls: one for extraction, one for scoring, each using forced tool-use for structured, reliable JSON output instead of fragile text parsing. The rubric itself is prompt-engineered from real disclosure standards: the GHG Protocol, the Science Based Targets initiative, and how groups like the New Climate Institute actually audit corporate net-zero pledges. The interface is Streamlit, with PDF ingestion via pdfplumber.
Challenges I ran into
I started by trying to build this on Google's Gemini free tier to keep costs at zero, and hit a real wall: my Google account already had billing history from an earlier project, which silently pushed every new project onto a paid "Prepay" tier that my existing Google Cloud credits couldn't actually be applied to. Mid-switch back to Anthropic, I also hit a live API change: the Messages API had removed the temperature parameter entirely since I'd last used it, which meant giving up on forcing deterministic output and instead being upfront in my documentation that claim counts can vary slightly between runs.
Testing on a real 83-page report also surfaced messier problems than any toy example would: the same fact stated twice (a stats callout and body prose) came back as two separate claims, and a few renewable-energy-mix percentages slipped past my extraction filter despite explicitly excluding them. Rather than chase every edge case, I documented them honestly as known limitations, since a tool that's transparent about what it doesn't catch is more trustworthy than one that pretends to be perfect.
What I learned
Real accountability standards translate surprisingly well into a prompt-engineered rubric, and keeping extraction and scoring as separate model calls made every step independently debuggable when something looked off. I also learned, the hard way, that both LLM provider APIs and their billing systems are moving targets mid-build, and designing for that (isolating the model name as a single constant, for one) turned a potential rewrite into a one-line fix.
What's next
Expanding the rubric to other ESG claim types like water use and supply chain labor, connecting a claim to its assurance statement when one exists elsewhere in the same document, and a batch mode for processing a portfolio of reports instead of one at a time.
Built With
- claude
- climate-tech
- ghg-protocol
- github-codespaces
- llm
- python
- streamlit
- tool-use
Log in or sign up for Devpost to join the conversation.