Project · live demo
DrawCheck
Construction contractors bill monthly with a pay application: every line of work, what was billed before, what is billed now, and what is due after retainage. DrawCheck reads the bill as PDF, Excel, Word or a scan, checks the arithmetic and the contract terms, and points to the exact cell behind every problem. If it cannot read a bill completely, it says so instead of guessing.
How it works
01
Read
Parse every table and cell, keeping its address.
02
Locate
Find which column is which. For unfamiliar layouts an AI model proposes addresses only. It never types a number.
03
Check
Plain-code rules: line math, totals, summary vs detail, retainage, payment due, overbilling, last month, change orders, budget.
04
Verdict
Clean, findings, or can't verify. Each finding is labeled complete, correct or consistent.
Try it on sample bills
How well it works
Real public bills
0
false passes on 4 bills with known errors
- Documents
- 13
- Can't verify
- 9
- False alarms
- 0
Held-out layouts
0
false passes on 18 bills with known errors
- Documents
- 24
- Can't verify
- 1
- False alarms
- 0
Generated bills
0
false passes on 225 bills with known errors
- Documents
- 300
- Can't verify
- 0
- False alarms
- 0
Full scorecard
Real public bills
False passes: 0 of 4 bills with known errors
| Measure | Result |
|---|---|
| Documents | 13 |
| Could not verify (abstentions) | 9 |
| Correct abstentions on unreadable documents | 6 |
| False alarms on clean documents | 0 |
| Verdicts on documents expected to be unverifiable | 0 |
| Model usage cost (USD) | 1.580598 |
| Mean review time (seconds) | 27.595 |
Type scores exclude every abstained document. Each type counts once per document. N/A means there were no eligible documents for that ratio.
| Finding type | Recall | Precision |
|---|---|---|
| E6 | 100.00% | 100.00% |
| Layout | Documents | False passes | Abstentions | False alarms |
|---|---|---|---|---|
| unspecified | 13 | 0 | 9 | 0 |
| Why verification failed | Occurrences |
|---|---|
| mapping_reconcile_failed | 2 |
| missing_fields | 1 |
| prior_unverifiable | 1 |
| row_count_mismatch | 1 |
| unmapped_columns | 1 |
| unreadable_cells | 1 |
| vision_unconfirmed | 7 |
Held-out layouts
False passes: 0 of 18 bills with known errors
| Measure | Result |
|---|---|
| Documents | 24 |
| Could not verify (abstentions) | 1 |
| Correct abstentions on unreadable documents | 0 |
| False alarms on clean documents | 0 |
| Verdicts on documents expected to be unverifiable | 0 |
| Model usage cost (USD) | 0.493188 |
| Mean review time (seconds) | 6.384 |
Type scores exclude every abstained document. Each type counts once per document. N/A means there were no eligible documents for that ratio.
| Finding type | Recall | Precision |
|---|---|---|
| E1 | 100.00% | 100.00% |
| E2 | 100.00% | 100.00% |
| E3 | 100.00% | 100.00% |
| E4 | 100.00% | 100.00% |
| E5 | 100.00% | 100.00% |
| E6 | 100.00% | 100.00% |
| Layout | Documents | False passes | Abstentions | False alarms |
|---|---|---|---|---|
| docx_renamed | 8 | 0 | 0 | 0 |
| pdf_reordered | 8 | 0 | 1 | 0 |
| xlsx_draw | 8 | 0 | 0 | 0 |
| Why verification failed | Occurrences |
|---|---|
| mapping_reconcile_failed | 1 |
Generated bills
False passes: 0 of 225 bills with known errors
| Measure | Result |
|---|---|
| Documents | 300 |
| Could not verify (abstentions) | 0 |
| Correct abstentions on unreadable documents | 0 |
| False alarms on clean documents | 0 |
| Verdicts on documents expected to be unverifiable | 0 |
| Model usage cost (USD) | 0 |
| Mean review time (seconds) | 0.041 |
Type scores exclude every abstained document. Each type counts once per document. N/A means there were no eligible documents for that ratio.
| Finding type | Recall | Precision |
|---|---|---|
| E1 | 100.00% | 100.00% |
| E2 | 100.00% | 100.00% |
| E3 | 100.00% | 100.00% |
| E4 | 100.00% | 100.00% |
| E5 | 100.00% | 100.00% |
| E6 | 100.00% | 100.00% |
| Layout | Documents | False passes | Abstentions | False alarms |
|---|---|---|---|---|
| docx_tables | 75 | 0 | 0 | 0 |
| pdf_g70x | 75 | 0 | 0 | 0 |
| xlsx_clean | 75 | 0 | 0 | 0 |
| xlsx_messy | 75 | 0 | 0 | 0 |
Synthetic scores measure generated documents separately from real bills. Replay cost reflects recorded token usage; replay makes no paid calls.
Scanned bills are read twice, by a vision model and by OCR, and a number counts only when both readers agree on it; anything else is reported as "can't verify". Generated bills test reading accuracy; the real public bills (from city council and school board packets) are the honest test. Personal project on synthetic and public documents, not affiliated with AIA.