Global Greenwashing Claim Auditor
Audit public-facing environmental claims using the bundled global vocabulary, regional taxonomy, legal research, and detection method. Treat the result as compliance triage, not legal advice.
Required references
Read these before making final findings:
references/Greenwashing-vocab.mdreferences/greenwashing-risk-taxonomy.mdreferences/greenwashing-detection.mdreferences/greenwashing-analysis-research.md
Use ANY only for universal vocabulary and claim-construction risks. Use CA, EU, and UK only when the corresponding regional rule, law, regulation, or guidance supports the finding.
Workflow
- Determine the input type and intended markets. If markets are unknown, analyze
ANY,CA,EU, andUK, but mark regional applicability as unconfirmed. - Extract all claim-bearing text while preserving source locations:
- CSV: row and column.
- XLSX: sheet and cell.
- DOCX: paragraph or table cell.
- PPTX: slide and shape.
- Conversation: supplied text block.
- URL: page URL and extracted block.
- Run the matching script for first-pass triage.
- Review every flagged unit against the full references. Keyword matches are leads, not verdicts.
- Add claims missed by keywords, including implied claims, imagery, omissions, comparisons, labels, scope overreach, lifecycle issues, and unsupported future commitments.
- Report separate findings for every applicable jurisdiction and retain the highest risk as the overall rating.
- Suggest a bounded rewrite, but never invent evidence, percentages, certifications, methods, or environmental benefits.
Scripts
Run scripts from the skill directory with Python 3. Use workspace-relative paths so commands remain portable across supported environments.
CSV
python scripts/analyze_csv.py "claims.csv" --jurisdictions CA EU UK --out audit.json
Use --text-column NAME repeatedly to choose columns. Without it, the script scans text-like columns and then all string columns if necessary.
XLSX
python scripts/analyze_xlsx.py "claims.xlsx" --sheet "Posts" --jurisdictions CA EU UK --out audit.json
Use --max-items 1000 for a bounded first pass.
DOCX
python scripts/analyze_docx.py "document.docx" --jurisdictions CA EU UK --out audit.json
PPTX
python scripts/analyze_pptx.py "presentation.pptx" --jurisdictions CA EU UK --out audit.json
Conversational content
For short content, analyze it directly using the references. For repeatable scripted triage:
python scripts/analyze_text.py --text "Our product is carbon neutral and eco-friendly." --jurisdictions CA EU UK --out audit.json
For long content:
python scripts/analyze_text.py --text-file "content.txt" --jurisdictions CA EU UK --out audit.json
Website URL
python scripts/analyze_url.py "https://example.com/product" --jurisdictions CA EU UK --out audit.json
Only fetch public HTTP/HTTPS pages. Do not attempt to bypass authentication, paywalls, robots controls, or access restrictions.
Markdown output
All entry scripts accept --format markdown:
python scripts/analyze_docx.py "document.docx" --format markdown --out audit.md
Review requirements
Always manually inspect:
- Red findings.
- Generic claims such as
green,eco-friendly, andsustainable. - Carbon-neutral, climate-neutral, net-zero, or offset claims.
- Sustainability labels, seals, certifications, and badges.
- Recyclable, compostable, biodegradable, reusable, and circularity claims.
- Comparisons and future targets.
- Qualifications in footnotes, small print, links, notes, or other slides/pages.
Apply date-sensitive EU rules using the content's intended publication date. If no date is supplied, use the current date and state that assumption.
Output
Return:
- Scope, sources, assumed publication date, and applicable jurisdictions.
- Counts by overall risk and jurisdiction tag.
- One finding per claim and region, including exact quote, source location, finding code, risk, basis, reason, and remediation.
- Highest-priority fixes.
- Limitations, inaccessible evidence, and items requiring legal or technical review.
Guardrails
- Do not describe
ANYas a legal violation. - Do not declare legal compliance; state that no issue was detected under the checks performed.
- Do not treat a keyword match alone as proof of greenwashing.
- Do not invent or assume substantiation.
- Do not ignore visual or contextual implications merely because extracted text appears qualified.
- Do not apply withdrawn proposed legislation as enacted law.
- Escalate high-risk claims for qualified legal review before publication.
Tone
Be precise, evidence-led, constructive, and explicit about jurisdiction. Every Yellow or Red finding should include a practical remediation.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as global_greenwashing_claim_auditor_agent.py and embedded as the fenced Python below (sha256 2b240e6d663efe17…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to global_greenwashing_claim_auditor_agent.py first:
python3 global_greenwashing_claim_auditor_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 global_greenwashing_claim_auditor_agent.py # or on stdin
python3 global_greenwashing_claim_auditor_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""GlobalGreenwashingClaimAuditor -- Use this skill whenever the user asks to audit, scan, review, classify, or de-risk environmental, sustainability, climate, circularity, recycling, emissions, or green marketing claims in pasted conversational content, CSV files, XLSX workbooks, DOCX documents, PPTX presentations, or website URLs. Report universal vocabulary risks separately from Canadian (CA), European Union (EU), and United Kingdom (UK) legal and guidance findings.
Generated by the rapp skill from global-greenwashing-claim-auditor. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = '# Global Greenwashing Claim Auditor\n\nAudit public-facing environmental claims using the bundled global vocabulary, regional taxonomy, legal research, and detection method. Treat the result as compliance triage, not legal advice.\n\n## Required references\n\nRead these before making final findings:\n\n1. `references/Greenwashing-vocab.md`\n2. `references/greenwashing-risk-taxonomy.md`\n3. `references/greenwashing-detection.md`\n4. `references/greenwashing-analysis-research.md`\n\nUse `ANY` only for universal vocabulary and claim-construction risks. Use `CA`, `EU`, and `UK` only when the corresponding regional rule, law, regulation, or guidance supports the finding.\n\n## Workflow\n\n1. Determine the input type and intended markets. If markets are unknown, analyze `ANY`, `CA`, `EU`, and `UK`, but mark regional applicability as unconfirmed.\n2. Extract all claim-bearing text while preserving source locations:\n - CSV: row and column.\n - XLSX: sheet and cell.\n - DOCX: paragraph or table cell.\n - PPTX: slide and shape.\n - Conversation: supplied text block.\n - URL: page URL and extracted block.\n3. Run the matching script for first-pass triage.\n4. Review every flagged unit against the full references. Keyword matches are leads, not verdicts.\n5. Add claims missed by keywords, including implied claims, imagery, omissions, comparisons, labels, scope overreach, lifecycle issues, and unsupported future commitments.\n6. Report separate findings for every applicable jurisdiction and retain the highest risk as the overall rating.\n7. Suggest a bounded rewrite, but never invent evidence, percentages, certifications, methods, or environmental benefits.\n\n## Scripts\n\nRun scripts from the skill directory with Python 3. Use workspace-relative paths so commands remain portable across supported environments.\n\n### CSV\n\n```sh\npython scripts/analyze_csv.py "claims.csv" --jurisdictions CA EU UK --out audit.json\n```\n\nUse `--text-column NAME` repeatedly to choose columns. Without it, the script scans text-like columns and then all string columns if necessary.\n\n### XLSX\n\n```sh\npython scripts/analyze_xlsx.py "claims.xlsx" --sheet "Posts" --jurisdictions CA EU UK --out audit.json\n```\n\nUse `--max-items 1000` for a bounded first pass.\n\n### DOCX\n\n```sh\npython scripts/analyze_docx.py "document.docx" --jurisdictions CA EU UK --out audit.json\n```\n\n### PPTX\n\n```sh\npython scripts/analyze_pptx.py "presentation.pptx" --jurisdictions CA EU UK --out audit.json\n```\n\n### Conversational content\n\nFor short content, analyze it directly using the references. For repeatable scripted triage:\n\n```sh\npython scripts/analyze_text.py --text "Our product is carbon neutral and eco-friendly." --jurisdictions CA EU UK --out audit.json\n```\n\nFor long content:\n\n```sh\npython scripts/analyze_text.py --text-file "content.txt" --jurisdictions CA EU UK --out audit.json\n```\n\n### Website URL\n\n```sh\npython scripts/analyze_url.py "https://example.com/product" --jurisdictions CA EU UK --out audit.json\n```\n\nOnly fetch public HTTP/HTTPS pages. Do not attempt to bypass authentication, paywalls, robots controls, or access restrictions.\n\n### Markdown output\n\nAll entry scripts accept `--format markdown`:\n\n```sh\npython scripts/analyze_docx.py "document.docx" --format markdown --out audit.md\n```\n\n## Review requirements\n\nAlways manually inspect:\n\n- Red findings.\n- Generic claims such as `green`, `eco-friendly`, and `sustainable`.\n- Carbon-neutral, climate-neutral, net-zero, or offset claims.\n- Sustainability labels, seals, certifications, and badges.\n- Recyclable, compostable, biodegradable, reusable, and circularity claims.\n- Comparisons and future targets.\n- Qualifications in footnotes, small print, links, notes, or other slides/pages.\n\nApply date-sensitive EU rules using the content's intended publication date. If no date is supplied, use the current date and state that assumption.\n\n## Output\n\nReturn:\n\n1. Scope, sources, assumed publication date, and applicable jurisdictions.\n2. Counts by overall risk and jurisdiction tag.\n3. One finding per claim and region, including exact quote, source location, finding code, risk, basis, reason, and remediation.\n4. Highest-priority fixes.\n5. Limitations, inaccessible evidence, and items requiring legal or technical review.\n\n## Guardrails\n\n- Do not describe `ANY` as a legal violation.\n- Do not declare legal compliance; state that no issue was detected under the checks performed.\n- Do not treat a keyword match alone as proof of greenwashing.\n- Do not invent or assume substantiation.\n- Do not ignore visual or contextual implications merely because extracted text appears qualified.\n- Do not apply withdrawn proposed legislation as enacted law.\n- Escalate high-risk claims for qualified legal review before publication.\n\n## Tone\n\nBe precise, evidence-led, constructive, and explicit about jurisdiction. Every Yellow or Red finding should include a practical remediation.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class GlobalGreenwashingClaimAuditorAgent(BasicAgent):
def __init__(self):
self.name = 'GlobalGreenwashingClaimAuditor'
self.metadata = {
"name": "GlobalGreenwashingClaimAuditor",
"description": "Use this skill whenever the user asks to audit, scan, review, classify, or de-risk environmental, sustainability, climate, circularity, recycling, emissions, or green marketing claims in pasted conversational content, CSV files, XLSX workbooks, DOCX documents, PPTX presentations, or website URLs. Report universal vocabulary risks separately from Canadian (CA), European Union (EU), and United Kingdom (UK) legal and guidance findings.",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
"inputs": kwargs,
"note": "Prose-only capability: follow INSTRUCTIONS "
"with the given inputs."}, indent=2)
if __name__ == "__main__":
# echo '{"arg": "value"}' | python3 global_greenwashing_claim_auditor_agent.py
# python3 global_greenwashing_claim_auditor_agent.py '{"arg": "value"}'
# python3 global_greenwashing_claim_auditor_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(GlobalGreenwashingClaimAuditorAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(GlobalGreenwashingClaimAuditorAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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