Learning from the field

Our thanks to those who taught us, and something we can give back.

Thank you

SuRFIcE is a small, young service. Much of what we understand about submittal and RFI review we learned by studying the leaders in this field: the teams who built AI-assisted submittal review before us, and who publish openly how they think about it. We have never worked with them. We learned from them the way a student learns from a good teacher’s published work.

From them we took three lessons that now shape everything we build:

  • Every finding must point to its source page.
  • The engineer stays in charge; a tool flags, a person decides.
  • The review has to keep pace with the project.

We are trying to apply these lessons to Indian practice, where grades and limits often sit in BOQ item descriptions and the governing codes are IS standards. Whatever we get right owes a great deal to them.

Something we can give back

One lesson from our own testing may be useful to anyone who reads material test certificates from photos or scans. We share it freely, with the tool we used to find it.

The problem: plausible misreadings

We generated invented reinforcement mill test certificates and degraded them the way phone photos and poor scans are: tilted, half resolution, blurred, heavily compressed and unevenly lit. Plain OCR then produced numbers that look right but are wrong: an elongation of 18.2 % read as 182, carbon of 0.19 % read as 6.19, a yield stress of 517 read as 17. Across 108 synthetic certificates, the OCR text held 39 such misreadings.

These pass a common safety check, which confirms that a proposed value appears in the text of the page. The text itself is wrong, so the check agrees with it.

A simple guard

A value read from an image is accepted only when all three of these hold:

  1. Two independently prepared readings of the image show the same number.
  2. Neither reading was unsure of it (word confidence of 85 or more, out of 100).
  3. It is physically plausible: wide engineering limits, not specification limits, so a real deviation still reaches the engineer.

Anything else goes to a person, who compares the value with the strip of the image where it is printed.

What we measured (synthetic data only)

On the same 108 invented certificates (648 values)Result
Wrong values accepted with the guard0
Right values accepted with the guard472
Values sent to a person176

The cutoff of 85 came from the measurement: at 70, two wrong values that both readings agreed on were accepted. These are results on invented images, not a claim about real documents. Both readings use the same OCR engine, so a confident shared misreading remains possible; real data may behave differently.

Correction: new certificates broke the 0 (2 November 2026)

The 0 above holds only for the 108 certificates the guard was measured on. We then ran it on four new sets of 108 invented certificates (2,592 values) that it had never seen. It accepted 2 wrong values: a heat number of 5407 read as 5467 on a heavily compressed image, and an elongation of 22.0 read as 22.9 on a tilted one. In both, the two readings agreed on the wrong number with confidence of 85 or more: the shared misreading we warned about.

A third check: damaged copies

We now also read eight deliberately damaged copies of each image (resized, slightly tilted, sharpened, with added noise, or cut to black and white). If any copy shows the same number with one digit changed, the value goes to a person. This check only refuses; it never accepts a value the other checks refused. We tried letting it accept as well and stopped: on one compressed image all eight copies read 2633 where the certificate said 2033, because the error was in the image itself.

With the third check (synthetic data only)Result
Wrong values accepted, in 8 runs (the 108 certificates five times; three new sets once each)0
Both wrong values aboveRefused
Right values accepted on the 108 certificates, per run401 to 437 (472 without it)

Read this with care. The third check was built after we had seen those two errors, so refusing them does not prove it works on new images. We then ran four further sets that played no part in building it: it accepted 1,694 values and none was wrong, but the first guard made no errors on those sets either. With that many values, an error rate of up to about 1 in 565 cannot be ruled out.

The cost: more values go to a person, and each image goes through three times as many OCR passes (12 instead of 4). Again, these are invented images. A check that works on our own test images can still fail on real documents, as the first guard did on new ones.

Use it freely

Download surfice_gold.py (Python, MIT licence): the generator for the invented certificates and the scorer that counts plausible misreadings. This note is shared under CC BY 4.0. If it helps your product, we will be glad.

With gratitude,
Prof. Taran C. Bhagat and the SuRFIcE team, AInnoverse Tech Centre LLP