The filing is rejected
A monthly state filing is a legal document built on volumes. A wrong disposition code or a missed stock change gets it rejected — and you resubmit, late.
haql-qc · Data quality
Totals hide contradictions. A production file can balance perfectly while four wells carry negative water volumes and a shut-in well quietly produces all month. haql-qc is the second pair of eyes that never gets tired — it reads every row, names every contradiction, and hands you a row number instead of a hunch.
Run it yourself: download the standalone binary from the downloads page — no Python needed, nothing leaves your machine. Deterministic: the same file in, the same findings out, every time.
Read the public guide: what it does, what it checks and what it does not do →
# get the binary — Windows .exe, macOS, or Linux (no Python) # haql-lab.github.io/downloads # audit a production export haql-qc -i production.csv \ --well-column WELL_BORE_CODE \ --date-column DATEPRD \ --declare-unit BORE_OIL_VOL=Sm3 \ --declare-unit BORE_GAS_VOL=Sm3 \ --declare-unit BORE_WAT_VOL=Sm3 \ -r audit.json # result rows=15634 wells=7 issues=80 critical=0 high=12 medium=34 info=34
Every run also records the SHA-256 of the exact input, so anyone can re-verify the audit against the same bytes later — and --attest --sign-key seed.key signs the report (Ed25519 over the file hash and a root over every finding) so the audit can be handed over provably unedited.
What it is
No database, no login, no pipeline to set up. A CSV in, an audit report out. The rules are permanent numbered IDs, so a finding you saw in March is the same rule with the same name in December.
Production CSV — daily or monthly period. Well and date columns identified. Units declared by you, never guessed from a column name.
JSON or JSONL audit report: findings by rule and severity, per-well medians used for materiality, and the run-level SHA-256 of the exact input so the run can be re-checked against the same bytes.
On regulators and filings. haql-qc does not generate regulator-specific forms, and it does not know any state's format. It checks the volumes those forms are built from — and it is jurisdiction-agnostic, whether your wells are in Texas, Alberta, or the North Sea.
Why you need it
Every one of these is a real failure mode. Each one has already cost someone a rejected filing, a partner dispute, or a late night re-keying numbers.
A monthly state filing is a legal document built on volumes. A wrong disposition code or a missed stock change gets it rejected — and you resubmit, late.
A joint-venture partner queries a volume. You pull the export. You cannot establish which figure was right on the day it was received, because the correction was made on a guess and the trail is gone.
Row thirteen thousand looks exactly like a correct row when you are scanning. It is a negative water volume, and the summary total still adds up — because a total does not care about signs.
Mismatches surface in the last two days. Someone is re-keying numbers at 9pm, and the person doing it is not the person who will defend the number in April.
A month closes. The export looks complete. Nothing in the summary flags a problem, because the summary is a total and the total still adds up.
Four wells carried negative water volumes. The largest was −457.84 Sm³.
Four rows are named — well, date, line number, observed value, unit. An engineer decides whether the sign convention or the meter failed.
Either way it never reaches a filing, and the report records the SHA-256 of the exact input audited.
What it actually catches
--attest --sign-key seed.key attaches an Ed25519 attestation over the report hash together with a root hash covering every finding, so a single edited finding breaks verification; --bundle out.zip packs report + attestation into a byte-reproducible zip for transmissionMateriality is measured against the well's own median. 0.003 Sm³ is nothing on a well producing 6,000 Sm³/d and an emergency on one producing 5.
QC010_NEGATIVE_RATE
negative volume in 'BORE_WAT_VOL'
| Well | NO 15/9-F-12 H |
|---|---|
| Date | 2008-04-23 |
| Source row | 1984 — open the CSV, go to that line |
| Observed | −14.19 Sm3 |
| Suggestion | confirm sign convention before flipping; negative production volume is not physically realisable |
Download sample audit.json — the JSON report shape, with every field a real run produces. Findings referenced above are the page's illustration; numbers in the downloaded file are from a small fixture run. Equinor's Volve field is public data; no Volve data is bundled with or downloaded by the tools.
Pricing
A reservoir engineer at $88–129/hr eyeballing exports for four hours a month is $350–520/month. haql-qc is under that — before it saves you the first rejected filing.
Salary.com US Reservoir Engineer III–V, July 2026; ERI Petroleum Engineer Canada, Sept 2026.
Free
One month of data, on the house. No key, no seat limit, no card. The point is for you to hit one finding you did not know about.
Send me your CSV$349/month
Annual commitment, up to 10 users, unlimited fields. Roughly one engineer-day of loaded cost — below the threshold where procurement needs a committee.
$1,750/month
Annual, per site, unlimited users on that site. On-premise is not a feature — under most operators' data-residency policy it is the premise.
Evaluation: 30 days, no license key needed.
Next
Or email a month of data — anonymised if you prefer — and get the full report at no cost. Same rules either way.
kunleaz100@gmail.com