When a carrier like T-Mobile needs work done on a cell tower, it doesn't send its own people — it hires a contractor, whose technician climbs 150–200 feet, does the job, and records it on a phone: equipment at the right angle, grounding wires secured, serial numbers readable. Around 100 photos and 20 videos per site. Nobody from the carrier is there to watch, so those images are the only proof the work happened. Nothing gets paid until they're approved.
So the entire payment chain rested on evidence no one could verify at the point it mattered. Photos were checked two or three days later, at a desk — by which time the crew was 50 miles away, and the only remedy for a bad one was to send someone back up the tower. That gap cost money the obvious way, and it invited abuse in ways that were harder to see: photos that were sharp but showed the wrong part, credentials that were valid but belonged to someone else, real photos recycled from another site. The camera was never the problem. We were checking the evidence too late, and never against what the contract actually required.
The fix was to move trust to the moment of capture — validate each photo on the tower, while the technician can still act on it, and validate it against what this job actually demands.
Nobody in this chain was careless. The technician took the photos they were asked for, in the conditions they had — wind, glare, a phone held one-handed at 180 feet. The reviewer checked them properly. What went wrong was the distance between those two moments.
On a phone screen in bright sun, the photo looked fine. Two days later on a desktop monitor, the serial number wasn't legible — and the only person who could retake it was on another tower in another county. That gap cost money in the plainest way: $337 a trip, 21,000 times over three years — about $7.1M. And every one of those was a person put back up a 150-to-200-foot structure to retake a photograph. Whatever the good reasons are for climbing a tower, that isn't one of them.
But the delay didn't just cost re-climbs. The same gap — evidence checked late, and never against the contract — let subtler things through, and these are the ones a reviewer often couldn't catch at all:
Four different failures, one cause: we verified evidence after the fact, disconnected from what the job actually required. Fixing it meant changing where and when the check happened — and what it checked against.
The four failures shared a root cause, so they shared a fix: ask "is this real, correct evidence for this job?" while the answer is still cheap — on the tower, before the technician unclips — and check it against what the contract requires, not a general idea of a good install.
That took four layers. The order matters: cheap, certain checks first; the model last, only on what survives.
Simple rules can confirm a file exists or clears some resolution. They can't tell whether a serial number is readable through glare, or whether the frame shows the grounding wire actually meeting the lug.
So a multimodal model reads each photo against a description of what it should show — for a grounding lug, about ten things — and answers before the technician comes down.
A model that only said "Rejected" would be worse than nothing — the technician is 180 feet up and now knows something's wrong but not what. It returns the fix instead: "the serial number is in shadow — tilt about 10° left and retake." That specific instruction is most of why the group likeliest to reject the tool didn't.
A sharp photo of the wrong part still passed — we'd told the model what the photo was of, never what the contract required of it.
Every client already had this written down — specs, method statements, the SOPs their own engineers work from — in documents nothing in the checker had ever seen. So a retrieval step pulls the sections of this client's spec that apply to this job and puts them in front of the model with the photo. A rooftop small cell and a macro tower pull different documents; nothing hard-coded.
Onboarding a client becomes adding documents, not retraining a model — which matters when you're onboarding continuously. And their specs are read at check time and never trained on: the only version their security teams would sign.
A real climber name and a real, current certificate both passed on their own — but the name on the certificate belonged to someone else, borrowed to cover a crew short a qualified climber.
Nothing checked the relationship between fields, because no single field owns that rule. So now the name entered, the name read off the certificate, and the crew roster are checked as one thing. Change one field mid-submission and the whole cluster re-checks, not just the edited one.
Whether a photo was taken at the right place and time isn't a judgment call — the answer's already in the file. Three plain checks run in front of the AI:
Running these first means spoofed evidence never reaches the model, so there's nothing for it to be talked past — and we don't spend model time on submissions already disqualified. That's what kept cost flat as the checks piled up.
Two decisions had nothing to do with model quality:
The check moved from a desk two days later to the tower, in the moment. The one number I trust most is the rejection rate, because it's measured the same way on both sides of the change.
| Before | After | |
|---|---|---|
| Submissions sent back for rework | 18% | under 2% |
| Time to find out a photo was bad | 2–3 days | while still on the tower |
| Cost of fixing one bad photo | $337 and a second climb | under $1, ten seconds |
The $7.1M is what the problem cost over three years — not what we recovered. Repeat-visit change orders fell sharply after launch, since they're a direct consequence of rejections, but I'd be guessing if I attached a first-year dollar figure. I'd rather leave it as the rate.
The layered checks don't have that clean before-and-after — they went in gradually, one at a time. So instead of a number I don't trust, here's what they now catch that nothing caught before:
All three used to land on a reviewer's desk — or get approved.
Two things came out of it that weren't on the plan.
Reviewers stopped being the first line of defence. The obvious rejections — blur, wrong angle, missing shot — don't reach them any more, so what's left in the queue is the genuinely ambiguous: an install that looks unusual, a spec that doesn't quite match the site. That's the work that actually needs a person.
And people stopped climbing 200-foot towers to retake a photograph. That one has no number attached, and it's the one I care about most.
Shipping is when you learn what was actually wrong. The readable-photo fix worked — and the failures it cleared away were sitting on top of a second set underneath. If I'd stopped when the rejection rate dropped, the wrong-part, wrong-person, and recycled-photo checks would all still be missing.
Not everything wants a model. Of the fixes here, one needed the model to read a spec, one needed two fields compared, and one just needed a timestamp. Working out which is which — and running the cheap, certain checks first — was most of the design.