Data Wrangler
The Outrider

It reads everything.
It decides nothing.

An outrider (Agentic Agent) goes out ahead of the herd, reads the country, and comes back to tell the trail boss what's out there. Ours does that with a data delivery: it opens every last file, works out what each one holds and where it belongs, and proposes how to get it into WranglerView. Then Python executes the plan, once the trail boss has approved it. The Outrider itself doesn't run the application, doesn't write to the database, and never gets the last word.

The screens you use to look at data (the map, DB Explorer, Data Quality and Reference Tables) are exactly as they were. What the Outrider took over were the five screens where somebody sat and told the loader, file by file by file, what it was looking at.

Three in the outfit

Every outfit has a point rider, a fence rider and a trail boss, and nobody does anybody else's job. That is the whole trick.

The Outrider proposes

Rides ahead and reports

It opens the delivery, works out what each sheet and file holds, and writes a plan for loading it. The plan can only use moves from a short, fixed list — trim a value, pad a UWI to 14 digits, parse a date, map a code — which is what makes a plan something you can check instead of something you have to believe. It never writes SQL. It doesn't get to.

Tested code rides fence

Trusts nothing it is told

Before anyone is asked to look at a plan, code runs it over the whole file and writes nothing. Every column accounted for. Every value measured against the column it is headed for. Coordinates checked against the place the row itself claims. Codes checked against the lists they would have to join to. A plan that fails goes back rather than arriving on your desk looking plausible. Plausible is the dangerous one.

The trail boss calls it

Has the last word

Anything that creates or changes a well, a code or a coordinate becomes a card in an inbox, and the Outrider sits there with its hat in its hands until somebody answers. Every answer is signed with the name of whoever gave it and the moment they gave it — including the ones that turn out, six months later, to have been wrong. Especially those.

The fences

A language model can be wrong at the top of its voice, with reasons. So these aren't guidelines we asked it nicely to follow — they are fences, built in code, on the outside. A smooth talker hits them at exactly the same speed as a mumbler.

It cannot put your brand on somebody else's calf

A log, a formation top or a survey belonging to a well the database has never heard of gets held back, not filed against the closest-looking identifier because it was nearly right. It waits in the pen with the reason written on it until somebody says whose it is. Held is recoverable. Guessed is not.

It cannot put a well in the wrong county

Converted coordinates must land inside the state and county the row itself says the well is in. If they don't, the load is refused, however reasonable the numbers look sitting in a spreadsheet. A missing location is obvious to everyone. A wrong one gets plotted, exported, and quoted in a meeting.

It cannot register a new brand

Coded values get checked against the reference tables before anything loads, and a code nobody has registered becomes a question rather than a new entry in the book. Any statement that tries to write a reference table fails, no matter what produced it — and anything that somehow slips past still runs into the database's own constraints, as four production loads discovered the hard way.

It cannot build its own corral

Some files hold things the database was never built to hold, and the Outrider says so instead of cramming them into the nearest pen that roughly fits. Teapot Dome needed three new tables: one for image-log dips, one for reservoir properties, and one for a geologic column that belongs to no well at all. Each time it made the case and a person decided the shape. Anything that can quietly add a column can quietly lose your data in one.

First brand on the calf wins

Loads only ever add, never overwrite, and whichever file gets there first owns the value. If the header spreadsheet leaves a field blank — maybe because somebody told it to — a well report read twenty minutes later does not get to quietly fill it in and say nothing.

A real delivery: Teapot Dome

Teapot Dome in Wyoming, once Naval Petroleum Reserve No. 3, was run as the Department of Energy's Rocky Mountain Oilfield Testing Center, which released its field data publicly for research. It is not tidy, and it was never meant to be: spreadsheets, LAS logs, image-log dip picks, core photos, seismic and well reports, all milling about in the same pen. We opened the gate and pointed the Outrider at it.

14m 42s
start to finish
413,249
rows loaded
3
questions for a person
$0.85
in model spend

1,800 files catalogued and 27 tables filled, out of 41 cards. Only three of those cards needed a person, and all three were the same question wearing different hats: whose is this?

The whole drive, minute by minute — what came through the gate, where the fourteen minutes went, and the three it couldn't settle on its own →

Teapot Dome against the clock — the same delivery made faster: every row in by 8.0 minutes, the first table under one, and the geologic column, reservoirs and FMI dips drawn from the stored data →

Then a new range: Rooks County, Kansas — 80,516 rows in 11 minutes 48 seconds, and 95 documents tied to their wells without OCR →

The ones that look right

An unbranded calf at least announces itself. The dangerous ones are the strays that look like they belong — a value that will load without complaint, sit in a column without comment, and be wrong. Spotting those is most of what a data manager actually does all day. Three the Outrider has caught on Teapot Dome, from its own log:

Almost a date

Three wells completed on 6 April 1905

Three wells had a completion date of 1905-04-06. The Outrider pointed out that this is what Excel shows when someone types a bare year into a date cell. It asked whether to blank them or load them. They were blanked.

Almost an elevation

Ground level at 17,181 feet

Teapot Dome sits a little above 5,000 feet. The header sheet also held 14 zeros and five values from 1.74 to 17,181.76. It listed all 19 and asked. They were blanked, not loaded.

Almost the brief

"The last three years" of a file that ends in 2005

The standing instruction was to load each well's last 36 months of production. The file ends in November 2005, so read literally the plan selected nothing at all. Rather than quietly drop the instruction, it asked. The answer was to read "the last 36 months" as the last 36 producing months of each well.

Is it agentic?

Yes. But that word has been doing heavy lifting in a lot of brochures lately, so here is what it means here, in numbers from the run above.

62
turns, not one question and one answer
21
tools it can choose from
92
tool calls it decided to make
4
attempts to declare itself finished

The fourth number is the one worth having. It decided it was finished. Code told it seventy files were still unaccounted for. It went back and dealt with them, then tried again. Something that cannot do that isn't an agent; it's a form letter with ambitions.

Agentic: nobody hands it a script

It decides what to look at, what to propose, what to leave in the pasture and what to ask about, and it keeps riding until every file is accounted for. It also survives being interrupted, which is the unglamorous half of the job: shoot the worker out from under it and it climbs onto a fresh one and picks up from the tally book, and when the conversation outgrows what the model can hold it starts a new one from the saved state without losing its place in the herd.

Not autonomous: it has no authority over consequences

It never writes SQL and never touches the database. It names a move from a closed list and tested code makes it. Every rule on this page lives outside the model, which matters more than it sounds: a language model can be wrong in a confident, well-argued, thoroughly reasonable paragraph. Here that paragraph meets exactly the same refusal as a hesitant one.

Agentic where judgement is needed, deterministic everywhere else.

Which is why it gets less agentic the better it gets. On this run the model wrote no load plans at all — code proposed all 27 from mappings a person had already approved, before it took its first turn. Most of its 92 calls went on judgement instead, 22 of them deciding which folders to set aside and why. On the first Teapot Dome run it wrote every mapping from scratch. The repeat work keeps hardening into code, and what's left for the model is the part that was always going to need somebody to think about it.

Why we built it this way

The AI proposes, code checks and loads, a person decides, and the database remembers.

Almost none of the cost of loading data is typing. It's working out what a file means — and that is the one thing a language model is genuinely good at. What it can't be trusted with is the final say on whether a well exists, where it sits, or which code it wears, so it doesn't get one. Every plan a person approves is kept, which means the next delivery in this shape doesn't start from a blank page. It starts from what you already said yes to.

Your data comes in off the range in whatever state the last outfit left it. Something has to ride out, round it up, and bring it home without losing half the herd or branding the neighbour's stock. That's the job.