haqlLabs

haql-emission · emissions MRV packager

A reported total is not a balance. haql-emission makes it one.

A GHG inventory (GHGRP Subpart W, EU ETS) stands or falls on a single identity: the reported CO2e equals what the activity, flare and vent rows actually add up to. haql-emission reconciles that identity to the tonne, quantifies flaring and venting, measures month and quarter coverage, and prices your EU ETS allowance position and penalty exposure — from four exports you already keep.

Run it yourself: download the standalone binary — a directory in, an emissions pack out. Fully offline, deterministic, same rules every run.

Read the public guide: what it does, what it checks and what it does not do →

one command, one reporting year
# generate a synthetic facility (12 months, planted gaps)
haql-emission demo

# reconcile the year and price the allowance position
haql-emission demo_emission --no-open -o emissions-pack

# result
rows=38 entities=3 issues=7
  critical=1 high=4 medium=1 low=1 info=0
  allowance position -171.9 t CO2e · penalty exposure €17,185
  fingerprint sha256=24271ad320cca904…
  emissions-pack.json   → emissions-pack/emissions-pack.json
  emissions-pack.html   → emissions-pack/emissions-pack.html
  allowance-position.csv → emissions-pack/allowance-position.csv

The reported inventory is generated from the activity rows themselves, so the mass balance stays quiet — the faults are the loud part, not a phantom gap.

What it is

Four exports and a config in. A reconciled inventory and allowance position out.

No EHS platform integration. No database. Just the records you already keep, checked against the physics of combustion and the arithmetic of the scheme.

Goes in

Activity, flare, vent and monitoring CSVs plus a facility config: reporting year, facility, GWP set (AR4 / AR5 / AR6), scheme, and allowances surrendered. A missing optional file is treated as a gap, not guessed around; a missing required column is an error, because nothing can be computed from it.

Comes out

An emissions pack (JSON + HTML) with the annual mass balance by species, flaring and venting quantification, month and quarter coverage, every finding traced to a row, and an EU ETS allowance position with penalty exposure — plus an allowance-position.csv you can audit.

Why you need it

The scheme is the easy part. Reconcile it and prove it is the hard part.

Multiplying a volume by an emission factor is arithmetic. What fails in review is the gap between the number you filed and the activity data that is supposed to support it — found by a reviewer in one line.

The unaccounted tonne

The reported CO2e drifts from the computed balance by more than the 5% tolerance. Either the inventory claims more than the activity supports, or the activity is incomplete — a reviewer will ask which (EM010).

The implausible flare

A combustion efficiency of 0.50 is not credible for a flare. It silently inflates the uncombusted methane slip, and the whole flare line restates (EM101).

The missing quarter

Three of four monitoring quarters present, or a month gone from the activity stream. The year's inventory is not wrong — it is incomplete, which is close enough to a rejection for most purposes (EM200, EM201).

The allowance you owe

Verified emissions exceed surrendered allowances. Every owed tonne carries the €100/t excess-emissions penalty on top of buying the missing allowances (EM300, EM302).

Without haql-emission

The year is summed in a spreadsheet. Reported = whatever the EHS export says. The reviewer asks which activity rows back it, and the answer is scattered across four exports and a folder of factors.

Every figure is a fresh reconciliation. Every reconciliation is a chance to be wrong.

With haql-emission

The balance reconciled to the tonne, flaring and venting priced by species, coverage named, and a single pack that answers the reviewer's questions before they are asked.

The inventory arrives looking like it was built to be audited.

What it actually catches

Eighteen ways an inventory is weaker than it looks.

The full check list
  • Unaccounted emissions — reported inventory against the computed balance, beyond the 5% tolerance (EM010)
  • Negative species totals — a computed CH4 or CO2 total below zero, which means the sign convention broke (EM011)
  • Implausible combustion efficiency — a flare efficiency outside the credible band, silently moving the methane slip (EM101)
  • Flare volume with no backup — a flare row with zero volume, or one carrying no heating value so no CO2 can be computed (EM102, EM100)
  • Impossible vent composition — CH4 + CO2 summing above 1.0, or a vent row with no composition at all (EM110, EM111)
  • Control efficiency out of range — an activity control efficiency outside [0, 1] (EM112)
  • Coverage gaps — a missing activity month (EM200) or monitoring quarter (EM201) that leaves the year incomplete
  • Unknown GWP set — a configured assessment report that is not recognised; the tool never silently substitutes one (EM230)
  • Reported vs verified mismatch — the two inventory figures disagree beyond 2% (EM240)
  • Allowance deficit and penalty — verified emissions over surrendered allowances, priced at the €100/t excess-emissions penalty (EM300, EM302); an ETS year with no recorded surrender (EM301)
  • The reporting clock — the annual report due date computed, so the deadline is in the output, not in someone's calendar (EM220)
  • Signed evidence trail — --attest --bundle inspection.zip signs the emissions pack (Ed25519 over the pack hash) and wraps pack + allowances + HTML into one byte-reproducible inspection bundle, so the "was this edited?" question dies before review

Same design stance as the rest of the suite: read-only, offline, deterministic, traceable to the row — and provably unedited.

Pricing

Priced against a restated inventory, not a seat count.

One corrected inventory, one amended filing, or one allowance deficit carries more cost in a single quarter than a year of a license. haql-emission is the cheap insurance.

Sample check

Free

One reporting year of records, on the house. No key, no seat limit, no card. You get the full balance, findings and allowance position back.

Send me the exports

Team

$349/month

Annual commitment, up to 10 users, unlimited facilities and fields. Academic research and evaluation use needs no key.

On-premise

$1,750/month

Annual, per site, unlimited users on that site. Under most data-residency policy this is the premise, not a feature.

Evaluation: 30 days, no license key needed.

Next

Run a year through it today.

Email the four exports — anonymised if you prefer — and get the full balance, findings and allowance position back at no cost.

kunleaz100@gmail.com