Three concrete outfall openings discharging into the receiving water

Prove every number you file.

We rebuild every number on your DMR from your own records, and block the ones we cannot prove.

Filed cells agreed, real permits
1,186
Calculation rules
16 declared
Turbulent water held and channelled by a row of concrete piers
Evidence

Most violations are paperwork mistakes, not pollution.

Every month, factories report how dirty their water was. The numbers come from four separate places: a permit PDF, a lab file, a flow meter, and email. No system holds all four, so the report is assembled by hand.

  1. 46,000

    industrial sites hold a federal water permit. Every month they grade their own water on a form an officer signs under penalty of law.

    EPA national compliance initiative
  2. 9.3%

    of them were in serious violation in 2023.

    EPA national compliance initiative
  3. Over half

    of those got there by filling the form in wrong. EPA says that is the single biggest cause.

    EPA DMR compliance advisory
Report too high
You report going over a limit you did not go over. The record is public and permanent.
Report too low
That is falsification, and an officer's name is on it.

How we prove a single number.

Pick a on the left. The right shows every step to that number, and where it stopped. This data is made up.

Choose a reported parameter

Not ready to file Two are blocked. One needs a sign-off. All four have a permit rule and a source behind them.

  1. Permit limitRev3 · page 18 · row BOD5-AVGMonthly average at or below 30 mg/L
  2. Lab resultsOstrander Analytical R2 · rows 4, 9, 14, 1921.8 · 23.1 · 22.6 · 22.1 mg/L
  3. UnitsUnit identity v1mg/L to mg/L, no conversion
  4. The sumArithmetic mean v1(21.8 + 23.1 + 22.6 + 22.1) ÷ 4 = 22.4
  5. Our numberOutfall 001 · BOD5 · average22.4 mg/L
  6. ResultVerified. No reviewer action required.
  1. Permit limitRev3 · page 18 · row TSS-AVGMonthly average at or below 30 mg/L
  2. Lab results
    Ostrander R1 · row 17 · held41.0 mg/L
    Ostrander R2 · row 17 · verified14.0 mg/L
  3. UnitsRevision policy v5Newest verified revision replaces the held result
  4. The sumBlocked. Resolve the source revision before calculating.
  5. Our numberNo proposed value
  6. ResultException EX-102. A reviewer picks the revision. Filing 41.0 would report a violation that never happened.
  1. Permit limitRev3 · page 20 · row NH3-WMAXWeekly maximum at or below 4.0 mg/L
  2. Lab resultsOstrander R2 · sample S-06212.1 mg/L · point CF-EFF
  3. UnitsAlias table v3CF-EFF has no verified outfall mapping
  4. The sumBlocked. Map the sample point before calculating.
  5. Our numberNo proposed value
  6. ResultException EX-108. The value is probably fine, but it belongs to no cell, so it is not reported.
  1. Permit limitRev3 · page 22 · row CU-MAXDaily maximum at or below 0.03 mg/L, qualifier preserved
  2. Lab resultsOstrander R2 · row 22<0.005 mg/L · reporting limit 0.005
  3. UnitsQualifier policy v2Preserve the less-than sign and the reporting limit
  4. The sumQualifier policy v2Single qualified result stays <0.005
  5. Our numberOutfall 002 · Copper · maximum<0.005 mg/L
  6. ResultException EX-111. M. Ashwell-Reyes signs off, so a spreadsheet cannot flatten it to zero.

BOD5 selected. Chain complete, six of six links.

The sixteen calculations we check.

These are the sums EPA expects a permit holder to get right. Each one is a rule here, and each rule catches a mistake that has been filed before.

Replayed

6 rules

Built, tested, and re-run against a whole real month. It came out with the number that was actually filed.

Replayed. 6 rules, the filed error each one catches, and its form.
RuleWhat it catchesForm
Arithmetic meanWrong sample set, wrong divisor.(Σx) ÷ n
Daily minimumpH floors read as averages.min(x)
Unit identitySilent mismatch between lab and permit units.assert no conversion
Revision policyEX-102. Lab R1 said 41.0 against a 30 mg/L limit; R2 said 14.0.newest verified supersedes held
Qualifier policyA non-detect flattened to a number, or to zero.preserve < and the reporting limit
Sample aliasEX-108. A real value that belongs to no reported cell.point → permitted outfall

Built

10 rules

Built and tested. Not yet re-run against a month a regulator has already accepted.

Built. 10 rules, the filed error each one catches, and its form.
RuleWhat it catchesForm
Daily maximumA single excursion masked by an average.max(x)
Mass loadingConcentration compliant, load in violation. Two limits, one sample.lb/day = mg/L × MGD × 8.34
Geometric meanColiform and E. coli. An arithmetic mean is always wrong here.exp( (Σ ln x) ÷ n )
Rolling windowA window straddling the month end. Which period owns the sample.max over all 7 or 30 day windows
Percent removalUnpaired influent and effluent sampling.(Cin − Cout) ÷ Cin × 100
Net versus grossIntake credit claimed without permit authority, or not claimed when allowed.Ceff − Cintake
Unit conversionThousand-fold errors. The most common catastrophic class.µg/L ↔ mg/L · GPD ↔ MGD
Rounding29.95 becomes 30.0 and crosses a 30 mg/L limit.permit decimal places
NODI selectionThe wrong code is itself a reporting violation.no discharge · no sample · below detection
Frequency complianceToo few samples is a violation independent of every value.required samples vs actual

Form is the sum itself, written out. Each rule is a small program with a version number: same rows in, same answer out, every time.

What happens each month.

Setup happens once: AI reads your paperwork, a person checks it, and the result is locked. Every month after that is arithmetic on locked files, with no AI involved.

  1. AI reads

    AI runs at setup, never when a number is worked out.

    Your permit PDF becomes a table. A lab file we have never seen becomes labelled columns, matched to the right .

    Nothing is used until a person says yes. Then it is locked.

  2. Rules do the maths

    Nothing on this path is AI.

    The sixteen rules above, run on the locked files. Same files, same numbers, every time.

    That is why we can re-run your old months and check every one.

  3. A person decides

    You keep the pen. We never sign anything.

    When we cannot prove a number, we stop and say so. Someone on your team decides, and we record who chose and why.

    Your signatory files it, the same way they do now.

What a 30 day pilot involves.

You keep filing the way you do now. We rebuild the same numbers alongside you, and each step has a written pass mark you can hold us to.

  1. Days 0 to 5

    Intake

    Send one permit, a year of lab results, your flow records, and two accepted . Just files. We plug into nothing.

    Pass mark Your signatory agrees the permit table is right

  2. Days 6 to 20

    Replay

    We rebuild twelve months you already filed and compare every to what you sent.

    Pass mark Every number matches on all twelve months

  3. Days 21 to 27

    Shadow

    We run this month's numbers next to yours. Nothing we make goes near a regulator.

    Pass mark Done inside 40 hours of your team's time

  4. Days 28 to 30

    Verdict

    You decide whether it saved time, and whether you could explain every number to an inspector a year later.

    Pass mark You sign for a year, or we stop

What we do not do.

These limits are why starting is a file drop and not a year-long IT project.

  • Sign or certify a report. Your signatory keeps that job.
  • File anything to a regulator, or hold your portal login.
  • Replace your lab or your existing software. We only read the files.
  • Guess at a number. If we cannot prove it, we block it.
  • Let AI decide a number you report.
  • Tell you that you are compliant. We only promise you can explain every number.