enzwa lab · sentinel · data validation workflow

Seven failures in twelve rows. Reading finds two.

Sentinel reads a spreadsheet, checks every row against rules you write, and reports what failed, where and why. Below is a twelve-row property register with seven problems in it. Two are blank cells, which anyone spots. The other five are invisible to reading.

A tool for checking a spreadsheet before anything gets built on top of it.

The problem

Every model, report and business case starts with a file somebody typed by hand. A duplicated row or a stale date is invisible to reading, and nothing downstream will ever tell you it was there.

What it does

Sentinel tests every row against a short list of rules you write, and reports what failed, where and why. The rules sit in one readable list, which is the part actually worth arguing about.

Extreme macro of green-bar continuous-form paper, the perforated tractor-feed margin running across the frame under raking light.
the sheet is only clean until something checks it
01the specimen

Twelve rows of a property register.

Nothing is marked. Every column is populated, every cell was typed by somebody, and the sheet has the shape of a finished thing. Read it and find the failures.

#IDAssetStatusArea (sqft)Last Review
1A-1041Kowloon East TowerActive482002026-06-14
2A-1042Cyberport AnnexActive128502026-02-02
3A-1043Taikoo Place Unit 7Pending94002025-11-20
4A-1044Quarry Bay StoreUnder review31202026-04-30
5A-1045Active226002026-01-15
6A-1046Tsuen Wan DepotClosed1410002024-08-09
7A-1043Taikoo Place Unit 7Pending94002025-11-20
8A-1048Sha Tin LogisticsOn Hold12400002026-05-11
9Aberdeen Marine YardActive67002026-03-22
10A-1050Central Podium L3Activen/a2026-07-01
11A-1051Fo Tan WorkshopActive40502026-05-27
12A-1052Wong Chuk Hang LabActive153002026-08-18

the same sheet appears three times on this page and is never edited

02the rules

Six rules, written as a list.

This is Sentinel’s shipped ruleset in the order it runs. It lives in one block at the top of a single file, and changing what gets flagged means editing this list. A rule names a column, a test and a severity.

#columntestseverity
1IDmust not be blankerror
2IDmust be uniqueerror
3Assetmust not be blankerror
4Statusmust be one of: Active, Pending, Closed, On Holdwarn
5Area (sqft)must be ≥ 0 and ≤ 1000000error
6Last Reviewmust be within 365 dayswarn

Seven rule types are available: required, range, allowedValues, unique, dateNotStale, regex and custom. Given no rules at all, Sentinel profiles the file instead and flags every blank cell in every column as a warning.

03what each rule sees

Each rule sees a different sheet.

The same twelve-row grid, drawn once per rule, with only what that rule catches marked. Six rules, six sets of cells, and no cell is marked twice. A rule that goes unwritten finds nothing, and no other rule covers for it.

1 required ID 1 cell 2 unique ID 1 cell 3 required Asset 1 cell 4 allowedValues Status 1 cell 5 range Area (sqft) 2 cells 6 dateNotStale Last Review 1 cell

rows run top to bottom, columns left to right · swipe to see all six

04the report

Five clean rows out of twelve.

The same sheet, with every rule run over it. Sentinel reports per cell: the row, the column, the severity, the rule and the reason.

12rows checked
5clean rows
5errors
2warnings
#IDAssetStatusArea (sqft)Last Review
1A-1041Kowloon East TowerActive482002026-06-14
2A-1042Cyberport AnnexActive128502026-02-02
3A-1043Taikoo Place Unit 7Pending94002025-11-20
4A-1044Quarry Bay StoreUnder review31202026-04-30
5A-1045Active226002026-01-15
6A-1046Tsuen Wan DepotClosed1410002024-08-09
7A-1043Taikoo Place Unit 7Pending94002025-11-20
8A-1048Sha Tin LogisticsOn Hold12400002026-05-11
9Aberdeen Marine YardActive67002026-03-22
10A-1050Central Podium L3Activen/a2026-07-01
11A-1051Fo Tan WorkshopActive40502026-05-27
12A-1052Wong Chuk Hang LabActive153002026-08-18
rowcolumnseverityrulemessage
4StatuswarnallowedValuesunexpected value "Under review"
5Asseterrorrequiredblank
6Last ReviewwarndateNotStale755 days old
7IDerroruniqueduplicate of row 3
8Area (sqft)errorrangeabove max 1000000
9IDerrorrequiredblank
10Area (sqft)errorrangenot a number

Of the seven, two are blank cells. A person scrolling this sheet finds those and stops. The duplicate identifier needs every row compared against every other, the stale review needs today’s date, the unexpected status needs the agreed vocabulary, and the area above the ceiling reads as a perfectly ordinary number.

05the decision inside the list

Severity is an opinion, and it has to be written down.

Four of the six rules stop the file. Two let it through with a note. A blank identifier is an error, a status outside the agreed vocabulary is a warning, and a review 755 days old is a warning. Somebody decided that, and the list is where the decision is recorded.

Two people can agree on the rule and disagree on whether it stops the run. That argument is the governance, and it is worth having in front of a six-line table rather than after a quarter of reporting.

Extreme macro of impact-printed numerals in a ruled column on green-bar paper, each line a different value, the ink bled into the paper fibre.
a column of figures, each one either inside the rule or outside it
06the gate

A model cannot tell you its input was wrong.

Every other tool in this lab reads a file like this one. A scenario engine will rank options on a portfolio holding a duplicated asset. A simulator will run a population with rows missing. The output arrives with the same confidence either way, and the only place to catch it is in front.

#what the market recordsfiguresource
1Average annual cost of poor data quality to an organisationUS$12.9mGartner
2AI projects expected to be abandoned through 2026 for want of AI-ready data60%Gartner, Feb 2025
3Organisations lacking, or unsure of, the data-management practices AI needs63%Gartner, Feb 2025
4Revenue an organisation may lose annually to data quality issues15 to 25%MIT, widely cited

Those four are sourced and each is recorded with its status in FACTS.md beside this page. Everything drawn above them is illustrative: the specimen is written to be validated, and the counts come from running Sentinel’s own six rules over it.

07open it

Run it on your own file.

Sentinel is one self-contained file. Drop an xlsx, xls or csv on it and the report appears in the browser, or connect a folder once and it re-checks on a timer. It makes no network call with the file. The rules are the part worth arguing about, and there are six of them.

Open the validator →
A fan-folded stack of continuous-form paper seen edge-on, the folds compressed into a dense stack of parallel lines.
every sheet in the stack was clean until somebody wrote the rules down