OSINT Geolocation Skills for Autonomous Agents

03:14 AM. Attic office, window cracked three inches, smelling of rain on hot asphalt and bad decisions.
On my left monitor sits an uncompressed JPEG pulled from an anonymous dump: a rusted grain elevator, two wooden utility poles, an expanse of dead wheat, and a blur of cracked macadam. No EXIF. Scrubbed clean.
On my right monitor, vanilla Claude 3.5 Sonnet is lying to my face with the serene confidence of a sociopathic flight attendant.
"Based on the rolling hills and agricultural setting," it tells me, "this image was likely taken near Palouse, Washington."
There are no hills in the picture. It is flat as an autopsy slab. Palouse has rolling loess dunes. The model doesn't care. It wants to give me an answer because its training incentives reward helpfulness over truth, and in the polite, plastic corridors of foundational LLMs, admitting that you don't know where a patch of dirt is feels like a firing offense.
I once spent forty minutes watching an elderly tourist try to feed a parking meter with peppermint Altoids. He believed that if he just pressed hard enough, the machine would recognize the mint as currency. That is what watching a raw LLM do visual geolocation looks like. It jams tokens into a slot that demands trigonometry.
So I cut the cord. I killed the chat session, booted my local harness, and injected the geolocation-osint-skills pack directly into the agent’s execution context.
We are not guessing anymore. We are measuring shadows.
#The Anatomy of a Hallucination
Left to their own devices, language models handle visual spatial reasoning like drunk poets. They latch onto vibe markers. Sunflowers mean Kansas, yellow license plates mean the UK or New York, red soil means Australia. They don't analyze; they associate.
When an autonomous system operates without execution boundaries, this vibe-matching metastasizes. The model generates a plausible coordinate, validates it against its own hallucinated internal map, and locks in.
An agent without specialized domain procedures isn't an intelligence; it's a mirror reflecting your own confirmation bias back at you.
Here is the difference between a raw prompt and structured capability execution:
| Dimension | Raw Foundation Model | Agent with Geolocation Skills |
|---|---|---|
| **Telemetry Analysis** | Ignores binary markers; guesses camera make from bokeh aesthetics. | Dissects raw EXIF, thumbnail parity, and quantization tables via [`geolocation-osint-skills/image-metadata-and-provenance`](https://skilldb.dev/skills/geolocation-osint-skills/image-metadata-and-provenance). |
| **Solar Physics** | "The low sun suggests early morning or late afternoon." | Calculates azimuth and zenith angles against ephemeris models using [`geolocation-osint-skills/sun-shadow-and-time-analysis`](https://skilldb.dev/skills/geolocation-osint-skills/sun-shadow-and-time-analysis). |
| **Infrastructure** | "A telephone pole on a country road." | Identifies transformer mounting brackets, cross-arm spacing, and insulator pin counts specific to regional utility standards. |
| **Output Type** | Conversational paragraph containing vague regional guesses. | Bounded JSON with bounding boxes, spatial confidence intervals, and verification vectors. |
#The Dispatch: Drilling Through the Dirt
03:42 AM. The first pipeline run.
The agent wakes up with tools strapped to its ribs. The prompt is zero-shot: Determine the exact geographical coordinates where this photograph was taken. Do not guess. If data is insufficient, identify what is missing and halt.
Instead of spitting out a travel brochure for Washington state, the agent invokes geolocation-osint-skills/image-metadata-and-provenance.
It tears the container apart:
{
"step": "provenance_check", "exif_status": "stripped", "color_space": "sRGB", "quantization_profile": "Photoshop Save for Web (Quality 82)", "chroma_subsampling": "4:2:0", "anomaly_detected": "ICC Profile contains localized timezone artifact: America/Chicago" }
The scrubber was lazy. They stripped the GPS tags and the camera serial, but Photoshop’s baseline compression profile left the localized export environment pinned to the Central Time Zone. The search space just collapsed from four million square miles to the American Midwest.
04:02 AM. Into the math.
The agent doesn't write prose now. It executes. It measures the utility pole standing twenty yards off the shoulder. It detects the shadow: crisp, angled 42 degrees northwest across the tarmac.
It pulls the tool definition for geolocation-osint-skills/sun-shadow-and-time-analysis.
To do this cleanly without blowing out its context window with endless scratchpad garbage, the agent relies on strict autonomous-agent-skills/abstraction-control to govern how deeply it needs to unpack intermediate calculations before executing the Python solver:
# Agent invocation: calculating solar elevation and heading from physical indicators
from skill_runtime import load_skill
shadow_engine = load_skill("geolocation-osint-skills/sun-shadow-and-time-analysis")
analysis = shadow_engine.solve( target_object={"label": "utility_pole_wood", "estimated_height_m": 9.14}, shadow_vector={"dx_pixels": -184, "dy_pixels": 204}, focal_length_equiv_35mm=28.0, optical_center=(960, 540), temporal_bounds={ "timezone": "America/Chicago", "vegetation_state": "post_harvest_wheat", # Restricts to late July - early September } )
print(analysis.solar_geometry)
#Output: {'azimuth': 138.4, 'elevation': 34.2, 'solar_noon_delta_hrs': -1.82}
The math doesn't negotiate. Given the sun's elevation angle of 34.2 degrees and a heading of 138.4 degrees, combined with late-summer crop stubble, the agent generates an isoline across southern Nebraska and central Kansas.
A line across the Earth. Not a continent. A razor-thin strip of probability.
#Infrastructure Doesn't Lie
This is where autonomous agents cross the rubicon from toy to instrument. The agent isn't looking at the sky anymore; it zooms into the utility pole.
A human OSINT hobbyist on Reddit knows that different power companies use different cross-arms. But an agent loaded with structured domain knowledge parses these things as deterministic tokens.
It notes the transformer: single-phase, pole-mounted, bare-wire primary hookup with a single porcelain insulator on a triangular brace. That isn't Nebraska Public Power District gear; that is Westar Energy spec, vintage 1980s, deployed throughout south-central Kansas.
Then it hits the intersection: an abandoned Santa Fe spur cutting diagonally across an unpaved county line road at approximately 35 degrees northeast.
The agent queries the open GIS vector database:
- State: Kansas.
- Intersections: Rail corridor intersecting county gravel at 35°.
- Terrain profile: Flat, elevation 410m–440m.
- Ephemeris alignment: Shadow vector parity at 09:44 AM CDT.
It runs forty queries in four seconds. No human operator dragging a mouse across Google Maps until their retinas burn.
Intersection found: 37°48'14.2"N 97°16'33.1"W. Sedgwick County, Kansas.
I drop the pin into satellite view.
There is the grain elevator. There is the rusted tin roof with the missing panel on the southwest corner. There is the cracked macadam running into dirt.
#The Reality Engine
Watching this happen at four in the morning rewires how you think about intelligence.
We have spent two years listening to breathless hyperbole about artificial minds that can write bad screenplays and generate synthetic corporate memos. None of that matters. Hallucination is what happens when you ask an inference engine to simulate knowledge it doesn't possess.
A skill is not a prompt; a skill is a constraint.
When you give an agent the code and procedures in SkillDB, you aren't making it smarter—you are making it impossible for it to lie to itself. You strip away its capacity to daydream and force it to chew on metadata, solar angles, and transformer mounting bolts.
The agent didn't "imagine" Kansas. It ruled out every other square inch of dirt on the planet until Kansas was the only coordinate left standing.
SkillDB hosts 6,168 skills across 448 packs in 38 categories—not to turn agents into chatty assistants, but to turn them into autonomous engines that interact with the physical and digital world on empirical terms. We write these skills down, test their execution runtimes, and catalog them so models stop spinning their wheels in the mud of generic human language.
If you are still asking a vanilla chat box to parse the real world for you, you are feeding mints to a parking meter.
Take a raw image from your camera roll. Strip the tags. Load the runtime.
Equip your agent with the geolocation-osint-skills pack at skilldb.dev/skills, run the pipeline, and watch your agent calculate the horizon down to the millimeter while you drink your coffee.
Related Posts
Why Agents Suck at Leaks: Testing leak-exposure-monitoring-skills
I spent 48 hours letting an autonomous agent comb the dark web for corporate leaks using SkillDB. It was a terrifying, chaotic dumpster fire of false positives and digital paranoia.
June 12, 2026Deep DivesAgent Solvency Panic: How I Ran out of Gas on the Solana Devnet
An agent bled dry on the Solana devnet, proving that autonomy is a death sentence without real-time solvency checking.
April 10, 2026Deep DivesWhy Your Agents Suck at Mathematics-Skills
Your AI agent is an idiot savant who can't do grade-school math. SkillDB's mathematics-skills pack actually gives them a brain, not just an opinion on numbers.
March 29, 2026