Waste treatment routes and the elected default

Numbers checked against the live data on

DESNZ, EPA and ADEME publish the same waste material once per treatment route: landfill, incineration, recycling, composting. Those rows are alternatives, never parts, and most materials carry no row for "the route is unknown". Where the publisher prints no average, the data elects one of the routes to stand in for it, and route_default_rule records which rule elected it. The three rules do not mean the same thing, so the rule is as much of the answer as the row.

Why the rows fan out#

A waste factor prices what happens to the material, not the material itself. A kilogram of paper sent to landfill and the same kilogram recycled are different activities with different emissions, so the publisher gives each its own factor. The spread between them is not small: on DESNZ paper and board, landfill is 1.1645 kg CO2e per kg and recycling is 0.0047, 250 times less.

The order is not predictable from the route name either. Where the election has to pick the highest route of a stream, that route is landfill for 70 streams, but incineration for 20 and recycling for 18, with composting taking two and anaerobic digestion one. Which treatment emits most depends on the material, so you cannot reason from the name.

What counts as one stream#

A stream is one publisher's material at one unit and one region: DESNZ paper and board, per kilogram, GB. The grouping comes from the waste_stream scheme on activity_classification, where level 1 is the publisher's own material label and level 2 is the row's role in the stream, one of route, publisher_mix or excluded. The code lists describe the scheme.

Exactly one row of a stream carries is_route_default. Every other row is still served, unchanged: the election adds a column, it takes nothing away.

The three rules#

rule when it fires what the elected number is
publisher_mix The publisher prints its own average end-of-life row for the material The publisher's average. 27 of the 143 elections in the public libraries
highest_route No average was published and the stream holds more than one eligible route The route with the highest AR6 headline: a deliberate upper bound, not a mid estimate. 111 of the 143
sole_route Only one eligible row exists in the stream That row. 5 of the 143

Read route_default_rule together with the flag, always. It is NULL on every row that was not elected, so a query that takes the flag without the rule cannot tell a publisher's average from a stream maximum.

ADEME's residual household waste, per kilogram, France, is a publisher_mix stream. Six rows survive the default slice. Three are end-of-life: landfill at 0.4120 kg CO2e per kg, incineration at 0.3740, and ADEME's own mixed row at 0.3860, which names no route. The mixed row is elected, because the publisher has already answered the question. The other three rows are avoided_credit and negative, down to -0.2160: they are the credit side of the same treatments, and none of them is elected.

DESNZ prints no average for paper and board, so that stream is decided by highest_route: landfill wins at 1.1645, against 0.0090 for composting and 0.0047 for both recycling and incineration.

Watch out. A highest_route row is the maximum of its stream, chosen so that an unknown route is not understated. On DESNZ paper that is 250 times the lowest route in the same stream. Use it when you genuinely do not know the route, report it as an upper bound, and write the assumption into your inventory.

Rows that can never be elected#

Two kinds of row are counted as candidates and can still never win.

A row whose role is excluded answers a narrower question than "the route is unknown": preparing for re-use, or an end-of-life average the publisher has taken recycling out of. ADEME's clothing and household textiles stream holds one of the second kind, at 1.3820 kg CO2e per kg, above the publisher's mixed row at 0.5000 that is elected.

The exclusion is not what decided that stream, though. A stream that has a publisher's mix is settled on the mix, and the routes are never looked at. The rule only bites in a stream with no mix, where the highest eligible route wins and an excluded row would otherwise have been it. No stream in the public libraries is in that position today, so the rule changes no elected row in the current data. It is a guard, kept because a publisher can print an excluded scenario for a material it gives no average for.

A row with no AR6 headline cannot be compared with its siblings, so it is ineligible too. Both kinds still count in the stream's candidate tally, which is why a stream can hold several rows with only some of them in the running.

An avoided-credit row is not a third kind. The group key is the publisher, the stream, the unit and the region: system_boundary is not in it, and nothing in the election tests the sign, so a publisher's negative credit row is an ordinary candidate that carries a stream role like any other. Every elected row in the public libraries does carry system_boundary = 'end_of_life', because each stream that holds a credit row also holds the positive treatment row the credit belongs to, and that row outranks it. That is a fact about today's data, not a promise: read the boundary of the row the flag hands you rather than assuming it.

Which libraries have it#

library top-level waste factors in a stream elected
ademe 129 125 40
desnz 140 139 42
epa 183 183 61

EPA's 183 WARM rows sit in 61 streams, and each of those streams elects a row. Every one of the 183 is a route at level 2: EPA prints no average end-of-life row for a material and no excluded scenario, so no EPA stream can be settled by publisher_mix, and 59 of the 61 are decided by highest_route with the other 2 by sole_route. An elected EPA row is therefore a stream maximum or an only child, never a publisher's own average. Those nodes arrived with a re-ingest on 2026-09-22; before it the library carried no stream at all, and a query written against that release found nothing elected.

A projection, not a filter#

is_route_default reaches factors_flat through a join that filters nothing, so it is false, never NULL, on every factor that is not an elected waste row. AND is_route_default on a general query therefore does not mean "waste factors": it quietly reduces any result to the 143 elected rows and drops the rest of factor search. Pair it with the waste category or with the stream, or leave it out.

A stream whose rows are all ineligible has no elected row at all, so nothing in it carries the flag. No stream in the public libraries is in that state today, but that is a fact about the current data, not a promise of the model: join to the election with a LEFT JOIN and handle the empty case. Which waste row to use when the route is unknown has the queries.

Derived, never an identifier#

The election is recomputed wholesale from the current release's default rows every time the data is refreshed. It adds no factor and no value: the row it flags is one the publisher published, and you cite that row by its own slug. A later release can move the flag to a different row of the same stream without a single published value changing, so never record "the route default" as the thing you used, and never treat the flag as part of a factor's identity.

Neither column reaches the API, factor search or an export. They are columns on factors_flat, for SQL.