A data explainer · 3 minutes
18.5% – 24.1%
counted as diverted — a range, not a number
Los Angeles collects these tonnage reports every month, and state law assumes you can measure recycling and composting performance from them. You can’t — for two reasons. The records are needlessly hard to analyze, and the measurements that matter were never collected. This piece covers both, and the reporting standard that would fix it.
or just scroll
The point
Count everything that isn’t sent to a landfill as diverted, and the reports yield 41.665%. Count only what the records can actually stand behind, and the rate falls to 18.476% – 24.054%.
The City’s own definition of diversion — “the percentage of generated waste that is not disposed in a landfill” (Zero Waste Progress Report, 2013) — uses that same generous logic, and it underlies the City’s last published citywide rate: 76.4% in 2011. No citywide rate has been published since; in 2007 the state dropped diversion-rate accounting for pounds-per-person. (That 2011 figure covers all waste citywide on an estimated base — a different scope from the commercial reports here, and we can’t show the City used the identical formula.)
The gap is built into the reporting system: it documents where waste is disposed far better than where it’s recovered. The closer a claim gets to “it was recycled” or “it was composted,” the less the records can back it up. The rest of this piece shows exactly where the records stop, and the standard that would fix it.
The low range isn’t pessimism. Re-type every contested facility the most diversion-friendly way possible — a facility-by-facility review found no evidence for it — and the rate still reaches only 32.061%, +13.6 points above the conservative figure. No reading of the records recovers the generous 41.665%.
What the records can see
Of 4,828,942 tons over three years, 58.34% (2,816,965 t) is reported going to a landfill. Landfills report what they bury to the state, so this is the one number with an outside check — it moves by well under a point no matter which judgment call you make.
Where two independent systems can check each other, they agree: LA County’s ledger and the state’s disposal database match disposal at Puente Hills to within 15.4 t (0.002%). The records also show every load’s first stop, and sometimes a second.
California’s records see disposal clearly and diversion poorly. The rest of this piece is about the half it can’t see.
What the records can’t see · recycling
The records show each load’s first stop, and only sometimes its last: 1,114,692 tons (23.08%) stop at a transfer station or processing facility with no record of where they went next.
And the blind spot is growing. This no-record share was 22.2% of the stream in 2022, 22.8% in 2023, 24.3% in 2024 — and it’s concentrated in one hauler, whose share jumped from 5.6% to 78.6% over the same three years. Its loads now stop at transfer stations where in 2022 they ran through to a named landfill. Nothing says the material’s fate changed — only that the reports stopped showing it.
The state’s disposal database (RDRS) records what gets buried. It does not record recycling or composting — in CalRecycle’s own words:
“…recycling and composting inflows are never reported, so RDRS does not contain any such information”— CalRecycle’s ReadMe accompanying its PRA response; recycling outflows withheld for confidentiality
So recycling can’t be measured from the public records at all. Every recycling number anyone computes is a ceiling read off disposal records — and for 275,371 tons of blue- and green-bin material, the records don’t settle which reading is right.
The disposal database could check 941,811 t (84.49%) of that no-record share, and it confirms the black-bin story almost perfectly: 666,440.50 t at an estimated 98.88% → landfill.
Stated as ceilings: matched transfer tonnage runs an estimated 98.68% → landfill (≈929,386 t); the sorting-facility figure from the companion piece, 489,226 t → an estimated 458,018 t (93.62%) — also a ceiling read off disposal. Two readings of the blue/green share are possible, and nothing in the records settles it.
What the records can’t see · composting
The records can show that organics reached a compost facility. They can’t show how much became compost, how much became residual, or how much was landfilled anyway. LA’s commercial organics stream is 227,976 tons. The 77,156.98 tons that reach a compost facility (1.60% of everything) then drop off every ledger — no residual reporting, no outbound check, nothing.
SB 1383’s public metric (Report 9) measures where trucks went within ten days — not what was composted: WM Sun Valley reports routing 90.06%, Athens Sun Valley 69.13%, Crown 64.78%. By Report 9’s own caveat, that’s where trucks went, not how a facility performed — and it never even collects how much a facility received, only a Yes/No flag.
One 2024 example shows the blindness end to end. That January, verified compost arrivals nearly stopped: green-bin chains that used to end at a compost facility began ending at one sorting facility, Crown Recycling. Three official systems size Crown’s 2024 organics three different ways — the hauler reports show 52,180 t bound there, its SB 1383 filing reports 28,565 t routed within ten days, and the state’s disposal database records 14,217 t received — and none of the three says where the material actually went.
And two public datasets disagree about one facility’s organics by roughly 2×: LA County shows 53,735.3 t outbound food waste at Puente Hills; Report 9 shows 25,538.8 t of source-separated organics. Different measures, never reconciled.
What the records can’t see · definitions
Whether a facility counts as diversion is a judgment worth +5.29 to +6.18 points of the headline rate — and no public rule makes it. Nothing in the records labels a facility’s flow as diversion or disposal. A site that is both a transfer station and a sorting facility can be counted either way: WM Sun Valley Recycling Park is counted as transfer (not diverted), while a comparable Athens facility is counted as recovery (diverted). The call lives in a spreadsheet, not a regulation.
The judgment is concentrated in a few hands: five facilities hold 1,030,951.89 t — 96.1% of all transfer-typed tonnage — and re-counting any one of them moves the headline by more than a point. One call is already generous: burning waste for energy (133,524.53 t, 2.77% of everything) counts as diverted under every definition on this page, because the franchise itself counts “engineered fuels” toward its diversion goal (Appendix A).
wm sun valley recycling park (298,476.79 t, typed transfer) vs the comparable Athens MRF/TS (typed mrf). Five facilities hold 96.1% of the transfer wedge (1,030,951.89 t); waste-to-energy (133,524.53 t, 2.77%) counts as diverted throughout.Harder than it needed to be · the file
Everything above had to be dug out of a formatted document, not a database. Three years of reports arrive as one spreadsheet where 25,486 lines of text are only 20,518 rows — fields contain line breaks, so records wrap across lines — and half the rows aren’t loads at all, but an unlabeled summary table tacked on below. It reconciles to the cent; every count on this page still had to be rebuilt before anything could be measured.
docs/methodology.md §2 · docs/audit/row_reconciliation.md · docs/audit/duplicate_adjudication.md · csv_outputs/row_ledger.csv (SHA-256-pinned raw file)Harder than it needed to be · integrity
The gaps above are all absences — a field that was never required, an outcome no one reports. The 2024–2025 records added a different problem: filings that contain errors and are published anyway.
Three kinds, in one release. A month filed twice: August 2025 is a row-for-row copy of July at three facility–stream pairs, 146,714.68 t — same values, same blanks, same zeros, only the row order differs. Dates that cannot exist: twelve rows stamped with the year 0205, one with 2026-07, in a file requested for 2024–2025. Columns shifted one place: four rows carrying a facility’s name where its destination type belongs, and its street address where the name belongs.
None of these is hard to catch. Each is a check a validator runs in milliseconds — does this month repeat the last one, is this date inside the filing period, is this value in the list. The reason they reach publication is that nothing between the operator’s spreadsheet and the public record runs any check at all.
What makes this class worth separating: an absence is honest about itself. A duplicated month is not. It reports a plausible number for a month that may have no reporting behind it, and only a row-by-row comparison of two months tells you which. Errors that read as data are worse than data that is missing — and the record has no way to flag them, because nothing checked.
docs/audit/2025_tranche.md §5 · csv_outputs/certified_defects.csv (every repair and exclusion logged) · rows I1–I3 in the table belowThe fix
Every gap in this audit points to the same fix: the records need to be filed as data, with enough information to follow material past the first stop. Not a transparency pledge. Not a PDF. A reporting standard a validator can check.
Today even checking takes a records request: the facility-level tonnage we used to cross-check this data isn’t published anywhere public — it only exists behind a Public Records Act request.
And the stakes aren’t hypothetical — the city’s own penalties run on these records. The $12.2M in disposal-target damages was calculated from hauler-reported disposal, against targets in an unpublished contract appendix and a baseline from 2017–18 collections that appear in no released dataset. No one outside LASAN can recompute it — and a load that stops at a transfer station simply reports less “disposal,” which lowers the penalty.
An answerable record does four things: identify the facility, classify the flow, follow the material, and balance the facility.
Who can require what differs, and it matters. LA can require the file format, facility IDs, and the hauler’s end-fate reporting through its own franchise contract. Facility-level recycling, composting, and residual reporting takes the state — a CalRecycle rule or new legislation.
where a requirement partially exists already — the SWIS registry, SB 1383 reporting — the closing table says so and names the gap · damages mechanics: franchise agreement §5.10 + LASAN mid-term report (CF 23-1032); see docs/audit/exploratory_findings_phase2_2026-07-08.md X7The standard
Each requirement closes the gaps it names — together they cover all six.
1 · Identify the facility (⌗✎) — every line machine-readable, one facility per row, carrying the destination’s state SWIS ID. Names stay as display text; the ID is the record. Mis-filed tonnage and one-cell-two-landfills become impossible to write.
2 · Classify the flow (◐) — diversion treatment follows a public rule, not a spreadsheet. Where a site both transfers and recovers, the reported flow decides, not the name. The test: recompute the City’s rate from the public classifications and get the published rate back.
3 · Follow the material (⊣) — franchise tonnage reports first stop and final disposition; transfer stations and processors report where what they received went next. The 23.08% that now stops with no record — the biggest reason the generous number collapses — drops to about 0%.
4 · Balance the facility (◪▢) — recycling and organics facilities report inflows and outflows the way disposal already is: material in, product out, residual to landfill, with confidentiality handled by aggregation, not omission. The 275,371 unresolved tons finally get an answer.
closes C1–C2, V1–V4 · venue: City (contract / LASAN spec) for format, IDs, and the hauler leg; State (CalRecycle / SB 1383) for facility recycling, composting, and residual reportingThe finale
Those four requirements — identify the facility, classify the flow, follow the material, balance the facility — close the six gaps this audit found: format, identity, classification, recycling, end fate, and organics.
With them, the diversion rate wouldn’t have to be rebuilt from partial records and judgment calls. Los Angeles could just calculate it.
A diversion rate should not require a records request, a facility-name reconstruction, and a forensic audit. It should be calculable from the records the system already requires.
For staff and reviewers
Each gap, what it does to measurement, the requirement that closes it (C-rows fix the file’s format; V-rows fix what gets measured; I-rows fix what the filing gets wrong), who can enact it, and how you would verify compliance.
The proposed requirement language, in brief — each rolls up into the four-part standard (identify · classify · follow · balance):
| # | Defect (observed, cited) | What it does to measurement | Recommendation (auditable requirement) | Venue | Compliance test |
|---|---|---|---|---|---|
| C1 | The record is a formatted document, not a dataset: embedded newlines, a 10,259-row unlabeled summary-pivot panel, 44/45 duplicate groups present in the export as received, and cells naming two facilities at once (row_reconciliation.md, duplicate_adjudication.md) | Every analysis starts with forensic reconstruction: a "how many rows is this file" question with four defensible answers, and a 42,164.57 t cell only a documented split policy could resolve | Row-level, machine-readable tonnage reporting (defined schema, one load-aggregate per row, one facility per row, no summary rows, unique row IDs) filed to LASAN; the human-readable report becomes a rendering, not the record | City (franchise contract / LASAN reporting spec) | A validator script accepts or rejects each monthly filing; rejected filings are re-filed; no row's facility field parses to more than one facility |
| C2 | Destination facilities are free text: 197 raw spellings for 56 real facilities; 46,862 t resolves to no permitted facility; free-text matching mis-filed 319,202.70 t under the wrong facility until a state-registry cross-check caught it (§5 names funnel, contradicted_merges_impact.md) | Which facility received the material — the first fact any evaluation needs — is a reconstruction, not a lookup, and the error class is invisible until something contradicts it | SWIS ID required on every report line naming a destination facility; free-text names allowed only as a display field | City (contract) + State (CalRecycle publishes the authoritative SWIS lookup; already exists) | Filing validator rejects rows with no valid SWIS ID; zero tonnage attributable to a name that contradicts the row's SWIS ID |
| V1 | No binding public rule classifies a facility flow as diversion or disposal: two "MRF and TS" facilities typed oppositely, a +5.3–7.0 pp headline swing living in an analyst's config file (methodology.md §5.2) | The single largest open lever on the headline rate; unresolvable from the data alone | Facility type / diversion treatment derives from the state registry's activity classification, not the reporter's or analyst's judgment; where a facility is dual-activity, the flow, not the facility, carries the treatment (see V3) | State (CalRecycle classification) + City (adopt it in rate computation) | Recomputing the City's rate from registry types alone reproduces the published rate |
| V2 | Recycling is structurally invisible in the public record: "recycling and composting inflows are never reported" to RDRS; recycling outflows withheld for confidentiality (CalRecycle PRA ReadMe) | Every recycling figure is a ceiling read off disposal records — 275,370.74 t of blue/green material is structurally indeterminate, and no recycling estimate can become a measurement under current law | Require recycling- and composting-stream reporting to RDRS (inflows and outflows), with confidentiality handled by aggregation rather than omission | State (Legislature / CalRecycle regulation) | For matched facilities, inflow = Σ outflows across all streams; the residual-with-two-readings class disappears |
| V3 | No end fate: the records show a first stop and sometimes an end; 1,072,909 t (22.2%) dead-ends at transfer stations with no onward record (transfer_fate_analysis.md §7.1) | The largest single reason the headline is a range instead of a number — the D1→D2 ~23-point collapse is mostly this wedge | End-fate reporting for franchise tonnage: each load-aggregate reports first destination and final disposition facility (both as SWIS IDs), with transfer/processing facilities obligated to report onward allocation of franchise tonnage | City (contract) for the hauler leg; State for the facility onward leg | The "transfer — endpoint unconfirmed" bucket computes to ~0% of tonnage |
| V4 | Organics outcomes are unmeasured: compost-typed tonnage (77,156.98 t) drops off every ledger; Report 9 measures 10-day routing with no inbound tonnage collected at all; two public datasets differ ~2× on one facility's organics (sb1383_recovery_rates.md, methodology.md §5.2) | "Reached a compost facility" is the strongest statement the records support — SB 1383's core outcome, tons actually composted, cannot be computed | Residual and outbound-product reporting for organics processors (tons in, product out, residual to disposal), published per facility; reconcile Report 9 and county ledgers under one definition | State (CalRecycle / SB 1383 reporting) | Per-facility organics mass balance closes within a stated tolerance |
| I1 | Filed months repeat verbatim: in the 2024–2025 tranche, 2025-08 is a row-for-row copy of 2025-07 at three facility/side pairs — 146,714.68 t, identical values, blanks and zeros, differing only in row order (2025_tranche.md §5) | A month of reporting is missing rather than doubled, and nothing in the filing says which — the copy is visible only by comparing every row of two months against each other | Filings declare their period and pass an automated duplicate check before acceptance; a month whose rows repeat a prior month is rejected, not published | City (LASAN reporting spec) | No two accepted periods for a facility share an identical row multiset, and every facility-month in the window is present exactly once |
| I2 | Period stamps reach publication unchecked: twelve rows dated to the year 0205 (60,348.27 t) and one to 2026-07, in a file requested for 2024–2025 (2025_tranche.md §5) | Tonnage lands outside the reporting window or in no window at all; recovering it takes an outside analyst reasoning from which month is missing | Reject filings containing dates outside the declared reporting period; the period is a stated field, not something inferred from cell contents | City (LASAN reporting spec) | Zero accepted rows carry a date outside the filing's declared period |
| I3 | Column shifts retype data silently: four outbound rows carry the facility name in the destination-type column and its address in the name column, leaving the type unrecorded for 54,791.93 t (2025_tranche.md §5) | A shifted row still parses. Three landfills and a compost site were recoverable only from the address that shifted with them; the same shift in a field with no corroborating neighbour is unrecoverable | Controlled vocabularies for typed fields such as destination type, validated at filing; a value outside the vocabulary is rejected rather than stored | City (LASAN reporting spec) + State (for facility-filed reports) | Every destination-type value in an accepted filing is drawn from the published vocabulary |
The full audited record — every hauler, facility, and month, every cross-check shown — lives in the dashboard.
The repository’s docs/methodology.md states every decision made here.