Sustainability · claim to events

A declaration is not a document. It is a set of events it should have triggered.

Most sustainability tooling stores answers. The useful question is different: when this claim arrived, what did the system actually do about it? Below is that mapping, live. Tick the five parts of a claim on and off and watch which verification events fire, which stop firing, and where greenwashing becomes visible as a missing event rather than a suspicion.

1 · the claim under test

Five parts. Untick one and watch the consequences.

✓ event fires · not triggered ⚑ fires because something is wrong
Events fired
-
Raised as defects
-
Never reached
-
Verdict
-
2 · why a matrix and not a score

A score hides which check never ran

1

Scores are unfalsifiable

"68 out of 100" cannot be argued with, reproduced, or appealed. Nobody can say which of the hundred points was the wrong one.

2

Events are addressable

register.opened = false names a specific thing that did not happen, to a specific claim, on a specific date. A supplier can fix it.

3

Absence becomes evidence

Greenwashing rarely looks like a false statement. It looks like a claim that never caused anything to be checked - and a matrix makes that emptiness visible.

4

The order is the argument

Completeness resolves before reconciliation, so an incomplete claim never opens the register. Cheap checks first is not an optimisation, it is the sequence itself.

The shape is borrowed from a place developers already trust it. A token scope grid does not tell you a token is "82% safe" - it shows exactly which capability is granted and which is not, and that is why nobody argues about it. A claim deserves the same treatment: not a rating, a grid of what it did and did not cause.
3 · where it runs

Front, back and the surface between them

F

Front

SurveyJS renders a schema. The five parts are isRequired in the schema itself, so the form cannot submit a claim the rule would reject.

B

Back

Spring or Django emits one schema per certification, conformity or ESG claim type, and owns the scoring so the client cannot argue with it.

API

The surface

GET /surveys/{id}/schema to render, POST /surveys/{id}/responses to submit. The response carries answers, verdict, missing[] and the events that fired.

DB

Storage

Answers as jsonb, verdict as a column, claim text as a pgvector embedding. GIN for the exact question, HNSW for the approximate one.

The verdict is computed at write time and never on read. A rule that changes must not silently re-judge history: what is recorded is what applied on the day it was submitted, and a rescore is a new row rather than an edit. Same reason a withholding rate resolves by effective date instead of being read live.
the closing test

Four lenses, and a control has to pass all of them

technical

Does it work with nothing to lean on?

A valid, sequential, journaled result with no external call - and a bound that says how long that may last.

legal

Is it inside the text, or beside it?

Anticipated by the scheme's own requirements, or improvised - and the difference stated rather than blurred.

sustainable

Does it survive a Saturday queue?

Can the least-resourced participant carry it indefinitely without it destroying the business it measures.

evidential

Does it leave a trace anyone can check?

Events that fired, named and dated, against a record kept for another reason entirely.

A design that passes one lens and fails the other three is not a control. It is a demo. That is the whole test, and it is why every page in this section carries its own refusals rather than its best case. Deterministic throughout: no model, no network, no random - the matrix above is arithmetic over the boxes you ticked.