synthetic cfo Back to synthetic cfo
Measured, not asserted

Does a score on this data mean anything?

This is a synthetic company ledger, the public sample on SAP ECC, with 38 planted, labelled fraud records in it. We handed the database to three real detectors without the answer key, then scored what they flagged. Run them below and watch what each one actually caught.

Fgeneric anomaly detection's grade
422false flags on a company with no fraud in it
100%of the planted fraud is findable from the data
1 seedregenerates every number on this page
Run the detectors replay of a recorded run

The same company, generated with fraud at medium intensity. The dashed line marks the 38 planted records a perfect detector would find with no false alarms.

actual fraud found false alarms 38 planted fraud records
Generic statistical anomaly detectionoutliers, digit tests, round numbers: the statistics a team tries first
grade F
found 6 of 38 354 false alarms
Found 6 of the 38 planted fraud records, with 354 false alarms.
16%
recall
2%
precision
Textbook CAAT rulesthe audit analytics handbook: duplicates, thresholds, weekend postings
grade F
found 20 of 38 257 false alarms
Found 20 of the 38 planted fraud records, with 257 false alarms.
53%
recall
7%
precision
Targeted forensic rules (ceiling)rules written knowing which schemes were planted: a ceiling, not a model
grade F
found 38 of 38 326 false alarms
Found 38 of the 38 planted fraud records, with 326 false alarms.
100%
recall
10%
precision
Pressing run replays the recorded result of the real detector runs, read from the committed proof output. Nothing is simulated in your browser, which is why pressing it again never changes them.
What was planted in this company
38
planted
Phantom revenue7
Lapping5
Channel stuffing3
Missing trader VAT3
Zero-rated domestic sales3
13 more scheme families17

The engine carries 37 labelled fraud schemes, 35 across the seven business cycles and 2 in the intercompany group. The SAP world is the public sample, purchase to pay and order to cash at medium fraud, and it plants these. Hover or tap anything on this page for the plain-English reading.

What the grades actually mean

A detector is scored on three numbers, and the grade is a band on the third. Here is each one in plain terms, worked on the textbook rules' real result from the SAP sample.

PrecisionOf everything a detector flags, the share that is actually fraud. The textbook rules flagged 276 records and 19 of those were planted fraud: precision 0.07. In practice, an investigator who opens 100 of its flags closes about 93 of them as innocent, and every one of those is paid working time. The lab above says it found 20 with 257 false alarms, which adds to 277, not 276: the two count different things. Found counts planted records and false alarms count flags, and one flag can name more than one planted record (a purchase order with two short-received lines, say), so its 19 correct flags cover 20 planted records.
RecallOf all the fraud that exists, the share the detector caught. This sample plants 38 fraud records and the textbook rules found 20: recall 0.53. The other 18 fraud records were never flagged at all, and in a real company they simply sail through.
F1One number balancing the two: the harmonic mean of precision and recall. It exists to punish cheating on one side. Flag every record in the ledger and recall is a perfect 1.00, but precision collapses and F1 collapses with it. The textbook rules' 0.07 precision and 0.53 recall combine to F1 0.12, which lands in the F band.
GradeF1 bandWhat it means in practiceOn this data
A0.90 and aboveFlags are almost always right and almost nothing slips through. Treat a grade A on a synthetic benchmark with suspicion: it usually means the answer key leaked into the data. Our own textbook rules scored A on the Oracle build before we fixed the engine, and the fix took it away.no detector lands here on this data
B0.75 to 0.89A strong screen. Most flags are worth opening and most of the fraud is caught. A tuned, scheme-aware rule set on honest data lands here.no detector lands here on this data
C0.50 to 0.74A usable screen that costs real work: roughly half the flags waste an investigator, or a meaningful share of the fraud is missed, or both at once.no detector lands here on this data
D0.25 to 0.49More wrong than right. The review pile is mostly noise and much of the fraud still escapes.no detector lands here on this data
Fbelow 0.25Statistically close to useless for this job. Most flags are noise and most fraud walks. Day-one statistics land here because behavioural fraud does not look like an outlier.Generic statistical anomaly detection on SAP ECC (F1 0.03)
Textbook CAAT rules on SAP ECC (F1 0.12)
Targeted forensic rules (ceiling) on SAP ECC (F1 0.18)
Generic statistical anomaly detection on Oracle Cloud (F1 0.04)
Textbook CAAT rules on Oracle Cloud (F1 0.15)
Targeted forensic rules (ceiling) on Oracle Cloud (F1 0.15)

The bands are fixed in the scorer: A at 0.90 or above, then B at 0.75, C at 0.50, D at 0.25, and F below that. It is the same scorer behind the product's score-a-model feature, so a model you test on a purchased dataset is graded on exactly this ladder.

How the test is run
No peekingA detector is handed one thing: a copy of the database in a directory where the answer key does not exist. Not looking is structural, not promised.
The fraud-free twinEach detector also runs against the same company generated with fraud set to none. Its answer key is empty, so every flag there is a false positive. That view is the cleanest statement of whether a rule finds fraud or finds noise.
Three tiers of skillDay-one statistics (outliers, digit tests, round numbers), then the audit-analytics handbook, then rules written knowing the scheme families. The last is a ceiling and is reported as one: it answers whether the fraud is findable at all, not how good anyone's model is.
The gradesA detector receives the grade band of its F1 score, the balance of precision and recall: A at 0.90 or above, then B at 0.75, C at 0.50, D at 0.25, and F below that. The same scorer drives the score-a-model feature in the product.
We attacked our own answer key first

Before publishing a single score, we ran two attacks on ourselves. First, the engine's ground-truth markers used to ship inside the data, where a two-line search could read the answers off the rows; evaluation mode now withholds them, and the package fails its own build if one survives. Second, we measured whether any fraud label was just a database query restated, which would make an innocent instance of that condition impossible and a detector incapable of being wrong.

The engine now records ground truth at the moment each scheme is planted, and the world carries innocent look-alikes of nearly every fraud condition: receivables open simply because they are not yet due at the year-end extract, cheques voided for a misprint and reissued, rent and utilities invoiced with no purchase order, routine manual journals, deposits in transit. That is why the precision figures here are ordinary instead of perfect: on this data, a detector can be wrong. That is what makes the scores mean something. Three conditions are deliberate closed sets, where the join or the reconciliation is the analytic: segregation of duties, the ghost vendor and phantom inventory. A model scoring perfectly on those has rediscovered a query, not found a fraud.

Every number, in one table
The public sample, SAP ECC · 38 labelled fraud records
DetectorPrecisionRecallF1GradeFlags on the fraud-free twin
Generic statistical anomaly detection0.020.160.03F422
Textbook CAAT rules0.070.530.12F293
Targeted forensic rules (ceiling)0.101.000.18F358
The same exercise on Oracle Cloud · 59 labelled fraud records
DetectorPrecisionRecallF1GradeFlags on the fraud-free twin
Generic statistical anomaly detection0.020.200.04F687
Textbook CAAT rules0.080.660.15F437
Targeted forensic rules (ceiling)0.081.000.15F639
Check it yourself

The SAP dataset scored above is the public sample. Download it, run your own detector against the database, and score it against the answer key in the same package. The sample is built in evaluation mode, exactly as the proof run is: the ground-truth marker columns are withheld from the tables, the annotation layer sits in 01_Audit_Evidence/SME_Reasoning.csv, and the answer key ships in full.

Engine v1.15.0. Every figure on this page is read from the committed output of the proof run, never typed in. Fraud levels, schemes and volumes are configurable; the SAP numbers describe the public sample configuration at medium intensity, and the Oracle numbers the same company on Oracle Cloud with four cycles (purchase to pay, order to cash, cash and bank and record to report), which is not the public sample.