{"schema_version":"1","site":"https://decosa.ai","id":"green-claims-check","num":"45","name":"Green-claims substantiation check","tool_name":"Check green claims in copy","short":"Green claims","blurb":"Checks every environmental claim in pack copy, a product page or an ad script against the EU bans that apply from 27 September 2026 (Directive (EU) 2024/825) or the UK CMA Green Claims Code: generic claims, offset-based climate neutral, own-brand labels, whole-product claims, legal requirements sold as features and future targets without a plan. Each claim gets a verdict with the rule cited, the evidence-file line that backs it, and a rewrite; you get a CSV claim table and a signed report. A triage, not a compliance sign-off.","status":"live","labels":{"industry":["compliance-trust"],"job":["review","attest"],"input":["text"],"deploy":["hosted","selfhost"],"status":"live","output":["data","record"],"data":["confidential"],"hardware":"gpu-96","licence":"permissive"},"industries":["compliance-trust"],"runs_in":["hosted","selfhost"],"part_of":[],"built_from":["typed-judgment","grounding","signed-record"],"models":"Qwen3.8-27B","where":"Hosted for published or synthetic copy; self-host for unreleased copy and supplier contracts","hardware":"1× RTX PRO 6000 (96 GB) or 1× RTX 5090 (32 GB) for the model; the rulepack, grounding spans and the report run on CPU","final_artifact":"A claim table (CSV) with verdict, rule, quoted evidence and rewrite per claim, a Markdown report and a signed JSON record.","self_host_first":false,"verification":{"receipt_coverage":"full","summary":"Receipt per model call; signed report","manual_qa":{"hosted":{"date":"2026-09-25","result":"pass","p50_ms":8600,"p95_ms":null,"runs":null,"receipts_per_run":26,"cost_per_run_usd":0.0126},"selfhost":{"date":"2026-09-25","result":"pass","method":"fresh clone, compose up, sample against local model servers","notes":"A fresh clone of a decosa-api pre-release build (not yet merged to main), the api image built from it, the compose file from this prompt, then its smoke steps against the already-running local Qwen3.8-27B vLLM on the direct route. All three samples ran (4.5-6 s each): Fernhollow banned_claims with 5 bans, Quillbrook nothing_flagged, Northwick (UK) high_risk; the report verified and a changed status failed. Model-server startup itself not re-verified."},"known_limits":["Text only: artwork, colours and label images are not read. Describe a label in words to have it checked.","Checks the Directive's text, not national transposing laws, and not the durability and repair bans (23d to 23j).","The eval is small and synthetic, and the gateway is not fully deterministic: the same piece can get a different verdict on a borderline claim from run to run. A person reviews every finding."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Verdict accuracy, v2 on test2 (held out, first run)","value":"43/44 (98%)","unit":null,"n":44,"split":"heldout","note":"v2.2 reruns on test2: 41/44 each."},{"name":"Planted violations flagged, v2 on test2 (held out)","value":"19/19","unit":null,"n":19,"split":"heldout","note":"v2.2 reruns: 18/19 each."},{"name":"False alarms on clean claims and non-claims, v2 on test2 (held out)","value":"0/25","unit":null,"n":25,"split":"heldout","note":"v2.2 reruns: 1/25 each."},{"name":"Verdict accuracy, v1 on test (held out)","value":"58/69 (84%)","unit":null,"n":69,"split":"heldout","note":"30/30 violations flagged, 5/39 false alarms; v2 was then changed after reading these errors."},{"name":"Verdict accuracy, word list only, test2","value":"12/44 (27%)","unit":null,"n":44,"split":"heldout","note":"Baseline without the model: 4/19 violations flagged."},{"name":"Model rewrites still using a generic or neutrality term, v2 on test2","value":"2/9","unit":null,"n":9,"split":"heldout","note":"Withheld from display since v2.1."}],"dataset":"18 synthetic marketing pieces with evidence files for fictional brands (dev 3, test 9, test2 6), each sentence labelled with the expected verdict and EU Empowering Consumers Directive rule.","held_out":true,"caveats":["Small and synthetic: 44 held-out sentences in 6 pieces, 2 to 4 planted per rule.","The same author (Claude, for Decosa) wrote the cases and the prompts, so they may share blind spots.","Prompts were changed after reading the v1 test errors, so v2 and later numbers on the test split are not held out; the shipped v2.3 on test2 is not held out either.","No regulator decision or court case was used as ground truth; labels are our reading of the Directive.","Text only: labels drawn as artwork, colours and imagery are not read.","The gateway is not fully deterministic at temperature 0; reruns differ by a sentence or two."],"date":"2026-09-25","doc_url":"https://decosa.ai/metrics/evals/green-claims-check"},"stack":{"summary":"Send pack copy, a product page or an ad script, plus the evidence file behind it: LCA summaries, certificates, offset contracts, plans. Each sentence is typed by one receipted call (generic term, climate neutrality, offsets, a label, a future target, a whole-product claim, a legal requirement sold as a feature). Environmental claims are then grounded in the evidence file by the grounding module, which cites the span, and one more call reads the evidence for offsets, recognised ecolabels, certification schemes, implementation plans and whole-or-part coverage. A deterministic rulepack gives each claim a verdict (banned, needs substantiation, substantiated, or not an environmental claim) with the rule cited, and the model drafts a rewrite that says only what the evidence backs. You get a CSV claim table, a Markdown report and a signed record. EU mode follows Directive (EU) 2024/825; UK mode follows the CMA Green Claims Code. It is a triage for a compliance reviewer, never a compliance sign-off.","tagline":"Every environmental claim in your copy judged against the EU bans that apply from 27 September 2026, with the rule cited, the evidence line that backs it, and a rewrite.","deployment":"hosted-or-self-host","regulatory_note":"Checked 25 Sep 2026 against the primary sources. EU: Directive (EU) 2024/825 (OJ L, 6.3.2024; EUR-Lex link under Tools) amends the Unfair Commercial Practices Directive 2005/29/EC. Member States had to adopt their measures by 27 March 2026 and apply them from 27 September 2026 (Article 4(1)); national transposing laws are what apply, and this tool does not check national differences. It encodes the new Annex I bans (2a sustainability labels without a certification scheme or public authority, 4a generic claims without recognised excellent environmental performance, 4b whole-product or whole-business claims when only a part qualifies, 4c offset-based neutral, reduced or positive greenhouse-gas claims, 10a legal requirements presented as a distinctive feature) and Article 6(2)(d) (future performance claims without a verified implementation plan), which is case by case, so it can only raise 'needs substantiation'. The durability, repair and software bans (23d to 23j) are not checked. The proposed Green Claims Directive (2023/0085(COD)) is not law and is not encoded: on 20 June 2025 the Commission announced its intent to withdraw it and the last trilogue was cancelled; the 2026 work programme lists it as pending (European Parliament Legislative Train, updated 1 Aug 2026). UK: the CMA Green Claims Code (20 Sep 2021; GOV.UK link under Tools) is guidance, not a list of per se bans, so UK mode never says 'banned'; since April 2025 the CMA can itself fine up to 10% of global turnover for consumer-law breaches under the DMCC Act 2024 (CMA press release, 7 Apr 2025). Text only: artwork, colours and label images are not read. Verdicts come from a language model plus fixed rules and can be wrong in both directions (see the eval). Not legal advice, and a clean result is not a compliance sign-off. The hosted demo keeps nothing; unreleased copy and supplier contracts belong on a self-hosted box. Model licence: Apache-2.0 (Qwen3.8-27B).","components":[{"id":"rulepack","role":"Rulepack, sentences, evidence spans, verdicts, claim table and signed report (no model; CPU)","name":"decosa-api green module (decosa_api/verticals/green) on the promo pre-check engine, with the grounding module (decosa_api/verticals/grounding)","hf_repo":null,"license":"AGPL-3.0-or-later","params":null,"quant":null,"vram_gb":0,"memory_gb_estimate":null,"engine":"Python 3.12; rule sentence splitter, BM25 over evidence spans for files over 24,000 characters, word-list floors for generic, neutrality and well-known legal-requirement terms, deterministic verdict rules","receipt_coverage":"partial","in_hosted_demo":null,"tiers":["standard"],"alternative_to":null},{"id":"model","role":"Claim typing, grounding judge, evidence reader and rewrite","name":"Qwen3.8-27B (NVFP4)","hf_repo":"nvidia/Qwen3.8-27B-NVFP4","license":"Apache-2.0","params":"27.8B","quant":"NVFP4 (MLP NVFP4, GDN/attention FP8) + FP8 KV cache; MTP head, 3 draft tokens","vram_gb":20,"memory_gb_estimate":null,"engine":"vLLM 0.29.0, temperature 0, thinking off, prefix caching","receipt_coverage":"strong","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"vision","role":"Pack artwork and label reader (alternate)","name":"Qwen3.8-27B vision input","hf_repo":"nvidia/Qwen3.8-27B-NVFP4","license":"Apache-2.0","params":"27.8B","quant":"NVFP4","vram_gb":20,"memory_gb_estimate":null,"engine":"vLLM with image input","receipt_coverage":"none","in_hosted_demo":false,"tiers":["alternates"],"alternative_to":null}],"tiers":[{"id":"standard","label":"Standard · one GPU for the model (hosted demo)","summary":"Qwen3.8-27B types each sentence, judges support against the evidence and reads the evidence file, each in its own receipted call; the rulepack decides the verdict. This is what the hosted API runs.","components":["rulepack","model"],"hardware":"1x RTX PRO 6000 96 GB (measured) or 1x RTX 5090 32 GB (estimate)","quality_evidence":[{"metric":"Held-out test2 (6 synthetic pieces, 44 sentences): verdicts right, first run / three reruns","value":"43/44 / 41/44 each","source":"docs/evals/green-claims-check.md (v2 and v2.2 result files), 25 Sep 2026"},{"metric":"Planted violations flagged, held out (test2 / v1 on test)","value":"19/19 (18/19 in reruns) / 30/30","source":"docs/evals/green-claims-check.md"},{"metric":"False alarms on clean claims and non-claims, held out (test2 / v1 on test)","value":"0/25 (1/25 in reruns) / 5/39","source":"docs/evals/green-claims-check.md"},{"metric":"Substantiated claims whose cited span holds the expected evidence (test2)","value":"16/16","source":"docs/evals/green-claims-check.md"},{"metric":"Per rule on test2 (2a, 4a, 4b, 4c, 10a, 6(2)(d)), first run","value":"precision and recall 1.00 each, on 3, 4, 2, 4, 3 and 2 planted claims; reruns: 10a recall 0.67, 2a precision 0.69","source":"docs/evals/green-claims-check.md"},{"metric":"Word list alone (no model), test2","value":"12/44 verdicts, 4/19 violations flagged","source":"docs/evals/green-claims-check/baseline-test2-eu.json"}],"latency_note":"measured: seconds per short piece through the shared gateway (longer under load); faster self-hosted on the direct route.","in_hosted_demo":true,"receipt_coverage":"strong","receipt_note":"Every model call is a separate gateway call with a gateway-signed receipt; the signed report lists them all.","hosting":null}],"alternates":[{"id":"vision","label":"Pack artwork and other languages","components":["vision"],"hardware":"1x RTX PRO 6000 96 GB (estimate)","use":"Read claims in pack artwork, badges and colours from images with the 27B's own vision input, and check copy in other EU languages. Not built.","status":"not built"}],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:<tag>","purpose":"GET /green/info, /green/samples; POST /green/check (SSE or JSON), /green/verify. Keeps no text."},{"name":"vLLM (model)","port":8114,"image":"vllm/vllm-openai@sha256:c2914767605584b6d8f45686b82de173ecc99e781897aa3d0a66dacd72c51ae1","purpose":"Qwen3.8-27B NVFP4 behind our gateway (hosted) or called directly (self-host)."}],"tools":[{"name":"Directive (EU) 2024/825 on EUR-Lex","url":"https://eur-lex.europa.eu/eli/dir/2024/825/oj/eng","license":"EU legal text (reuse allowed under the EUR-Lex notice)","purpose":"The verbatim texts of Annex I points 2a, 4a, 4b, 4c, 10a and Article 6(2)(d) in the EU rulepack; recitals 7 to 12 for the examples."},{"name":"CMA Green Claims Code","url":"https://www.gov.uk/government/publications/green-claims-code-making-environmental-claims/environmental-claims-on-goods-and-services","license":"Open Government Licence v3.0","purpose":"The principles and passages quoted in the UK rulepack."},{"name":"European Parliament Legislative Train: substantiating green claims","url":"https://www.europarl.europa.eu/legislative-train/spotlight-JD%2023-24/file-substantiating-green-claims","license":"European Parliament page (reuse with attribution)","purpose":"Status of the proposed Green Claims Directive (2023/0085(COD)): withdrawal announced 20 June 2025, last trilogue cancelled, listed as pending in the 2026 work programme. Not encoded."},{"name":"CMA press release: new consumer protection regime in force (7 Apr 2025)","url":"https://www.gov.uk/government/news/cma-to-boost-consumer-and-business-confidence-as-new-consumer-protection-regime-comes-into-force","license":"Open Government Licence v3.0","purpose":"The DMCC Act 2024 direct enforcement regime and fines of up to 10% of global turnover."},{"name":"scripts/green_eval.py and docs/evals/green-claims-check.md","url":null,"license":"Apache-2.0","purpose":"18 synthetic pieces for fictional brands (dev, test, and a second held-out split), the scoring, a word-list baseline and every result file."},{"name":"POST /green/verify","url":null,"license":"Apache-2.0","purpose":"Checks a report's signature against this server's key and, if you send them, the hashes of the copy, the evidence, the Markdown report and the CSV table. The console also checks the signature in your browser with WebCrypto."}],"hardware":[{"tier":"1x RTX PRO 6000 Blackwell 96 GB","fits":true,"notes":"Measured on our server: the hosted demo, the eval and the self-host check ran on this card, shared with other services."},{"tier":"1x RTX 5090 32 GB","fits":true,"notes":"Estimate: Qwen3.8-27B NVFP4 needs about 20 GB of weights plus KV cache; not run for this tool."}],"latency":[{"lane":"one piece of 7-10 sentences, hosted gateway route","typical_ms":8600,"source":"measured on our server 2026-09-25: median of 7 runs of the three samples through POST /green/check (6-38 s; the slow runs were under shared load)"},{"lane":"one piece, self-host direct route","typical_ms":5500,"source":"measured on our server 2026-09-25: 4.5-6 s per sample in the fresh-clone self-host check"},{"lane":"model calls per piece","typical_ms":null,"source":"measured 2026-09-25: about 19 calls, 1.6k generated and 18k prompt tokens per piece (test2 eval)"}],"benchmark":null,"notes":["Held out: on 6 synthetic pieces (44 sentences) written after the prompts were frozen, the first run got 43 of 44 verdicts right, flagged 19 of 19 planted violations, raised no false alarms and quoted the right evidence for all 16 substantiated claims. Three reruns an hour later gave 41 of 44 each (the gateway is not fully deterministic): one 10a claim missed and one clean claim flagged.","The pieces are short, synthetic and written by the same agent that wrote the prompts; 2 to 4 planted violations per rule. Treat the numbers as a check that the rules work, not as accuracy on real copy.","Annex I 10a (a legal requirement sold as a feature) depends on the model knowing the law covers the whole product category. A word list covers CFCs, RoHS and phosphates in laundry and dishwasher detergents; other cases are up to the model and were missed in some runs.","'Substantiated' needs the grounding judge to say the evidence supports the claim and to cite the span. It is strict: a fair paraphrase is sometimes called partial, which turns a clean claim into 'needs substantiation'. That is the safe direction.","Suggested rewrites are drafted by the model. A draft that still uses a generic or neutrality term (it kept 'carbon neutral' in 2 to 3 of about 10 held-out drafts) is withheld and the report says to rewrite that claim by hand.","The signed report holds hashes, offsets, verdicts, rule ids and receipt ids; the CSV table and the Markdown report quote the copy and are returned to you, with their hashes in the signature."]},"buyer_facts":[{"label":"Data retention","value":"Nothing stored: copy and evidence live in memory for the request. The signed report holds hashes, offsets, verdicts, rule ids and receipt ids, never the copy."},{"label":"What leaves the box","value":"Hosted: every model call goes through our gateway to the GPU serving Qwen3.8-27B, and its receipt (hashes, token counts, no text) is kept by the gateway and this API. Self-hosted on the direct route: nothing leaves the box."},{"label":"Input formats","value":"Text only: copy up to 8,000 characters and 40 claim sentences; up to 10 evidence files (LCA, certificate, offset contract, plan, policy, other) and 200,000 characters. Extract PDF text yourself. Evidence is optional, but without it nothing can be substantiated."},{"label":"What it will not say","value":"Never 'compliant'. A clean result reads 'nothing flagged (not a compliance sign-off)'. UK mode never says 'banned', because the CMA code is guidance."},{"label":"Typical run","value":"The Fernhollow sample: a few dozen model calls and about a cent at the gateway list price; the eval average per piece is lower. Each run shows its own measured cost."}],"hosted_now":{"needs":["qwen3.8-27b"],"off":[],"live_by_default":true,"live_status":"https://api.decosa.ai/status"},"data_handling":{"page":"/data#green-claims-check","self_host":{"level":"confidential","leaves":"nothing","summary":"Runs on your machine; nothing is sent to Decosa or a third party by default."},"hosted":{"level":"operator-processed","demo_only":false,"summary":"TLS to Decosa's server, then decrypted and processed by Decosa's API server, with the open models run by NEAR AI through OpenRouter, with Reka AI as the only fallback under Decosa's account.","gpus":"operator-contracted","third_parties":[],"retention":"Nothing stored: copy and evidence live in memory for the request. The signed report holds hashes, offsets, verdicts, rule ids and receipt ids, never the copy.","used_for_training":false,"encrypted_while_processed":false},"sealed_tier":{"applies":false,"note":"The sealed tier (raw chat only, never use-case pipelines) is paused at launch (/docs/sealed-tier)."},"external_calls":[]},"console":{"href":"/tools/finance/green-claims-check","input":"green","lanes":[{"id":"claims","title":"Claims","kind":"list"},{"id":"table","title":"Claim table","kind":"json"},{"id":"report","title":"Signed report","kind":"json"}],"samples":[{"n":1,"id":"fernhollow-planted","title":"Fernhollow planted","deep_link":"/tools/finance/green-claims-check?sample=1&autorun=0"},{"n":2,"id":"quillbrook-compliant","title":"Quillbrook compliant","deep_link":"/tools/finance/green-claims-check?sample=2&autorun=0"},{"n":3,"id":"northwick-uk","title":"Northwick uk","deep_link":"/tools/finance/green-claims-check?sample=3&autorun=0"}],"deep_link_params":{"sample":"1-based index into samples, or a sample id","autorun":"1 = start the run once the sample is loaded; 0 (default) = only preselect","reduce-motion":"1 = turn off animations"}},"api":{"base":"https://api.decosa.ai","contract":"/api/contract.json","contract_markdown":"/api/contract.md","reference":"/docs/api","keys":"/account/keys"},"prompts":{"hosted":"/prompts/green-claims-check-hosted.md","selfhost":"/prompts/green-claims-check-selfhost.md","assemble":"/prompts/green-claims-check-assemble.md","mac":"/prompts/green-claims-check-mac.md"},"rehearsal":{"bundle":"/samples/green-claims-check.zip","bundle_url":"https://decosa.ai/samples/green-claims-check.zip","folder":"/samples/green-claims-check/","expected":"/samples/green-claims-check/expected.json","files":["/samples/green-claims-check/expected.json","/samples/green-claims-check/inputs/copy.txt","/samples/green-claims-check/inputs/evidence.json"],"bytes":3060,"checks":["at least three claims are banned","the offset-based climate-neutral claim is banned under Annex I point 4c","the generic 'eco-friendly' claim is banned","a claim the evidence backs is substantiated with a quoted evidence span","the delivery line is not treated as an environmental claim","the signed report verifies","the report matches the copy","the report matches its CSV claim table","a report with its status changed to clear no longer verifies","every model call has a signed receipt"],"licence":"Synthetic: the brand Fernhollow, its suppliers and every document in the evidence file are fictional, written for Decosa. Part of decosa-api, which will be released under AGPL-3.0-or-later; until then the source is on request.","about":"Product-page copy for a fictional laundry liquid with planted EU greenwashing violations (a generic eco claim, offset-based climate neutrality, an own-brand seal, a net-zero target with no plan) and an evidence file. At least three claims must come back banned, the offset claim under EU Annex I point 4c, a backed claim must be substantiated with a quoted evidence span, and the signed report must verify and catch a changed status.","run":{"containers":"docker compose exec api python scripts/rehearse.py green-claims-check","checkout":"python scripts/rehearse.py green-claims-check --bundle green-claims-check.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py green-claims-check"},"guidance":"Set up with a coding agent (we recommend Claude Code with Claude Opus 5.5; any capable coding agent works) on mock data only, run the rehearsal until every check passes, then run your own data locally yourself. Never give the agent real data during setup."},"hardware_fit":{"check":"/self-host/hardware?use=green-claims-check","data":"/api/hardware.json","tiers":[{"id":"standard","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"alternate-vision","gpu_gb":57.6,"basis":"stack","unknown":[]}],"mac":{"fit":"full","memory_gb":32}},"links":{"page":"/tools/finance/green-claims-check","json":"/use-cases/green-claims-check.json","metrics":"/metrics/green-claims-check","console":"/tools/finance/green-claims-check","console_sample":"/tools/finance/green-claims-check?sample=1&autorun=0","stack":"/tools/finance/green-claims-check#stack","try_live":"/tools/finance/green-claims-check","watch":"/tools/finance/green-claims-check","build":"/tools/finance/green-claims-check#build","self_host":"/tools/finance/green-claims-check#self-host","prompts":{"hosted":"/prompts/green-claims-check-hosted.md","selfhost":"/prompts/green-claims-check-selfhost.md","assemble":"/prompts/green-claims-check-assemble.md","mac":"/prompts/green-claims-check-mac.md"}}}