On this page
Characterisation factors
Kresoxim-methyl is a fungicide. Sprayed on agricultural soil, how much does it contribute to freshwater ecotoxicity? EF 3.1 answers that, and this list publishes three answers to it, because EF 3.1 is a method and a method has to be implemented against a flow list before it is a number you can use:
| Implementation | Says |
|---|---|
| EF 3.1 as the European Commission's JRC published it | 134.73 |
| EF 3.1 as the ecoinvent Centre implemented it | 53,540 |
| EF 3.1 as this list publishes it | 134.73, because a curator ruled |
397× apart, from one method. Neither team made an arithmetic mistake. EF's own files carry kresoxim-methyl twice in every context — the same name and the same CAS number, 143390-89-0, under two EC numbers — and the two rows carry different factors. This pipeline merged them into one flow and kept one number of the two; the ecoinvent Centre, reading the same two rows, kept the other.
So this is not two teams disagreeing about toxicology. It is one question about
EF's own duplication, answered twice, differently — and a curator answered it
here, in data/lcia-factor-rulings.json, with the reasoning written down. Until
they did, this list published nothing for it, which is the default: where two
implementations disagree and no ruling exists, the honest artifact is a question.
That is what this layer is for. It does not compute impacts, it does not average, and it does not pick a winner where two competent teams disagree without saying who picked and why. It puts every number on one flow list, says who said it, and makes the disagreements findable.
Three implementations, one method
implemented_by is the field the whole layer turns on. There is no correct
implementation of a method:
European Commission — JRC— 319,575 factors over 89,070 flows. EF 3.1 is the base list, so these arrive already on consensus flows: an identity join and nothing else. 52,088 of them are a stated zero, which is a claim (#329): "assessed, and zero" is not "never assessed".ecoinvent Centre— 26,479 factors over 7,709 flows, read from the workbookfetch-lcia ecoinvent-3.12downloads. These take two hops: the workbook names an ecoinvent flow, the merge says which consensus flow that became, and only then is there a factor about a flow of ours.consensus-flow-list— 319,467 factors, and every one of them is one of the other two's. 21,965 areagreed— both implementations stated the same number, so there is nothing to decide — 297,468 aresole, where only one of them spoke at all, and 34 areruled: a curator looked at a disagreement and said which number to publish. Where they disagree and nobody has ruled, this list publishes nothing and asks.
Each implementation has its own 25 impact categories, so there are 75 in the published set. All of them are long term: excluding a source list's long-term compartments is that list's convention, not this one's, and a list that published both a long and a short set would be publishing a choice it has no basis to make.
What makes two numbers comparable
Almost all of the work is here, and none of it is arithmetic.
The category. The JRC calls it Ecotoxicity, freshwater; ecoinvent calls it
ecotoxicity: freshwater. One category, two names, and nothing in either file
says so — data/lcia-impact-categories.json is the crosswalk that does, one row
per category with both publishers' words and ours. Comparing on either
publisher's own name compares nothing with nothing: every factor comes out
sole, no factor is ever agreed, and the counts look entirely plausible.
The flow. A factor is about a flow, so a factor can only be as good as the merge that placed it. 9,848 of ecoinvent 3.12's source flows reach a consensus flow, and of the 7,960 its workbook characterises exactly two do not — a question for the merge, not for this layer, and a finding rather than a silent loss.
The place. EF states a geography on 42,871 of its factors — 223 codes, mostly
ISO 3166-1 alpha-2 — and Land use gives one flow 213 of them, from -522.81 in
ES-CA to -227.0 in YE. Two places are two factors, which is why the
identity of a factor is the triple (impact category, flow, geography) and not
a pair. ecoinvent's workbook states no place at all, so on the raw count every
located EF factor looks "dropped" by its implementation; that is two file
formats, not a gap in anybody's science.
The unit. A factor stated per kilogram, on a flow published per megajoule, is not a number you can use. Those are converted by the flow's own property — a uranium factor of 560,000 per kg over 560,000 MJ/kg is 1.0 per MJ, which is the JRC's own number for the megajoule flow, so the conversion is checkable rather than asserted — and where no conversion exists the factor is not published and the crossing is a finding.
Where they disagree, nothing is published until somebody rules
Two implementations, one triple, two numbers. There is no faithful third number,
so this list publishes none and asks. That is the contested-factor queue: 36
questions over 142 factors, of which 30 are still open, each carrying what a
ruling needs — where each flow came from, what this pipeline did to it, and every
number anybody states about it, including the ones a merge already declined.
The mirror case is proposed-factor: 3,455 questions over 4,372 factors where
ecoinvent characterises a flow the JRC does not. Most are compartments EF's flow
list does not have — silvicultural soil, an unconfined aquifer, industrial soil —
so adopting the number means publishing a factor the method's own publisher never
stated for a place it cannot express. That is a decision, and it is asked rather
than taken.
None of the three queues blocks anything. A factor nobody has ruled on is simply not in the consensus implementation, and both publishers' numbers are published regardless.
Where the model underneath says something else
Biphenyl is two benzene rings joined together. It is used to make dyes and plastics, and as a fungicide on citrus fruit — an ordinary industrial chemical. EF 3.1 says that a kilogram of it emitted into city air causes 0.2 cases of disease, so a tonne causes two hundred. Ranked against every substance EF characterises for non-cancer human toxicity in that compartment — 3,380 of them — biphenyl comes third, above mercury and just below a rodenticide designed to be lethal in milligrams.
EF 3.1's three toxicity categories are USEtox 2.1. The JRC's own report says so and describes the adjustments made on top of it. USEtox 2.1 says that kilogram of biphenyl causes 0.00000014 cases.
| Emitted to | EF 3.1 | USEtox 2.1 | apart |
|---|---|---|---|
| urban air close to ground | 0.19957 | 0.00000014 | 1,400,000× |
| fresh water | 0.0044065 | 0.00000025 | 17,500× |
| non-agricultural soil | 0.0008987 | 0.0000000015 | 615,000× |
| agricultural soil | 0.00089871 | 0.0000000093 | 96,600× |
| sea water | 0.00015794 | 0.000000017 | 9,200× |
Both columns are in comparative toxic units for humans, which count disease cases per kilogram emitted.
Neither published implementation can see this. The JRC's says 0.19957 because EF
3.1 says 0.19957; the ecoinvent Centre's says the same, because it transcribed the
same file. Two copies of one file agreeing is not evidence about the file — and
agreed would call it agreement, which is the one case where comparing two
implementations gets the answer wrong.
So there is a third queue. contradicted-factor holds 76 questions over 988
factors, from the 38 substance-and-category pairs where USEtox 2.1 is more than
a hundredfold away in every compartment — the narrowest is aniline at 105× and
the widest is sodium chloroacetate at 10,861,793×. 34 of the 38 are freshwater
ecotoxicity and 4 are non-cancer human toxicity; 24 are too high, 13 too low and
one is both. What the queue asks is not which of two readings is right but
whether the method's number should be published at all, and until somebody
answers, the consensus implementation publishes nothing for that substance and
category — in every context, not only the six compared, because the number that is
out is the substance's. EF's factor for biphenyl in indoor air is 17.194 CTUh,
and withholding the six compared numbers while publishing that one would leave the
worst of them in the list.
Two things are deliberately not in it. The metals — all 27 disagree with USEtox completely, and by design: the JRC report says EF replaced USEtox's metal factors with ones derived from EU data sources and tabulates each change, copper falling by 100% and silver rising by 813%. And any substance that disagrees in one compartment and not another, which is the two models routing an emission differently rather than disagreeing about the substance.
The evidence is a file and the rule is code.
data/lcia-underlying-model-factors.json states what USEtox 2.1 gives, per
substance, category and compartment, converted from LC-Impact's damage unit into
EF's midpoint one by three constants that are measured rather than assumed — where
the two files agree the ratio between them is exactly 11.5, 2.7 and 0.0175906. It
states no verdict. Whether a row is a contradiction is decided on each run against
the numbers that build states, so a re-transcription that brings the two
together publishes the substance again with nobody editing the file.
And this changes nothing about what the JRC published. EF 3.1 states 0.19957, and this list goes on publishing 0.19957 under the JRC's name, in the same table and the same file as before. What changed is that this list no longer says it too.
A ruling is a file, and it carries its reasoning
data/lcia-factor-rulings.json answers a queue item by its own key — the queue,
the substance and the category, not a flow, so it survives a rebuild and goes on
answering when EF publishes the same substance in a fourteenth context.
Two verdicts, and neither names a source list. publish names the
implementation whose number this list takes; decline takes nobody's. A verdict
per implementation — jrc, ecoinvent — reads well with exactly two of them and
cannot express a third, and every source list that ships factors is one. A factor
published from a ruling carries derivation: ruled, distinguishable from
agreed, which is the pipeline finding nothing to decide.
Four things the mechanism refuses:
- A ruling with no comment. Every one is a statement about somebody else's published science, and one with no reasoning is unreviewable. The loader raises.
- A ruling that publishes an implementation the question is not about, and a
declinethat names one anyway. - A ruling with no
ruled_about. It records what every implementation stated when it was made, and one without it is a ruling the staleness check below could never fail — which is the same as not having the check. - A ruling written about numbers that have moved. A row stating something else asks again rather than being settled by a decision taken about something else. So does a row where an implementation has appeared or gone silent: a third implementation changes what "which of these is right" means.
Two substances are ruled today, and both are the same kind of finding rather
than a scientific disagreement. Kresoxim-methyl is EF's duplication above, 24
factors. Vanadium is a decimal point: exactly 10.0000× in all ten rows with the
mantissa preserved to five significant figures — 1.3384e-06 against
1.3384e-05 — which is what a unit slip looks like and not what a modelling
difference looks like. Both publish the JRC's number, and neither does so because
the JRC is the publisher: there is no such rule, and a draft of this design that
had one was rewritten to remove it.
An answered question stays on its page, as info rather than blocking, with
the verdict and the reasoning on it. The queue is a work list; a settled row is
the record.
The difference report is a deliverable
Not a backlog. lcia-differences.json is a published, citable artifact whose
audience is the two implementation teams and anybody comparing implementations,
and its headline is the agreement: over the full build of 2026-08-17 the two
agree exactly — same float, full precision — on 21,800 of the 22,107
triples they both state. 98.6%.
| triples | |
|---|---|
| identical | 21,800 |
| differ, within 2% | 165 |
| differ, 2%–2× | 36 |
| differ, 2×–10× | 34 |
| differ, 10×–100× | 52 |
| differ, over 100× | 20 |
| differ across zero or a sign | 0 |
That 98.6% is what makes the other 1.4% readable as signal rather than noise, and it is not a number anybody could quote before: until both implementations are on one flow list, the triples cannot be formed.
A band is not a verdict. 307 differences between two competent teams are mostly modelling choices. The 20 over 100× are worth a conversation, not a correction.
Where only one implementation speaks there is no comparison to record, so those are counted rather than listed — 297,468 of them, which is a fact about two differently sized flow lists rather than a difference between two readings.
A second report sits beside it: coverage across sibling contexts, per implementation rather than between them. Where does one of them characterise a substance in one context and skip the context beside it? It is a summary by compartment and by category and names no flow, deliberately: asked as a list it is 5,668 rows, and the largest populations are substances with no global-warming potential, where absence is the right answer and nobody should be asked to fill it in.
Where to find all of this
| Want | Look |
|---|---|
| One flow's factors, all three implementations | The flow's page in the review application, or lcia_characterization_factors |
| The categories, and how much each implementation fills | /factors in the review application |
| Where the implementations disagree | /factors/differences, or lcia-differences.json |
| Where two named implementations of one category disagree | /factors/category/<method>/<version>/<slug>/differences in the review application |
| Every number, as a file | lcia-factors.json.gz |
| Questions waiting on a curator, and the ones answered | /queue/contested-factor, /queue/proposed-factor and /queue/contradicted-factor |
| What the model a method is derived from states | data/lcia-underlying-model-factors.json, and the queue row itself |
Why a ruled factor is the number it is |
data/lcia-factor-rulings.json, and the queue row itself |
What characterise found and did not resolve |
/factors/findings/… |
Two things to know before querying:
elementary_flows.lcia_factor_countis the JRC's non-zero factors, and keeps that meaning now that there are three implementations, so a query written beforecharacteriseexisted still answers what it always answered. The per-implementation count islcia_flow_factor_counts, a view over the factors themselves so the two cannot drift apart.lcia_methodson the flow record is where the JRC's factors come from, not a place to read a factor. It is the raw ILCD entry, with no category record behind it — no unit, no area of protection, no statement of who implemented it. It stays because it is a published field with readers.
What this layer does not do
- Decide which published implementation is right. Not this list's question. The consensus implementation answers a different one: what should this list say?
- Aggregate factors into a score. This publishes factors. It does not do LCIA.
- Any method but EF 3.1. ecoinvent's workbook ships 45; the crosswalk covers one, in three implementations.
- Any short-timeframe set, ours or ecoinvent's.