You saved the export at 2:14.
At 2:15 you know what is wrong with it.
In plain English
- What it does
- Watches the folder where your spreadsheets and exports already get saved. Every time a file changes it checks it and tells you what looks broken — a column that is the same value all the way down, a field that is empty on every row, a report that stopped changing weeks ago.
- Why it helps
- Every tool like this waits for you to bring it a file, which means you have to already suspect something is wrong. The people who most need the check are the ones who never think to run it. This one runs itself.
- What you need
- A folder where files land, and someone technical for about ten minutes to install it. It only reads — it changes nothing, and sends nothing anywhere.
- How long
- Minutes to set up, then never again. It runs on a schedule or watches continuously.
Nobody checks the export before it goes out, because checking it is a chore and it has been fine for a year. The one time it is not fine, it looks exactly the same.
- 2:14pm
- Your system writes
invoices-august.csvto the usual folder. - 2:15pm
- canary has already read it: the
statuscolumn is “OPEN” on all 412 rows, andpaid_dateis empty on every one. - 2:16pm
- You discover the billing sync stopped writing three weeks ago — instead of discovering it when a client asks why they were never invoiced.
What the report looks like
| invoices-august.csv | FINDINGS | status: CONSTANT — identical value ‘OPEN’ on all 412 rows paid_date: empty on every row |
| payroll-q3.csv | COULD NOT CHECK | file locked by another process — this is not a pass |
| crew-hours.csv | CLEAN | nothing to report |
An illustration of the real output format. The middle row is the entire point of the tool: a file it could not read is reported as a failure to read it, never quietly counted as fine.
Three decisions that decide whether you keep reading it
The setting you will want on day two
Some columns are constant on purpose
— a version number, a region code, a format tag. Nothing in your data can tell canary
which ones those are, so on a real folder they can account for most of every night’s
findings. List them once in a plain text file called canary-ignore.txt, one name
per line, and they move out of your way. They are still counted and named in the report rather
than deleted from it — a checker that quietly stops mentioning things is the exact
failure this tool is pointed at.
How canary and flatline work,
end to end →
The full
pipeline: what flatline checks, how canary reaches it, the ignore file, and every exit
code.
Get it
Free, MIT licensed, runs on your machine. canary calls flatline for the analysis rather than reimplementing it, so you install both — two files, no account, no service.
If you just want to use it — Windows, one file, nothing to install:
Double-click it, pick your folder, and the report opens in your browser. Everything happens on your machine.
If you are technical, or not on Windows:
pip install awllc_flatline-0.2.1-py3-none-any.whl pip install awllc_canary-0.1.0-py3-none-any.whl canary ~/Downloads --report canary.html
canary and flatline on PyPI belong to unrelated projects, so
pip install canary would fetch someone else’s tool. Ours publish as
awllc-canary and awllc-flatline. canary checks for this too — if
the wrong package is installed it says so, rather than blaming your data for a packaging
mistake.Running it on a schedule
Give it --fail-on-findings so it has
something to say, and let your scheduler read the exit code. Watching the report file instead
would prove nothing: it carries a timestamp, so it changes every run whether or not anything
happened.
| 0 | every re-examined file came back clean |
| 1 | a file could not be checked — worse than a finding, because it hides an unknown number of them |
| 2 | new findings |
What it does not see
Only files that change on disk. It knows nothing about whether a scheduled job ran at all, or whether an output went stale between runs — different questions, different tools. Saying so is the point: a tool that implies it covers more than it does is how coverage comes to be assumed instead of checked.
The other half: flatline
Software fails loudly. Data fails quietly. flatline is the judgment — it decides whether a signal still carries information. canary is the trigger. Neither tool will ever call a file clean that it failed to read: a check that could not run is reported as a failure to check, never as a pass — in code, and with a test, in both.