Inspiration

Growing up, my city had street signposts telling you where you were. They're mostly gone now. The same gap shows up in a much higher-stakes form near Nigeria's dumpsites and industrial areas: a new water well sunk in the wrong spot can draw straight from a contamination plume, and the people who'd catch that, geologists, aren't always available to check every site a community or a driller needs. This project is about not letting that gap turn into a bad call.

What it does

A field worker submits raw electrode readings from a site as a CSV file. The agent checks what's really underground using the physics a geologist would use, and compares it against known contamination signatures from published cases. If everything looks clean, it files a report automatically. If anything looks risky, it stops. It holds the case and brings in a human geologist before anything gets filed, rather than guessing. Once a person confirms it's safe to act on, the agent explains the result in plain language for the field worker who has to act on it, not a specialist.

How I built it

The safety-critical part, reading the site, checking for risk, deciding whether to file automatically or ask a human, is deterministic Python and geoelectric inversion (pyGIMLi), not a language model. That decision is enforced in code a model can't talk its way around. A Strands Agent (Claude Haiku 4.5 on Amazon Bedrock) translates an already-decided result into plain English after a report is filed. It never makes the safety call itself.

Challenges I ran into

Real data was harder than expected: transcribing published field measurements exposed a bug where every station came back "unclassified." Independently-published labels then proved my first fix was still wrong most of the time, which meant a second revision and an honest downgrade of an earlier overconfident claim. One named source site was unreachable outright (dead host), and three substitute datasets from other regions were found and deliberately rejected rather than silently swapped in, since the local geology doesn't transfer. Mid-hackathon, I also found the project declared the required SDK as a dependency but didn't use it anywhere, fixed by adding a real, bounded use of it. A second AWS issue, the account suspended and then closed over identity verification, cut off Bedrock access before I could test a follow-up feature live. It's described below, not demoed.

What's next

A second Strands call already exists in the codebase to read messy, free-form field notes instead of requiring clean CSV, built and pushed, but not yet verified against live Bedrock. Also planned: live deployment on Amazon Bedrock AgentCore, and a Telegram bot connection so a geologist can review a flagged case from their phone.

Built With

Share this project:

Updates

Submission history