Inspiration

When someone goes missing in the backcountry, the person deciding where to send searchers is usually a volunteer at a folding table with a paper map and a trickle of clues: "a hunter saw a woman in a blue jacket heading for the creek", "phone pinged tower 7 at 4pm", "Alpha searched segment 12, nothing". The mathematics for turning that into a plan, Bayesian search theory, found the USS Scorpion and Air France 447. In wilderness search it is still done by hand: the mapping tool real teams use has no lost-person-behaviour feature at all. Every hour of delay lowers survival odds. Geraldine Largay was found two years later, two miles from the Appalachian Trail, after a search that looked in the wrong place first.

What it does

Beacon keeps a live probability map over real terrain (OpenStreetMap trails, lakes, forest, and elevation) of where the missing person is, built from real lost-person statistics (ISRID distance distributions fitted by the MapScore project) and a particle simulation of thousands of lost hikers walking that terrain. Every clue typed in by the incident commander becomes a Bayesian likelihood update; every segment searched with nothing found removes probability. Teams are assigned to maximise the probability of finding the person this period (Koopman search theory, polished by hill climbing). When a report arrives, the plan re-optimises and the map visibly shifts; the briefing names where each block is ("Dog team: 0.8 km N, streets, 1 h, POD 61%") and which teams moved and why. The map is real 3D terrain: satellite imagery on real elevation, the belief draped over the relief, and each team's search block standing as tall as the hours assigned to it, so an incident commander reads effort and probability at a glance.

How the agents collaborate

Seven roles run on the JiuwenSwarm / openjiuwen SwarmFlow engine as a Swarm Skill that passes the official validator with 0 warnings:

  • Coordinator (Leader) opens the incident, gates replans (a replan only happens if the optimiser can beat the current plan by more than 5% probability of success), runs Dispatcher-Verifier rounds, and applies fallbacks.
  • Profiler and Terrain run in parallel: the profile category and bounded adjustments; how strongly terrain shapes the prior, decision points, hazards.
  • Clue turns one free-text report into one placed, weighted likelihood, or escalates it back to the human when it has no usable location ("someone thinks they heard shouting" is not a place).
  • Dispatcher proposes assignments on top of the optimiser's baseline with tactical reasons; Verifier accepts or rejects on deterministic feasibility checks plus judgement, and cannot propose. Three rejections trigger an optimiser fallback, flagged in the order sheet.
  • Briefing writes the radio-ready order.

The agents never touch the probability grid; they return structured JSON and the deterministic search core does the arithmetic. Every rejection, retry, escalation and fallback is visible in the live agent feed.

How we know it works

The planner never sees where the person really was. We evaluate on 110 real historical searches with known find locations (ISRID cases distributed with MapScore). Tier 1 scores the prior against the real find location with a rank score; a cross-validated experiment shows the continuous ring density Beacon uses beats the classic quartile-ring drawing by 0.10 mean rank score on held-out folds, and that per-category fitting overfits at this sample size. Tier 2 places a hider at the real find location and simulates five teams for 72 hours: Beacon's replanning finds the subject within 72 h in 69% of runs (median 44 h) against 23% for an outward sweep and 22% for a plan-once static allocation (all numbers in docs/RESULTS.md, rendered from the committed evaluation outputs). Ablations remove clue integration, negative-search updates and the hill climb one at a time. We also fetched real OpenStreetMap + elevation terrain for six of the historical search areas and checked whether the terrain layer improves the map: it does not at that sample size, and we report that rather than hide it; the check did expose two modelling errors (desert washes treated as lakes; a downhill drift for hikers who in fact went uphill) that are now fixed.

Challenges

Terrain data had to be fetched through a browser (Overpass and elevation APIs rate-limit hard) and packed into checksummed bundles; the particle filter could not put mass where no particle had walked, so a witness report 1 km away was under-weighted until we re-seeded part of the cloud from the grid posterior; and every number we wanted to claim had to survive a check against real find locations, which is how the terrain layer lost its bragging rights and two modelling bugs were found.

What's next

Real terrain for the remaining historical cases, drone and dog sensor models, CalTopo export for real teams, and a field companion app so searchers report clues by voice. The Swarm Skill already plans a second category (a missing dementia patient in a suburb) with no code changes.

Built solo

One person, one weekend, zero to a validated Swarm Skill, a live map, and an evaluation on real cases.

Built With

  • bayesian-search-theory
  • fastapi
  • hill-climbing
  • jiuwenswarm
  • maplibre-gl
  • numpy
  • openjiuwen
  • openrouter
  • openstreetmap
  • particle-filter
  • playwright
  • python
  • scipy
  • uvicorn
Share this project:

Updates

Submission history