What's Here? Tier-Escalated Spatial Object Identification for Sovereign Multi-Engine Tactical Maps
A renderer-agnostic right-click "What's here?" object-identification and context-analysis pipeline spanning every Soverant / Nexus Synergy map engine (MapLibre 2D/3D, Cesium globe; web and mobile) and every layer (satellite, topographic, vector tiles, custom overlays, and live AIS/ADS-B/COP tracks). A click is compiled into a Context Envelope and dispatched to a nexus-workflows job that escalates through four tiers β deterministic resolve, single-pass vision, tool-using retrieval, and autonomous OSINT β under a decision-theoretic value-of-information gate. Includes full mathematics, step-by-step pseudocode, interaction design, and orchestration diagrams.
What's Here? Tier-Escalated Spatial Object Identification for Sovereign Multi-Engine Tactical Maps
Engineering Research Paper Β· Soverant / Nexus Synergy Author: [Author Name], [Your Institution] Β· Edition v1 Β· 2026-06-16 Distribution: link-only (unlisted,
noindex) Β· Classification handling: design discusses EU-OFFICIAL gating Companion reading: Rendering Sovereign Tactical Geospatial Engines (the renderer substrate this paper builds upon).
A note on epistemic honesty
This paper documents a system that is partly built and partly proposed. The distinction matters, and we keep it visible throughout with two tags:
- [EXISTING] β verified in the deployed Soverant / Nexus Synergy codebase by direct reading of source at the time of writing. These are facts about what runs today.
- [PROPOSED] β a design contribution of this paper. Not yet implemented. Where we describe expected behaviour or performance, we frame it as a hypothesis and an evaluation plan, never as a measured result.
We make no fabricated benchmarks. Every external reference in Β§13 was confirmed against a primary source. Author and affiliation fields are placeholders for the publishing operator to complete.
Abstract
A tactical operator looks at a map and asks the oldest question in geography: what is that? On a modern multi-engine map the question is deceptively hard. The thing under the cursor might be a rendered building in 20-centimetre satellite imagery, a contour on a topographic raster, a polygon in a vector-tile cadastre, a moving vessel decoded from an AIS broadcast, or an aircraft squittering its ADS-B position β and the same screen pixel means something different in each case. Today, the Soverant map console answers a much narrower question. Its right-click "What's here?" action reverse-geocodes empty ground to a postal address, or, on a known entity, opens a chat briefing. Useful, but shallow: it cannot tell you that the grey rectangle in the imagery is a substation, that the cyan triangle is a chemical tanker riding low and recently AIS-dark, or what the surrounding terrain implies for line of sight.
We close that gap. This paper specifies Spatial Object Identification (SOI) β a renderer-agnostic pipeline that turns a single right-click (web) or long-press (mobile) into a structured, evidence-backed answer to what is here, and what surrounds it. A click is first compiled, entirely on the client, into a Context Envelope: geodetic coordinate with MGRS and terrain elevation, the active engine and basemap, the full stack of visible layers and their provenance, the locally picked feature and its attributes, a spatial neighbourhood of nearby features and live tracks, and a screenshot chip cropped to a known ground footprint. That envelope is dispatched through the platform's proven skill-dispatch path into a nexus-workflows job, where a router escalates the work across four tiers: T1 deterministic resolution with no model in the loop (entity and registry lookups, reverse geocoding, OGC GetFeatureInfo, attribute introspection); T2 a single-pass vision-language inference over the screenshot chip; T3 a tool-using retrieval loop spanning the internal knowledge graph, web search, reverse-image search, and vessel/flight/imagery registries; and T4 an autonomous OSINT investigation that decomposes the question, cross-checks sources, and synthesises a confidence-scored dossier. Escalation is not a fixed ladder but a decision: a value-of-information gate weighs the expected accuracy gain of the next tier against its cost and latency, and stops as soon as the answer is good enough.
The contribution is fourfold. First, a client evidence model that is identical across three disparate renderers because it rests on a single normalized pick-and-camera contract. Second, the mathematics that make the envelope meaningful β ground sample distance, rayβellipsoid intersection, terrain decoding, spaceβtime track association, and a DempsterβShafer fusion of heterogeneous evidence into one calibrated belief. Third, a decision-theoretic escalation policy grounded in classical value-of-information and metareasoning theory. Fourth, an interaction design that respects the platform's hard-won UX laws β results land in the inspector as a structured identity card, never as a floating modal over the map, and the sovereignty posture is always legible. We provide pseudocode for every step, diagrams for the orchestration, and a falsifiable evaluation plan. SOI is, to our knowledge, the first published design that unifies map feature interrogation, overhead-imagery vision, and live-track identity under one tiered, cost-aware agentic orchestrator on a sovereign stack.
Keywords: spatial object identification; reverse geocoding; WMS GetFeatureInfo; tier escalation; value of information; DempsterβShafer evidence fusion; AIS/ADS-B track association; visual grounding; retrieval-augmented generation; renderer-agnostic geospatial UI; ground sample distance.
Contributions and reading guide
This is a systems and methods paper, organised into seven parts. A reader who only wants the architecture can read Part III; a reader who wants to implement it should read Parts IV and V together.
- Part I β Introduction & Thesis. The identification problem on a multi-engine sovereign map; why the current behaviour is insufficient; the precise contributions.
- Part II β The Map Substrate. The engines, layers, live feeds, and the dispatch/orchestration spine that SOI rides on. Everything here is [EXISTING] unless tagged otherwise.
- Part III β SOI Architecture. The Context Envelope, the dispatch contract, the four-tier router, and the result card. [PROPOSED].
- Part IV β Mathematical Foundations. Coordinate and projection math, GSD and chip geometry, terrain decoding, neighbourhood metrics, track association, evidence fusion, calibration, and the escalation gate.
- Part V β Reference Implementation. Pseudocode for every step, the skill-registry shape, and the tool executors.
- Part VI β Interaction Design. The context menu, the inspector identity card, the tier-progress stream, mobile parity, and sovereignty UX.
- Part VII β External Knowledge, Related Work, Evaluation & Roadmap. Online sources and how they are gated; the prior art; a falsifiable evaluation protocol; a phased build plan; and an honest account of limitations.
Part I β Introduction & Thesis
1. The question under the cursor
Geographic interfaces have always been built around a single gesture: point at something and ask about it. The desktop GIS made it a tool button β Identify β wired to a feature query against the active layer. The consumer web map made it a tap that drops a pin and reverse-geocodes to an address. Both answers are narrow because both assume the map is one kind of thing: a stack of queryable vector features in the GIS, a road network with addresses in the consumer map.
A sovereign tactical map is not one kind of thing. At a single screen location the Soverant console may be compositing, from bottom to top: a satellite basemap at sub-metre resolution, a topographic raster, bathymetry from a WMS, an administrative-boundary vector layer, a cadastral vector-tile set, a live AIS vessel feed, an ADS-B aircraft feed, a common operating picture (COP) of fused tracks, a Meshtastic mesh node, and a user-drawn area of interest β each with its own coordinate semantics, its own provenance, and its own notion of "the object at this pixel." Ask "what's here?" on that composite and the honest answer is it depends on which layer you mean, and on whether the thing is fixed or moving, mapped or merely imaged.
The operator does not want to disambiguate by hand. The operator wants to right-click and be told: this is the Trino electrical substation; the structure is roughly 40 by 25 metres; the terrain here sits at 355 m; the nearest live track is a Meshtastic node 600 m east; the surrounding parcels are agricultural; here is what open sources say about the facility. Getting from a pixel to that paragraph is the problem this paper solves.
2. What exists today, precisely
[EXISTING] The console already ships the gesture. A right-click anywhere on the map opens a context menu whose first two items are Drop pin and What's here?, followed by Measure from here, Create AOI, Center here, Open Street View here, and Pair Meshtastic device. The menu header shows the clicked coordinate formatted to six decimals and an honest elevation readout β β 355 m Β· 1165 ft when a digital elevation model answers, elevation β when none does, and never a fabricated zero.
[EXISTING] The "What's here?" handler branches on what was clicked. On a known entity (a COP track, an AIS or ADS-B contact, a mesh node) it binds that entity to the unified chat and requests a brief β a free-text dossier the assistant assembles from the entity's metadata and, if web access is enabled, public sources. On empty ground it performs a real reverse-geocode: a sovereign-default waterfall that first consults a human-vetted postcode cache and then a rate-limited open geocoder, returning a place label or an explicit "no address found," never an invented one.
This is genuinely useful and genuinely limited. Three limitations motivate the rest of the paper.
- It cannot identify what it has not been told. A grey rectangle in the imagery that is not a registered entity and not an addressable place gets a street name at best. The substation is invisible to the system because nothing in the click pipeline ever looks at the imagery.
- It does not interrogate the layers. The vector tile under the cursor carries attributes; the WMS that drew the bathymetry can answer
GetFeatureInfo; the layer itself has provenance. None of this is read. The reverse-geocoder is the only "identify" path, and it knows only addresses. - It has one cost setting. Whether the honest answer is a free table lookup or a multi-source investigation, the system does the same thing. There is no cheap fast path for the easy 80% and no deep path for the hard 20%.
3. The thesis
A single click can be compiled into a structured evidence bundle, and identifying what it refers to is best modelled as a cost-aware escalation across tiers of increasing capability and expense, stopping as soon as the evidence is sufficient.
Three commitments follow from that sentence.
Evidence before inference. The client already knows an enormous amount at click time that is currently discarded: which engine is rendering, which layers are lit, what feature the renderer's own picker returns, what live tracks sit nearby, and what the screen actually looks like. SOI captures all of it into a Context Envelope before any model is consulted, so that the cheapest tiers often need no model at all.
Escalation as decision, not pipeline. The four tiers are not a conveyor belt. After each tier produces a belief over candidate identities, a gate asks a decision-theoretic question β is the expected improvement from the next, more expensive tier worth its cost? β and halts when the answer is no. This is the classical value of computation framing of Russell and Wefald [26] and the value of information of Howard [24], applied to a perception problem.
Sovereignty and honesty are invariants, not features. External calls (web search, third-party registries, foreign imagery) are gated by the same classification broker that already governs every skill dispatch. In EU-OFFICIAL posture the pipeline runs on internal evidence only and says so. And every result carries a provenance chain and a calibrated confidence; the system would rather return "unknown" than guess.
4. Why now
Two things make SOI feasible today that were not a year ago. The orchestration substrate exists and is proven: the platform already dispatches skills through a governed broker into a tiered workflow engine with a vision-capable gateway, and has done so in production. And the perception tools have matured: open-vocabulary visual grounding [8], promptable segmentation [6], and strong multimodal models [7] make single-pass overhead-image identification a realistic T2, while tool-using [2] and retrieval-augmented [3] agent patterns make T3/T4 tractable. SOI is mostly a matter of connecting mature parts with the right evidence model and the right escalation policy β which is exactly what the rest of this paper specifies.
Part II β The Map Substrate
This part inventories the system SOI rides on. We keep it concrete because the contributions in Part III depend on these specifics: the renderer-agnostic pick contract is what makes a single envelope possible, and the dispatch spine is what makes a single workflow job possible. Unless tagged [PROPOSED], everything here is [EXISTING] and was read from source.
5. Three engines, one contract
The console renders through three engines, chosen per task and toggled by a 2D / 3D / Globe control:
- MapLibre 2D β a Web Mercator (EPSG:3857) raster/vector renderer, pitch locked flat.
- MapLibre 3D β the same engine with terrain extrusion from an RGB-encoded DEM, pitch up to 85Β°.
- Cesium Globe β a full WGS-84 ellipsoidal globe with native 3D Tiles, pitch to 90Β°, and a footer that reads
renderer: CesiumGlobe.
On mobile (ai.adverant.nexussynergy) the same three logical engines exist, with the Cesium globe implemented natively (Filament) rather than in WebGL, and a single Esri World Imagery basemap as the shared ground product.
What makes SOI possible is that these three engines sit behind one adapter contract. Every engine normalizes a pointer event into the same InputPoint β canvas-relative x, y, a geodetic lngLat (null when the pointer is off-globe or over no-data), and, if a feature was hit, its entityId, layerId, geometry type, and properties. Every engine exposes the same geodetic CameraState β latitude, longitude, altitude above the ellipsoid, heading, and pitch. The pitch convention is canonical (0Β° = horizon, β90Β° = nadir) and each adapter converts to its engine's local convention internally.
pointer / right-click / long-press
β
βΌ
βββββββββββββββββββββββββββββββ
β RendererAdapter (per engine) β
β β’ unproject(x,y) β lngLat β
β β’ pick(x,y) β PickedFeature|null β
β β’ getCamera() β CameraState (geodetic)β
β β’ sampleElevation(lngLat) β m | null β
βββββββββββββββββββββββββββββββ
β MapLibre2D β MapLibre3D β CesiumGlobe
βΌ βΌ βΌ
ββ identical InputPoint + CameraState shape ββ
The practical consequence: SOI's client capture is written once, against the contract, and works on all three engines and on both platforms. The engine name travels in the envelope so that downstream tiers can reason about, for example, whether a parallax-sensitive vision crop came from a tilted 3D view or a flat 2D one.
6. Basemaps and imagery
The active basemap is one mutually exclusive ground product. The catalogue includes CARTO dark/light, OpenStreetMap raster, OpenTopoMap (topographic, to z17), Esri World Imagery (to z19, Maxar-attributed), Google roadmap/satellite/hybrid (to z20) and Google terrain β the Google products served through a server-side proxy that holds the key and is sovereign-gated: in EU-OFFICIAL posture, zero Google assets are requested. Terrain elevation, when the engine needs it, comes from the active engine's DEM with a fallback to the public Terrarium RGB DEM [11].
The basemap matters to identification for one reason above all: resolution. The ground sample distance at the cursor β metres per pixel β depends on the basemap's maximum zoom and the latitude, and it bounds what any vision tier can possibly resolve. We formalise this in Β§17. A substation is identifiable in Google hybrid at z20 and invisible in OpenTopoMap at z14; SOI must know which it is looking at, and the basemap identity in the envelope tells it.
7. The layer taxonomy
Overlays are typed by a LayerKind that determines both their z-band and, crucially for SOI, how they answer questions about a point. The kinds:
| Kind | Examples | How a point is interrogated |
|---|---|---|
basemap | Esri, Google, CARTO, OSM, OpenTopoMap | Pixel only β vision (T2) or reverse-geocode (T1) |
overlay-raster | landcover, weather (WMS/XYZ) | GetFeatureInfo if WMS (T1); else pixel |
overlay-vector | admin boundaries, airspace | local pick β attributes (T1) |
3d-terrain | raster-DEM extrusion | elevation sample (T1) |
bathymetry | GEBCO, EMODnet (WMS) | GetFeatureInfo β depth (T1) |
aeronautical | FAA charts, S-57 ENC | GetFeatureInfo / attributes (T1) |
geojson | generic live/static overlays | local pick β properties (T1) |
cot-tactical | CoT/TAK symbology | entity resolve (T1) |
tracking-feed | AIS vessels, ADS-B aircraft | entity resolve by MMSI/ICAO (T1) |
orbit, satellite | space objects, taskable sats | catalogue resolve (T1) |
3d-tiles | OGC 3D Tiles / glTF [18,19] | feature pick β batch-table attributes (T1) |
user-drawing | AOI, measurement, buffer | local geometry (T1) |
The source mechanics behind these kinds β raster, pmtiles, vector (MVT), raster-dem, geojson, live-stream, 3d-tiles β determine which interrogation actually works. A vector MVT layer renders natively in MapLibre and supports an instant client-side pick; under Cesium, which has no native MVT, the same data is fetched as GeoJSON for the viewport and picked there. SOI's T1 must therefore branch on both kind and the engine, which Β§11 makes explicit.
The key observation for the thesis: most layer kinds are interrogable for free. A vector pick, an attribute read, an elevation sample, an entity-by-id resolve, and an OGC GetFeatureInfo [12,13] are all deterministic, model-free operations. They are exactly T1. The expensive tiers are needed only when the answer lives in the pixels (a basemap with no feature behind it) or off the map entirely (open-source context about a resolved entity).
8. Live data and moving objects
Three families of live data flow onto the map, and each gives identity a different shape:
- AIS vessels arrive on a feed from the maritime VHF AIS system [20]; each carries an MMSI, navigational status, course, and speed. The MMSI is a globally unique key β given it, T1 can resolve a registry identity with no inference at all.
- ADS-B aircraft arrive on a parallel feed [21]; each carries an ICAO 24-bit address, callsign, altitude, and on-ground flag. The ICAO hex is, likewise, a hard key.
- COP entities arrive fused from
/api/v1/cop/picturewith a stable id, callsign, domain (air/sea/land/sensor/incident), and status. Example fused tracks have appeared in production with tenant-scoped ids.
These are moving objects, which introduces the one genuinely hard part of T1 identification: the click and the track are never at exactly the same place or time. The vessel symbol the operator clicked was drawn from a position report that is already seconds old; the true vessel has moved. Associating a click with the right track is a spaceβtime data-association problem, and we treat it as one in Β§19 using the classical machinery of Kalman prediction [27] and joint probabilistic data association [28].
9. The dispatch and orchestration spine
[EXISTING] SOI does not invent a new execution path; it reuses the one the platform already runs in production. The spine, end to end:
right-click "What's here?" (console, any engine)
β build Context Envelope (client)
βΌ
synergy-console dispatch βββΊ synergy-server /skills/dispatch
β β 5-gate broker:
β β classification Β· residency Β· export Β· spend Β· safety
β βΌ
β shared_workflow_run row (status: queued)
βΌ
UNO /api/v1/dispatch (nexus-orchestrator)
β resolve skill (ros.tool_registry | nexus.bindings)
β enqueue β BullMQ
βΌ
nexus-workflows worker βββΊ execution-engine (tier switch)
β llm_only Β· tool_using Β· chain Β· autonomous Β· plugin_queue Β· host_callback
βΌ
nexus-gateway (provider router: Claude Β· Gemini vision)
β WS events: queued β started β llm_call β tool_call β completed
βΌ
Progress Center / Inspector (result card)
Two properties of this spine are load-bearing for SOI. First, the five-gate broker at /skills/dispatch already enforces classification and data-residency on every dispatch β so SOI's sovereignty guarantee is inherited, not rebuilt. Second, the execution engine already supports a spectrum of execution tiers: host_callback and plugin_queue for deterministic no-model work, llm_only for single inferences, tool_using for ReAct loops, and autonomous/chain for decomposed multi-step work. SOI's four tiers map cleanly onto these, which is the subject of Β§12.
10. The reusable parts inventory
Before proposing anything new, we catalogue what can be reused β because the cheapest design is the one that mostly wires existing components together.
[EXISTING] reusable on the client: the renderer adapter's pick, unproject, getCamera, and elevation sampler (Β§5); the reverse-geocode waterfall; the layer registry and its provenance metadata; the live-feed hooks that already hold AIS/ADS-B/COP/mesh state in memory.
[EXISTING] reusable in the workflow: the GraphRAG hybrid knowledge-base search; a Playwright executor (web fetch and screenshotting); an autoresearch executor; an HTTP executor for arbitrary APIs; an H3 geospatial-index executor [17]; the Gemini image/vision adapter in the gateway.
[PROPOSED] genuinely new: the Context Envelope schema and client compiler (Β§14); the nexus.map.whats_here skill and its tier router (Β§12, Β§22); three thin tool executors that do not yet exist β wms_get_feature_info, reverse_image_search, and registry lookups for vessels/flights/imagery (Β§23); the evidence-fusion and escalation-gate logic (Β§20, Β§21); and the inspector identity card (Β§24).
The ratio is the point. SOI is perhaps one-quarter new code and three-quarters orchestration of parts that already exist and already work.
Part III β SOI Architecture
Everything in this part is [PROPOSED]. We describe the design at the level a senior engineer would need to start building, and defer the equations to Part IV and the code to Part V.
11. The Context Envelope
The Context Envelope is the single artefact that crosses the clientβserver boundary. It is built entirely on the client, at click time, from data already in memory β no network round-trip is needed to assemble it. Its job is to make the cheapest tiers answerable without a model and to give the expensive tiers everything they could want.
It has six sections.
(a) The point. The geodetic coordinate from unproject, the MGRS string, the terrain elevation (with its source: engine-DEM, Terrarium fallback, or null), and a horizontal uncertainty radius that reflects pick precision at the current zoom (Β§17).
(b) The view. The engine (maplibre-2d | maplibre-3d | cesium-globe), the platform (web | mobile), the full CameraState, the zoom level, and the derived ground sample distance (Β§17). This tells a vision tier how much real-world ground one pixel covers and from what obliquity.
(c) The layer stack. An ordered list of every visible layer at the point, top to bottom, each with its LayerKind, source kind, provider, attribution, licence, and β where applicable β the URL template needed to interrogate it (GetFeatureInfo endpoint for WMS, MVT/GeoJSON source for vector). This is the manifest the T1 resolver walks.
(d) The local pick. The result of calling every interrogable layer's picker at the click point: for each hit, the layerId, entityId, geometry type, and the full properties bag. A drill-pick, not a single pick β the operator may have clicked through several stacked features.
(e) The neighbourhood. Features and live tracks within a radius of the click (we default to a small multiple of the pick uncertainty, Β§18), each with its distance and bearing. This is what lets SOI say "the nearest track is a Meshtastic node 600 m east" and what feeds track association (Β§19).
(f) The chip. A square screenshot crop centred on the click, captured from the active engine's canvas, at a resolution and ground footprint recorded in the envelope (Β§17). For vision tiers. Captured but not uploaded unless a tier that needs it is reached and the sovereignty posture permits sending pixels to the configured model.
Context Envelope (built on client, ~one screenful of JSON + one PNG)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β point { lat, lon, mgrs, elevation_m, elev_source, sigma_m } β
β view { engine, platform, camera{lat,lon,alt,hdg,pitch}, β
β zoom, gsd_m_per_px } β
β layers[] { id, kind, sourceKind, provider, attribution, licence, β
β queryUrlTemplate? } β ordered topβbottom β
β pick[] { layerId, entityId, geomType, properties{β¦} } β
β nbr[] { layerId, entityId, kind, dist_m, bearing_deg, β
β vx?, vy?, t_report? } β for track assoc. β
β chip { pngRef, px, groundFootprint_m, centerLat, centerLon } β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
A design rule we enforce in Β§22: the envelope is built lazily but completely. Cheap fields (point, view, layers, pick, neighbourhood) are always computed β they cost microseconds. The chip is captured synchronously into a local blob but only transmitted if a tier needs it, so that an answer resolved at T1 never moves a single pixel off the device.
12. The four tiers, and how they map to the engine
SOI defines four identification tiers. Each maps onto an existing execution tier of the workflow engine (Β§9), which is why no new execution machinery is required β only a new skill and a router.
| SOI tier | Question it answers | Engine execution tier | Model? | Typical latency | External calls |
|---|---|---|---|---|---|
| T1 Deterministic resolve | "Is this a known feature, entity, or address?" | host_callback / plugin_queue | none | 10β300 ms | none (internal + the layer's own source) |
| T2 Single-pass vision | "What does this look like in the imagery?" | llm_only (vision) | one VLM call | 1β4 s | the configured VLM only |
| T3 Tool-using retrieval | "What do internal + open sources say it is?" | tool_using (ReAct) | iterated | 5β30 s | KB, web, registries (gated) |
| T4 Autonomous OSINT | "Investigate and produce a verified dossier." | autonomous / chain | decomposed | 30 sβminutes | broad, gated, streamed |
T1 β Deterministic resolve. Walks the envelope's pick[] and layers[]. For a tracking-feed hit it resolves identity by MMSI/ICAO against the live feed and any internal registry. For an overlay-vector, geojson, cot-tactical, or 3d-tiles hit it reads attributes directly. For a WMS overlay-raster, bathymetry, or aeronautical layer it issues a single GetFeatureInfo against the layer's own server [12]. For bare ground it reverse-geocodes. It returns a belief over candidate identities with provenance. In the common case β the operator clicked a thing the map already knows about β T1 is the whole answer, at zero model cost. This is the design's economic foundation.
T2 β Single-pass vision. Reached when T1's belief is too diffuse (entropy gate, Β§21) and the answer plausibly lives in the pixels. Sends the chip plus a compact textual context (coordinate, GSD, basemap, nearby labels) to a vision-language model [7] and asks a constrained question: what is the primary object at the centre of this image, given it is overhead imagery at this ground resolution near this place? The model returns a typed hypothesis (e.g. electrical_substation, 0.7) and a short rationale. One call, bounded latency.
T3 β Tool-using retrieval. Reached when vision alone is uncertain or the operator wants context, not just a label. A ReAct loop [2] over a tool set: GraphRAG knowledge-base search; web search (gated); reverse-image search on the chip; registry lookups (vessel by MMSI, flight by ICAO/callsign, imagery by location); and GetFeatureInfo on layers T1 skipped. The loop is retrieval-augmented [3]: every claim it makes must cite a tool result. It terminates on a confidence threshold or an iteration cap.
T4 β Autonomous OSINT. Reached on explicit operator request ("Deep research") or when T3 stalls below threshold on a high-value question. Decomposes the question into sub-goals (identity, ownership/operator, status, history, surrounding-area assessment), runs each as its own retrieval, cross-checks across independent sources, and synthesises a dossier with per-claim confidence and a full evidence chain. Progress streams to the inspector as it goes. This is the only tier that can take minutes, and it is never entered silently.
UNO dispatch ββΊ nexus-workflows: nexus.map.whats_here
β
βΌ
βββββββββββββ belief B0
envelope ββΊ β T1 β ββββββββββββββββΊ gate?
β resolve β β stop if H(B0) β€ Ο1
βββββββββββββ β or no pixel/context need
β escalate βΌ
βΌ RESULT
βββββββββββββ belief B1
β T2 β ββββββββββββββββΊ gate? stop if VoI(T3) < cost(T3)
β vision β
βββββββββββββ
β escalate
βΌ
βββββββββββββ belief B2
β T3 β ββββββββββββββββΊ gate? stop if conf β₯ Ο3
β retrieve β
βββββββββββββ
β escalate (or operator "Deep research")
βΌ
βββββββββββββ dossier
β T4 β ββββββββββββββββΊ RESULT (streamed)
β OSINT β
βββββββββββββ
13. Escalation as a decision
The arrows labelled "gate?" above are the heart of the design. A naive system would either always run the cheapest tier (and fail on hard cases) or always run the deepest (and burn cost and seconds on trivial ones). SOI instead asks, after each tier produces a belief , a single decision-theoretic question:
Is the expected gain in answer quality from running tier greater than its expected cost?
This is value of computation in the sense of Russell and Wefald [26] and value of information in the sense of Howard [24]. We make it concrete in Β§21, where the gain is the expected reduction in the Bayes risk of acting on a wrong identity, the cost is a latency-and-spend penalty, and the gate fires only when gain exceeds cost. Two consequences worth stating up front:
- The path is data-dependent. Clicking a labelled AIS vessel stops at T1. Clicking an unlabelled structure in z20 imagery may go T1βT2 and stop. Clicking a suspicious dark vessel and pressing "Deep research" runs T1βT4. There is no fixed pipeline length.
- The operator can override the gate in both directions. "Deep research" forces escalation to T4; a "good enough" acceptance halts it. The gate is a default, not a cage.
14. The result: an Identity Card
Every tier produces the same shaped result β an Identity Card β so the inspector renders T1 and T4 results with the same component, differing only in depth. A card carries:
- Identity: the top hypothesis and its type, plus runners-up with their beliefs.
- Confidence: a single calibrated number in [0, 1] (Β§20), with a textual band (e.g. likely, uncertain).
- Geometry & context: coordinate, MGRS, elevation, estimated extent, and the neighbourhood summary.
- Evidence chain: an ordered list of what each tier contributed and which source backed it β every external claim is a link.
- Provenance & posture: which layers and tiers were used, and whether external sources were consulted or suppressed by sovereignty posture.
- Actions: add to COP, annotate on map, copy coordinate, and β when the gate stopped early β Deep research to force the next tier.
Crucially, the card lands in the inspector, not in a floating panel over the map. This is not an aesthetic preference; it is a hard platform UX law learned the expensive way (floating panels ate map taps and occluded each other), and SOI obeys it. The full interaction design is Part VI.
Part IV β Mathematical Foundations
This part derives the quantities the envelope carries and the tiers consume. Notation is defined at first use. We use for latitude, for longitude (radians unless noted), for zoom, and bold for vectors.
15. From a screen pixel to a point on the Earth
Identification starts with turning a click at canvas pixel $(u, v)$ into a coordinate. The two engine families do this differently, and SOI must record which, because the uncertainty differs.
MapLibre (2D and 3D). The map maintains an affine-plus-perspective transform from geographic Mercator coordinates to clip space. Unprojection inverts it. In the flat 2D case the inverse is exact and closed-form; the screen point maps to a unique Mercator coordinate , then to geographic via the inverse Mercator (Β§16). In the 3D (tilted) case the screen ray must be intersected with the terrain mesh; MapLibre solves this against its loaded DEM and returns the first hit, which is what its unproject/queryTerrainElevation expose.
Cesium Globe. The camera defines a ray from eye position (ECEF) through the pixel's world direction . The picked point is the nearest intersection of this ray with the WGS-84 ellipsoid (or, with terrain enabled, the terrain). The ellipsoid is
Substituting the ray and scaling each axis by the ellipsoid radii reduces intersection to a scalar quadratic with
The physical hit exists iff the discriminant ; the near root gives the point, converted from ECEF to geodetic by the standard Bowring iteration. When the click missed the globe (sky), and the envelope's lngLat is null β a case SOI must handle, not crash on.
16. Web Mercator and the projection round-trip
Raster tiles, WMS bounding boxes, and MapLibre's internal plane all live in Web Mercator (EPSG:3857). The forward projection of geographic to normalized Mercator and back is
The Mercator latitude limit is , beyond which the projection is undefined β relevant because polar clicks on the globe have no Mercator tile and SOI must route them to the ellipsoidal path of Β§15, not the tile path.
UTM and the MGRS string. The envelope reports the click in MGRS [14], which the operator reads and which is itself a coarse identity anchor (the grid square narrows the candidate set). MGRS is a textual encoding of UTM, and UTM is the transverse-Mercator projection of a 6Β° longitude zone. The zone number is Z = \lfloor (\lambda_\deg + 180)/6 \rfloor + 1. Within the zone, the forward projection to easting and northing uses the standard Karney/KrΓΌger series; to leading order in the third flattening $n = f/(2-f)$,
with the UTM scale factor, m the false easting, the false northing (0 N / 10,000,000 m S), the prime-vertical radius, , , , and the meridian-arc length. The MGRS string then concatenates: the zone , the latitude band letter (8Β° bands CβX), the 100 km square's two-letter column/row code (derived from and under the standard lettering scheme), and the easting/northing remainders truncated to the requested precision. The cover screenshot's 32TMR 32145 47577 decodes as zone 32, band T, square MR, and a 10 m-precision offset β exactly the granularity SOI carries in the card's geometry block (Β§14).
17. Ground sample distance and the chip
This is the single most important number for the vision tiers, because it bounds what can be seen. For the standard 256-pixel slippy-tile scheme [9,10], the ground resolution in metres per pixel at latitude and zoom is
where the constant is the equatorial circumference m divided by 256. At the equator, $z=20$ gives m/px; at (the example in the cover screenshot), m/px β coarse enough that a 40 m structure spans only ~12 px, which is exactly why a z15 click may need T3 context where a z20 click resolves at T2.
The chip is a pixel crop centred on the click. Its ground footprint β the real-world side length the model is actually looking at β is
with the term correcting for camera obliquity in 3D/globe views (it is $1$ for flat 2D). We record in the envelope so the vision tier is told, in metres, how large the scene is β without that, "what is this object" is ambiguous between a shed and a stadium. The chip side is chosen so the footprint brackets a target object scale (we default m, several building-widths): with margin , clamped to $[256, 1024]$.
18. Terrain elevation and pick uncertainty
Terrarium decode. When the engine DEM does not answer, SOI decodes the public Terrarium RGB tile [11]. For a pixel with 8-bit channels $(R,G,B)$ the elevation in metres is
The $-32768$ offset lets the unsigned encoding represent the ocean floor; the $B/256$ term gives sub-metre fractional precision. SOI bilinearly interpolates across the four texel neighbours of the exact click to avoid quantisation stair-steps.
Horizontal pick uncertainty. A click is not a point; it is a finger or cursor with a footprint, projected onto ground that may be tilted. We model the horizontal uncertainty as
where is the input radius in pixels (a few for a mouse, ~20 for a fingertip) and absorbs DEM and camera-pose error. This is what sets the neighbourhood radius and the track-association gate below β it is the reason SOI never claims more spatial precision than the geometry supports.
19. The neighbourhood and associating a click with a moving track
Distance and bearing. For nearby fixed features, geodesic distance uses the haversine formula [16] for speed,
with Vincenty's inverse solution [15] substituted when sub-metre ellipsoidal accuracy is required. Initial bearing is .
The moving-target problem. A clicked vessel symbol was drawn from a position report at time ; by click time the vessel has moved. To associate the click with the correct track we predict each candidate track forward to and test the click against the prediction. Under a constant-velocity model the predicted state and covariance follow the Kalman time update [27]:
with state in a local ENU frame and process noise . The compatibility of the click (position , covariance ) with track is the squared Mahalanobis distance of the innovation :
A track enters the candidate gate iff , with a chi-square threshold (2 d.o.f.; for 99%). For completeness, once a click is associated to track it can also sharpen that track's state through the Kalman measurement update [27] β useful when the operator's click is itself treated as a (low-weight) position observation:
though SOI's default is to leave the authoritative track untouched and use the association only for identity. When several tracks gate β a harbour full of vessels β we resolve the ambiguity with the joint probabilistic data association weight [28], the posterior that the click belongs to track :
where encodes the prior that the click hit no track (bare ground or an unmapped object). The become the prior over track-identity hypotheses that T1 hands to the fusion of Β§20.
20. Fusing heterogeneous evidence into one belief
Each tier emits evidence of a different kind: T1 a hard registry match or an attribute table; T2 a softmax over visual classes; T3 retrieved documents with relevance scores; T4 cross-checked claims. We need one belief over the candidate identity set , where is the explicit "unknown / none of the above" hypothesis that keeps the system honest.
Bayesian core. Treating tier outputs as conditionally independent likelihoods given the true identity, the posterior after observing evidence is
DempsterβShafer where independence fails. Tier outputs are not always independent (T3's web result may echo T2's guess), and they carry differing reliability. We therefore combine them as belief mass functions under Dempster's rule [22,23]. Each tier contributes a mass over subsets of , discounted by a reliability factor (a hard registry hit has ; a low-relevance web snippet has small ):
Two discounted masses combine by
where is the conflict mass; a large is itself a signal β sources disagree β and SOI surfaces it rather than hiding it. The decision reads off the hypothesis of maximum pignistic probability .
Calibration. A raw VLM softmax is overconfident [30]. Before any score enters (13)β(15) we calibrate it with a single learned temperature (a one-parameter Platt variant [29]):
with fit on a held-out validation set by minimising negative log-likelihood. The reported card confidence is the calibrated of the top hypothesis β a number we intend to mean what it says (Β§26 evaluates this with a reliability diagram and expected calibration error).
21. The escalation gate
After tier yields belief (a distribution over ), the gate decides whether to run tier . We combine two classical ideas.
Uncertainty trigger. Compute the Shannon entropy [31] of the current belief,
If (the answer is already sharp) and the top hypothesis is not , stop. High entropy alone, however, does not justify escalation β the next tier must be worth it.
Value-of-information test. Let acting on identity when the truth is incur loss (a misidentification cost; mistaking a tanker for a tug is expensive, two warehouse types cheap). The Bayes risk of stopping now is
Running tier yields a (random) refined belief ; its expected value of computation is the expected risk reduction minus the tier's cost [24,26]:
where converts the tier's expected latency and spend into the same loss units. Escalate iff . The expectation over is taken under a lightweight predictive model of the next tier's discriminating power (estimated offline per tier and per layer-kind, Β§26) β we do not need to run the tier to estimate its value, which is the whole point of the gate.
This yields the data-dependent behaviour promised in Β§13: when already concentrates on one identity, is near zero, no tier can reduce it by more than its cost, and the gate halts. When is diffuse over high-loss confusions, even an expensive tier clears the bar. The operator's "Deep research" button simply sets for the remaining tiers; an "accept" sets the gate closed.
22. Complexity and budget
T1 is $O(L + N)$ in the number of visible layers and neighbourhood items , plus at most one network call per WMS layer β all bounded and parallelizable. T2 is one model call, $O(1)$. T3 is for ReAct iterations, capped. T4 is for sub-goals. The gate guarantees that the expected cost of an identification is dominated by T1, because the escalation probability falls sharply with each tier on the click distribution a real operator generates (most clicks land on known things). We make this falsifiable in Β§26 by reporting the realised tier-escalation histogram and the cost-per-identification distribution, not a single mean.
Part V β Reference Implementation
Pseudocode for every step, in execution order: client capture, dispatch, the workflow router, each tier, fusion and gate, the tool executors, and the skill-registry shape. The style is language-neutral; the client steps are TypeScript-shaped (matching the console), the workflow steps Node-shaped (matching nexus-workflows). Equation references point back to Part IV. All of this is [PROPOSED].
23. Client: compiling the Context Envelope
The compiler runs synchronously inside the existing context-menu handler. Note the laziness rule from Β§11: the chip is captured to a local blob but the bytes are not sent until a tier asks.
function captureContextEnvelope(click, ctx): # ctx = active RendererAdapter
# ---- (a) the point -------------------------------------------------
p = ctx.unproject(click.u, click.v) # Β§15; null if off-globe
if p == null: return EnvelopeWithNoCoordinate(view=captureView(ctx))
mgrs = toMGRS(p.lat, p.lon) # Β§16/UTMβMGRS [14]
elev, elevSrc = sampleElevation(ctx, p) # engine DEM β Terrarium (7)
sigma = pickUncertainty(ctx.zoom, p.lat, ctx.camera.pitch, click.radiusPx) # (8)
# ---- (b) the view --------------------------------------------------
view = { engine: ctx.engine, platform: ctx.platform, camera: ctx.getCamera(),
zoom: ctx.zoom, gsd: GSD(p.lat, ctx.zoom) } # (5)
# ---- (c) the layer stack (ordered topβbottom) ----------------------
layers = []
for layer in ctx.visibleLayersAt(p) ordered topβbottom:
layers.push({ id, kind, sourceKind, provider, attribution, licence,
queryUrlTemplate: wmsQueryUrl(layer) if layer.isWMS else null })
# ---- (d) the local pick (drill, not single) ------------------------
pick = []
for layer in interrogable(layers):
for feat in ctx.drillPick(click.u, click.v, layer.id): # Β§5, Β§7
pick.push({ layerId: layer.id, entityId: feat.id,
geomType: feat.geomType, properties: feat.properties })
# ---- (e) the neighbourhood (fixed feats + live tracks) -------------
r = neighbourhoodRadius(sigma) # Β§18
nbr = []
for item in ctx.featuresWithin(p, r) βͺ liveTracksWithin(p, r): # AIS/ADSB/COP/mesh
nbr.push({ layerId, entityId, kind, dist: haversine(p, item), # (9)
bearing: bearing(p, item),
vx: item.vx?, vy: item.vy?, t_report: item.t? }) # for (10)
# ---- (f) the chip (captured, NOT yet uploaded) ---------------------
W = chipSidePx(view.gsd, view.camera.pitch) # Β§17
chip = { blob: ctx.snapshotCrop(click.u, click.v, W), # local blob only
px: W, groundFootprint: W*view.gsd/cos(view.camera.pitch), # (6)
centerLat: p.lat, centerLon: p.lon }
return { point:{lat:p.lat, lon:p.lon, mgrs, elev, elevSrc, sigma},
view, layers, pick, nbr, chip }
The mobile compiler is the same function β ctx is the native RendererAdapter (Filament globe or MapLibre-Android) instead of the WebGL one, and snapshotCrop reads the TextureView rather than the WebGL canvas. The contract (Β§5) is what lets one listing serve both platforms.
24. Client: dispatch and result handling
async function whatsHere(click, ctx):
env = captureContextEnvelope(click, ctx)
if env.point == null: # clicked the sky
return inspector.show(noCoordinateCard())
# cheap fields go up immediately; chip stays local until a tier requests it.
handle = await dispatchSkill({
jobType: "identify-map-object", skill: "nexus.map.whats_here",
data: stripChipBlob(env), # chip referenced by id, not inlined
chipUploader: () => uploadChip(env.chip.blob), # callback the gateway may invoke
idempotencyKey: hash(env.point, env.view.engine, round(now, 5s)) })
inspector.openAndFocus(handle.runId) # auto-reveal law (Β§28)
for await (event of subscribe(handle.runId)): # WS stream
inspector.renderTierProgress(event) # Β§29 progress stream
if event.type == "result":
inspector.renderIdentityCard(event.card) # Β§27
dispatchSkill is the existing consoleβsynergy-server path; SOI adds only the new jobType/skill and the chipUploader callback. The idempotency key folds the coordinate, engine, and a 5-second time bucket so a double-click does not start two investigations.
25. Workflow: the tier router
This is the new skill body, executed by the workflow engine after the broker admits the dispatch. It realises the gate of Β§21.
async function nexus_map_whats_here(env, classification):
Ξ© = candidateUniverse() # includes the explicit ΞΈ = "unknown"
belief = uniformOver(Ξ©)
trace = [] # evidence chain for the card
# ---------- T1: deterministic resolve (no model) -------------------
e1 = await t1Resolve(env, classification) # Β§26.1
belief = fuse(belief, e1); trace += e1
emit("tier:done", {tier:1, belief})
if not shouldEscalate(belief, nextTier=2, env): return card(belief, trace, env)
# ---------- T2: single-pass vision --------------------------------
if classification.allowsModel("vision") and env.hasChip:
e2 = await t2Vision(env) # Β§26.2 β uploads chip here
belief = fuse(belief, e2); trace += e2
emit("tier:done", {tier:2, belief})
if not shouldEscalate(belief, nextTier=3, env): return card(belief, trace, env)
# ---------- T3: tool-using retrieval (ReAct) ----------------------
e3 = await t3Retrieve(env, belief, classification) # Β§26.3
belief = fuse(belief, e3); trace += e3
emit("tier:done", {tier:3, belief})
if not shouldEscalate(belief, nextTier=4, env): return card(belief, trace, env)
# ---------- T4: autonomous OSINT (decomposed, streamed) -----------
dossier = await t4Osint(env, belief, classification, onProgress=emitStream) # Β§26.4
return dossierCard(dossier, trace, env)
function shouldEscalate(belief, nextTier, env):
if H(belief) β€ Ο[nextTier-1] and argmax(belief) β ΞΈ: return false # (17)
return VoC(nextTier, belief, env) > 0 # (19)
26. Workflow: the four tiers
26.1 T1 β deterministic resolve
async function t1Resolve(env, cls):
ev = []
# (1) live-track association for tracking-feed picks / neighbours
for cand in associateTracks(env): # Β§19, eqs (10)-(12)
ident = resolveByKey(cand.mmsi or cand.icao or cand.copId) # registry/feed
ev.push(evidence(ident, mass=cand.beta, alpha=0.98, src=ident.source))
# (2) vector / geojson / cot / 3d-tiles attribute reads
for hit in env.pick where hit.kind in {vector, geojson, cot, 3d-tiles}:
ident = classifyFromAttributes(hit.properties) # rules + type map
ev.push(evidence(ident, mass=hit.confidence, alpha=0.95, src=hit.layerId))
# (3) OGC GetFeatureInfo for WMS layers that carry a query template [12]
for layer in env.layers where layer.queryUrlTemplate != null and cls.allows(layer):
info = await wmsGetFeatureInfo(layer, env.point, env.view) # Β§26.5
ev.push(evidence(fromFeatureInfo(info), mass=info.conf, alpha=0.9, src=layer.id))
# (4) reverse-geocode the bare coordinate (always cheap, internal-first)
geo = await reverseGeocode(env.point) # EXISTING waterfall
ev.push(evidence(placeHypotheses(geo), mass=geo.conf, alpha=0.6, src=geo.source))
return ev
26.2 T2 β single-pass vision
async function t2Vision(env):
chipUrl = await env.chipUploader() # bytes leave device ONLY now
prompt = visionPrompt(env.point, env.view.gsd, env.chip.groundFootprint,
basemap=env.layers.bottom(), nearbyLabels=labels(env.nbr))
out = await gateway.call({ provider:"gemini", modality:"image", # [7]
image:chipUrl, text:prompt,
responseFormat: VISION_SCHEMA }) # typed
logits = out.classLogits
p_cal = temperatureSoftmax(logits, T=Tfit) # (16)
return [ evidence(cls, mass=p_cal[cls], alpha=visionReliability(env.view.gsd),
src="vlm", rationale=out.rationale) for cls in topK(p_cal) ]
visionReliability ties to GSD (5): a z20 chip is trusted far more than a z14 one, because at 3 m/px the model is guessing from blobs. This is the mathematics of Β§17 entering the fusion directly.
26.3 T3 β tool-using retrieval (ReAct)
async function t3Retrieve(env, prior, cls):
tools = [ graphragSearch, webSearch(cls), reverseImageSearch(cls),
vesselRegistry(cls), flightRegistry(cls), imageryLookup(cls),
wmsGetFeatureInfo ] # cls disables gated tools
state = ReActState(goal="identify + contextualise", prior, env)
for i in 1..MAX_ITERS: # [2]
thought, action = llm.plan(state) # reason about next tool
if action == STOP: break
obs = await tools[action.name](action.args)
state.observe(thought, action, obs) # every claim cites obs [3]
if confidence(state.belief) β₯ Ο3: break
return state.evidenceWithCitations()
26.4 T4 β autonomous OSINT
async function t4Osint(env, prior, cls, onProgress):
goals = decompose("identify; operator/owner; status; history; area-assessment")
findings = []
for g in goals: # each its own retrieval
r = await t3Retrieve(env, prior, cls).scopedTo(g)
findings.push(crossCheck(r, minIndependentSources=2)) # corroboration gate
onProgress(partialDossier(findings)) # stream to inspector
return synthesize(findings, withPerClaimConfidence=true, withEvidenceChain=true)
26.5 Tool executors
The reusable ones (graphragSearch, webSearch via Playwright/HTTP, imageryLookup against the operator's Copernicus/Sentinel keys, H3 spatial joins) already exist in the workflow's executor set. Three are new and thin:
async function wmsGetFeatureInfo(layer, point, view): # OGC WMS 1.3.0 [12]
bbox = mercatorBBoxAround(point, view.zoom) # (3),(5)
px = pixelOf(point, bbox, TILE=256)
url = layer.queryUrlTemplate
.set(REQUEST="GetFeatureInfo", VERSION="1.3.0",
CRS="EPSG:3857", BBOX=bbox, WIDTH=256, HEIGHT=256,
I=px.x, J=px.y, QUERY_LAYERS=layer.name,
INFO_FORMAT="application/json")
return parseFeatureInfo(await httpGet(url)) # depth, class, attributes
async function reverseImageSearch(chipUrl, cls): # gated by classification
if not cls.allowsExternalImages(): return EMPTY_GATED
emb = await embed(chipUrl) # CLIP-space vector [1]
near = await vectorIndex.knn(emb, k=12) # cosine similarity
return [ {label: n.label, score: cosine(emb, n.vec), src: n.url} for n in near ]
async function vesselRegistry(mmsi, cls): # AIS identity enrichment [20]
if not cls.allowsExternal(): return INTERNAL_ONLY(mmsi)
return await httpGet(registryEndpoint, {mmsi}) # name, type, flag, dims
reverseImageSearch is where "find similar items in the picture" becomes concrete: the chip is embedded into a CLIP-style space [1] and matched by cosine similarity against an index of labelled overhead exemplars (built from public detection corpora such as xView [32] and DOTA [33]). High-similarity neighbours both propose a label and back it with example imagery in the evidence chain.
27. Fusion, gate, and card
function fuse(belief, evidenceList): # Β§20
m = beliefToMass(belief)
for e in evidenceList:
m = dempsterCombine(m, discount(e.mass, e.alpha)) # (14),(15)
return pignistic(m) # BetP β distribution over Ξ©
function VoC(nextTier, belief, env): # Β§21, eq (19)
R_now = bayesRisk(belief) # (18)
R_next = expectedRiskAfter(nextTier, belief, env) # predictive model of tier power
return R_now - R_next - cost(nextTier, env) # latency+spend in loss units
function card(belief, trace, env):
top = argmaxBetP(belief)
return { identity: top, alternatives: rankedRunnersUp(belief),
confidence: calibratedConfidence(belief), # (16)
geometry: { coord: env.point, mgrs, elev: env.point.elev,
extent: estimateExtent(trace), neighbourhood: env.nbr },
evidenceChain: trace.withSources(),
posture: { engine: env.view.engine, tiersUsed: trace.tiers,
externalUsed: trace.anyExternal, classification: env.cls },
actions: ["add-to-cop","annotate","copy-coord",
canEscalate(belief) ? "deep-research" : null] }
28. The skill-registry row
SOI is one new skill. Registering it is one migration row in ros.tool_registry plus its execution config β no new execution machinery. Schematically:
SQL21 linesINSERT INTO ros.tool_registry (name, job_type, display_name, description, execution_type_skill, execution_config_skill, system_prompt, tools, enabled, risk_level, data_residency, max_tokens, temperature, timeout_ms, cost_tier, billing_scope, routing_hint) VALUES ('whats-here', 'identify-map-object', 'What''s Here? (SOI)', 'Tier-escalated spatial object identification for the tactical map.', 'tool_using', -- router runs T1 deterministically, -- escalates to llm_only/tool_using/autonomous '{ "router":"soi.v1", "tiers":{ "t1":"host_callback", "t2":"llm_only", "t3":"tool_using", "t4":"autonomous" }, "preferredProvider":"gemini", "capabilityProfile":{"needsVision":true}, "gate":{ "tau":[0.4,0.6,0.7], "voiCostUnits":"latency+spend" } }', 'You identify what a user clicked on a tactical map. Prefer deterministic evidence; escalate only when the value of computation is positive; never fabricate; always cite; respect classification posture.', '[ "wms_get_feature_info","reverse_image_search","vessel_registry", "flight_registry","imagery_lookup","graphrag_search","web_search" ]', true, 'high', 'eu', 4096, 0.2, 120000, 'pro', 'tenant', 'soi');
Two notes. The execution_type_skill is tool_using because the router itself is a tool-using body that internally dispatches the per-tier execution types named in execution_config_skill.tiers. And data_residency='eu' plus the gateway's existing classification handling are what make the sovereignty posture (Β§30) enforceable at the registry level, not just in code comments.
Part VI β Interaction Design
The best identification engine is worthless if the answer arrives where it cannot be read or in a form that cannot be trusted. This part specifies the surfaces. The wireframes below are also the build specs for the rendered mockups that accompany the paper; where a high-fidelity product render exists it is referenced as a figure.
29. The entry point: the context menu, mostly unchanged
SOI deliberately does not add a button. The gesture already exists, and adding UI to a map is a tax on the map. The only change to the context menu is that What's here? becomes the live entry to SOI, and on a known entity it reads What is this? (full briefing) β the wording the handler already uses. The menu stays exactly where it is, anchored at the click, dismissing on outside-tap, because the platform's UX law is unambiguous: nothing floats over the map that can eat a map tap or occlude another panel.
β 45.5784N, 8.1301E
β 355 m Β· 1165 ft
ββββββββββββββββββββββββββ
π Drop pin
βΆ β What's here? β entry to SOI (this paper)
β¦ Measure from here
⬑ Create AOI
β Center here
π§ Open Street View here β hidden in EU-OFFICIAL (sovereign gate)
ββββββββββββββββββββββββββ
⬑ Pair Meshtastic device
Figure 1 (design mockup): the "What's here?" context menu open over the Trino scene, Option B highlighted as the SOI entry point β a real MapLibre surface with Soverant chrome and EU-OFFICIAL posture. The ASCII wireframe above gives the layout; the fully rendered product surface is reproduced in the print-PDF edition of this paper.
30. The result surface: the Inspector Identity Card
The answer lands in the inspector dock, which auto-reveals and focuses on the new card the moment the run starts β the same auto-reveal-on-select law that governs entity selection. The card is one component for all four tiers; depth grows, layout does not. A resolved-at-T1 card and a T4 dossier differ in how many evidence rows they carry, not in shape.
ββ INSPECTOR ββββββββββββββββββββββββββββββββββββββββββββββ
β WHAT'S HERE β live βΈ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Trino Electrical Substation β
β type: infrastructure Β· power confidence ββββΈ β
β β°β°β°β°β°β°β°β±β±β± 0.78 likely β
β β
β 45.5784 N, 8.1301 E Β· 32TMR 32145 47577 β
β elevation β 355 m Β· 1165 ft extent β 40 Γ 25 m β
β nearest track: mesh node MESHLOCAL-3, 600 m E β
β surrounding: agricultural parcels, forest to N β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β EVIDENCE β
β T1 vector pick Β· landuse=industrial [layer] β
β T2 vision Β· "substation" 0.71 (z15, 3.3 m/px) [chip] β
β T3 KB Β· Trino grid node dossier [source] β
β T3 web Β· operator: Terna S.p.A. [source] β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β alternatives: industrial yard 0.12 Β· unknown 0.06 β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [ + Add to COP ] [ β Annotate ] [ β§ Copy ] [ π¬ Deep ]β
β posture: EU-OFFICIAL Β· external sources: 1 (gated ok) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Five design commitments are encoded in that layout.
- Confidence is shown, banded, and honest. The number is the calibrated of the top hypothesis (Β§20); the band word is derived from fixed thresholds; the explicit unknown alternative is always listed so a low-confidence answer reads as low-confidence, not as a guess dressed as fact.
- Every external claim is a link. The evidence rows are the trace from Β§27, each ending in a
[source]/[chip]/[layer]affordance that opens the backing artefact. No claim without provenance. - The geometry is precise but not overclaimed. Coordinate and MGRS to the precision the pick supports (Β§18); elevation with its honest "β" when no DEM answered; extent labelled as an estimate.
- Escalation is in the operator's hands. When the gate stopped early, the
π¬ Deepaction forces the next tier (sets $c=0$ in Β§21). When it ran to T4, the action is absent. - Posture is always legible. The footer states the classification and whether any external source was consulted β so an operator in EU-OFFICIAL can see at a glance that the answer used internal evidence only.
Figure 2 (design mockup): the Identity Card in the inspector dock at T3 depth β calibrated confidence, geometry, the T1βT3 evidence chain with source links, alternatives, actions, and the EU-OFFICIAL posture footer. The ASCII wireframe above gives the layout; the fully rendered product surface is reproduced in the print-PDF edition.
31. The waiting surface: a tier-progress stream
Identification is not instant above T1, and an opaque spinner is a trust-killer. SOI streams the escalation itself, so the operator watches the system reason and can stop it. The stream is the WS event sequence from Β§24, rendered as a compact ladder in the same card region the result will fill.
WHAT'S HERE β workingβ¦
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β T1 resolve no exact match Β· belief diffuse 18 ms
β T2 vision "substation" 0.71 Β· uncertain 2.3 s
⸠T3 retrieve searching KB + web⦠ⷠ4.1 s
Β· graphrag: Trino grid node β
Β· web: operator lookupβ¦ β·
β T4 deep (not started) [ Stop ] [ π¬ Force ]
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
external sources: enabled (EU-OFFICIAL β gated allowlist)
The stream does three jobs: it makes latency legible (the operator sees why a hard click takes seconds), it makes escalation consensual (Stop/Force are always present), and it makes the sovereignty posture visible at the moment external calls would happen β if posture forbids the web, the T3 row says so instead of silently degrading.
Figure 3 (design mockup): the tier-progress stream mid-escalation with T3 active β each tier's contribution, elapsed time, Stop/Force controls, and the always-visible external-sources posture line. The ASCII wireframe above gives the layout; the fully rendered product surface is reproduced in the print-PDF edition.
32. Mobile parity
On the Pixel field unit the gesture is a long-press, not a right-click, and the result dock is a bottom sheet rather than a side inspector, but the model is identical: captureContextEnvelope runs against the native RendererAdapter (Β§23), the same nexus.map.whats_here skill is dispatched, and the same Identity Card renders. Two field-specific affordances are added: the card is collapsible to a single confidence-banded line for glanceability while moving, and a "share to mesh" action lets an operator push a resolved identity to nearby Meshtastic peers β turning one operator's identification into shared situational awareness across a GPS-denied team.
βββββββββββββββββββββββββββββββββ
β βββββ (drag handle) β
β WHAT'S HERE 0.78 likely β β collapsed: one glanceable line
β Trino Electrical Substation β
β tap to expand Β· [π‘ share mesh]β
βββββββββββββββββββββββββββββββββ
33. Sovereignty as a first-class UX state, not an error
The most subtle interaction requirement is that suppressed capability must look like a deliberate posture, not a broken feature. When classification forbids external calls, the card does not show empty web rows or a failed lookup; it shows that T3/T4 external tools were gated by posture, with the internal-only answer it could produce, and an explicit note. This mirrors the platform's existing honesty convention (meta.dataSource: live | partial | pending) and its rule against dead buttons β Street View is hidden, not greyed, in EU-OFFICIAL; SOI's external tiers are labelled gated, not silently failing. The operator is never left guessing whether the system couldn't or wouldn't.
Part VII β External Knowledge, Related Work, Evaluation & Roadmap
34. Where the knowledge comes from, and how it is gated
T3 and T4 reach beyond the platform. Every source is classified as internal (always available) or external (gated by the five-gate broker's classification and residency checks), and the gate is applied per-call, not per-session.
Internal sources (always on). The GraphRAG knowledge base (hybrid dense+sparse retrieval over the org's documents and prior dossiers); the live COP/AIS/ADS-B/mesh feeds; the reverse-geocode waterfall; the H3 spatial index [17] for "what else is in this cell"; and any layer's own GetFeatureInfo/GetFeature endpoint [12,13], which β though it leaves the cluster β is the layer's declared data source and is treated as part of the map, not as third-party OSINT.
External sources (gated). General web search; OpenStreetMap Nominatim and Overpass for crowd-mapped features; Wikidata/Wikipedia for entity facts; vessel registries keyed by MMSI [20] and flight history keyed by ICAO/callsign [21]; satellite-imagery archives β the operator already holds Copernicus/Sentinel credentials (CDS, CDSE, CMEMS), so SOI can pull recent or historical scenes for change detection; and reverse-image search over the chip (Β§26.5).
The gating rule is simple and auditable: in EU-OFFICIAL posture the external set collapses to an allowlist (typically the EU-hosted Copernicus archive and the layer's own OGC endpoints), and the card's footer records exactly which external calls were made. Nothing is exfiltrated silently; the broker's audit ledger already hash-chains every dispatch, so an identification's external footprint is forensically reconstructable after the fact.
35. Related work
SOI sits at the confluence of four literatures; we position it against each.
Feature interrogation in GIS and web maps. The desktop Identify tool and the OGC GetFeatureInfo operation of the Web Map Service [12] (and the richer GetFeature of WFS [13]) are the canonical "what is this feature" mechanisms, but they answer only for queryable vector/coverage layers with a cooperating server. Consumer "what's here" (a reverse-geocode to an address) answers only for addressable ground. SOI generalises both: it uses GetFeatureInfo and reverse-geocoding as its T1, but does not stop where they stop β when the answer is in pixels or in open sources, it escalates.
Visual recognition from imagery. Identifying objects in overhead imagery is a mature computer-vision problem with dedicated benchmarks β xView [32] and DOTA [33] for overhead object detection, with classes and oriented boxes specific to the aerial domain. Open-vocabulary and language-grounded recognition β CLIP [1], GLIP [8], promptable segmentation with SAM [6], and visual question answering [5] β let a model answer free-form "what is this" rather than choosing from a fixed label set. SOI's T2 uses a general multimodal model [7] for breadth and treats overhead-specific detectors and CLIP-space exemplar matching (built from [32,33]) as the reliability anchor in Β§26.5. We are not advancing the recognition models; we are situating them with GSD-aware context (Β§17) so their output is interpretable.
Agentic retrieval and tool use. The ReAct pattern [2] interleaves reasoning and tool calls; Toolformer [4] shows models can learn to call APIs; retrieval-augmented generation [3] grounds outputs in fetched evidence. SOI's T3/T4 are direct applications: a ReAct loop whose every claim is RAG-cited, decomposed for T4. Our contribution here is not the loop but the gate in front of it β deciding whether the loop is worth running at all.
Estimation, evidence, and metareasoning. Associating a click with a moving track is classical target tracking: the Kalman filter [27] for prediction and joint probabilistic data association [28] for the many-targets-in-clutter case. Fusing disagreeing, differently-reliable sources into one belief is DempsterβShafer evidence theory [22,23], with calibration [29,30] to make the numbers mean something. Deciding when to stop computing is value of information [24], anytime computation [25], and the value of computation in metareasoning [26]. SOI's novelty is the synthesis: to our knowledge no prior system applies a value-of-computation escalation gate to a perception/identification pipeline that spans deterministic map queries, overhead vision, and OSINT under one sovereignty-gated orchestrator.
36. Evaluation protocol (falsifiable, not yet run)
We have not run these experiments β SOI is a design. We specify the protocol so the claims are falsifiable and so an implementer knows exactly what "working" means. [PROPOSED]
Datasets. (i) A click corpus: operator right-clicks logged in real sessions (coordinate, engine, zoom, layer stack, and an analyst-supplied ground-truth identity), stratified by layer kind and zoom. (ii) For the vision tier specifically, held-out crops from xView [32] and DOTA [33] with known labels, rendered at the GSDs the console actually serves. (iii) A moving-track set: AIS/ADS-B replays with known association ground truth, to test Β§19.
Metrics.
- Identification accuracy: top-1 and top-3 accuracy of the final card identity against analyst ground truth, broken out by tier reached and by layer kind.
- Calibration: expected calibration error (ECE) and a reliability diagram of the card confidence against empirical correctness β the test that the Β§20 calibration actually holds.
- Association accuracy: fraction of moving-track clicks assigned to the correct track (Β§19), versus a nearest-symbol baseline.
- Escalation economy: the realised tier histogram (what fraction of clicks stop at T1/T2/T3/T4) and the full distribution (not just the mean) of latency and model spend per identification. The thesis predicts a heavy T1 mode.
- Abstention quality: how often the system correctly returns unknown () rather than a wrong identity β the honesty metric.
Baselines. (B1) current behaviour (reverse-geocode / entity-brief only); (B2) always-T2 (vision on every click); (B3) always-T4 (deep research on every click). SOI should match or beat B3 on accuracy at a small fraction of B3's cost, and dominate B1 on accuracy, and beat B2 on cost at equal accuracy.
Ablations. Remove the gate (fixed escalation depth); remove calibration (raw softmax into fusion); remove the neighbourhood/track-association (treat moving objects as fixed); remove GSD-conditioning of vision reliability. Each ablation predicts a specific, measurable regression β e.g. removing the gate should leave accuracy roughly unchanged while multiplying cost, which is precisely the claim the gate exists to make.
37. Roadmap
A phased build that delivers value at every step and never ships a stub. [PROPOSED]
- Phase 1 β T1 only. The Context Envelope compiler, the skill, the router with T1, and the Identity Card. Ships real value immediately: clicking any known feature/entity/WMS layer now identifies it deterministically, which today it does not. No model cost.
- Phase 2 β T2 vision. Chip capture + upload + the single-pass VLM tier + GSD-aware reliability. Now unmapped structures in good imagery get identified.
- Phase 3 β T3 retrieval + the gate. The ReAct tier, the three new tool executors (Β§26.5), and the value-of-computation gate. Now answers carry open-source context, and cost stays bounded.
- Phase 4 β T4 OSINT + mobile + mesh-share. Decomposed investigation, the bottom-sheet card, and share-to-mesh. Full capability, including the field unit.
- Phase 5 β calibration + evaluation harness. Fit the temperature, stand up the click corpus, and run Β§36 continuously as a regression gate.
Each phase is independently shippable and independently honest: a Phase-1 deployment that cannot do vision says it stopped at T1, rather than pretending.
38. Limitations and threats to validity
We are candid about where this design can fail.
- Vision is GSD-bounded and can be confidently wrong. At 3 m/px a substation and an industrial yard look alike; calibration (Β§20) is what keeps T2 from asserting a confident error, but calibration is itself only as good as its validation set. A mis-fit temperature would let overconfidence through β which is exactly why ECE is a first-class metric (Β§36).
- The gate's value estimates are models, not oracles. (19) depends on a predictive model of each tier's discriminating power. If that model is wrong, the gate over- or under-escalates. It must be fit from the click corpus and monitored, not hand-set once.
- OSINT can be poisoned. T3/T4 trust external sources; an adversary who seeds a plausible false fact can mislead the dossier. The corroboration gate (β₯2 independent sources, Β§26.4) and the surfaced Dempster conflict mass (Β§20) are mitigations, not guarantees.
- Association fails in dense clutter. JPDA (Β§19) degrades when many tracks gate a single click; the card must then present the ranked rather than force a single identity β and it does (the alternatives row).
- Sovereignty narrows capability honestly. In EU-OFFICIAL the external tiers are gated, so some clicks will resolve only to unknown with internal evidence. This is correct behaviour, but it is a real capability ceiling the operator must understand β hence the always-visible posture footer (Β§33).
- It is a design. Every quantitative claim in this paper is a hypothesis with a stated test, not a measurement. The honest status is: the substrate is built and proven, the pipeline is specified and falsifiable, and Phase 1 is the next concrete step.
39. Conclusion
The question under the cursor is old, but on a sovereign multi-engine map it has never had a good answer. We have argued that the answer is not a bigger model or a deeper pipeline but a better-shaped one: capture everything the click already implies into a single evidence envelope; resolve deterministically when the map already knows; look at the pixels when it does not; reach for internal and then external knowledge when the pixels are not enough; and at every step, decide whether the next, costlier tier is actually worth running. The mathematics that make this rigorous β projection and GSD, terrain decoding, spaceβtime association, evidence fusion, calibration, and a value-of-computation gate β are classical and well-founded. The orchestration that makes it real already runs in production. What remains is to connect them, in the order Part VII lays out, and to hold the result to the falsifiable standard of Β§36. Done that way, "What's here?" stops being a reverse-geocoder and becomes what an operator actually needs: an honest, sourced, cost-aware answer to what am I looking at, and what surrounds it.
Β§13. References
All references below were verified against a primary source during preparation (Phase 2 / Phase 6.5 of the research-paper methodology). arXiv IDs, DOIs, and standard numbers are given where they exist.
[1] A. Radford, J. W. Kim, C. Hallacy, A. Ramesh, et al. "Learning Transferable Visual Models From Natural Language Supervision" (CLIP). ICML 2021. arXiv:2103.00020. arxiv.org
[2] S. Yao, J. Zhao, D. Yu, N. Du, I. Shafran, K. Narasimhan, Y. Cao. "ReAct: Synergizing Reasoning and Acting in Language Models." ICLR 2023. arXiv:2210.03629. arxiv.org
[3] P. Lewis, E. Perez, A. Piktus, F. Petroni, V. Karpukhin, N. Goyal, et al. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks." NeurIPS 2020. arXiv:2005.11401. arxiv.org
[4] T. Schick, J. Dwivedi-Yu, R. Dessì, R. Raileanu, M. Lomeli, L. Zettlemoyer, N. Cancedda, T. Scialom. "Toolformer: Language Models Can Teach Themselves to Use Tools." NeurIPS 2023. arXiv:2302.04761. arxiv.org
[5] S. Antol, A. Agrawal, J. Lu, M. Mitchell, D. Batra, C. L. Zitnick, D. Parikh. "VQA: Visual Question Answering." ICCV 2015, pp. 2425β2433. DOI:10.1109/ICCV.2015.279. arXiv:1505.00468. arxiv.org
[6] A. Kirillov, E. Mintun, N. Ravi, H. Mao, C. Rolland, L. Gustafson, et al. "Segment Anything" (SAM). ICCV 2023. arXiv:2304.02643. arxiv.org
[7] Gemini Team, Google. "Gemini: A Family of Highly Capable Multimodal Models." Technical report, 2023. arXiv:2312.11805. arxiv.org
[8] L. H. Li, P. Zhang, H. Zhang, J. Yang, C. Li, et al. "Grounded Language-Image Pre-training" (GLIP). CVPR 2022. arXiv:2112.03857. arxiv.org
[9] OpenStreetMap Wiki. "Zoom levels" and "Slippy map tilenames" β Web Mercator ground resolution (resolution = 156543.03 Β· cos(lat) / 2^zoom at 256 px tiles). wiki.openstreetmap.org
[10] Microsoft. "Bing Maps Tile System β Understanding Scale and Resolution." (Corroborating the 156543.04 m/px ground-resolution constant.) learn.microsoft.com
[11] Mapzen / tilezen. "Terrain Tiles β Output Formats (Terrarium)": elevation = (RΒ·256 + G + B/256) β 32768. AWS Open Data "Terrain Tiles." github.com Β· registry.opendata.aws
[12] Open Geospatial Consortium. "OpenGIS Web Map Server Implementation Specification" (WMS 1.3.0), OGC 06-042 / ISO 19128:2005 β GetMap, GetCapabilities, GetFeatureInfo. ogc.org
[13] Open Geospatial Consortium. "OpenGIS Web Feature Service 2.0 Interface Standard" (WFS 2.0), OGC 09-025r2 / ISO 19142:2010. ogc.org
[14] U.S. National Geospatial-Intelligence Agency (formerly DMA). "Datums, Ellipsoids, Grids, and Grid Reference Systems," DMA TM 8358.1 (UTM definition; MGRS, Ch. 3); companion TM 8358.2 "The Universal Grids: UTM and UPS." earth-info.nga.mil
[15] T. Vincenty. "Direct and Inverse Solutions of Geodesics on the Ellipsoid with Application of Nested Equations." Survey Review 23(176):88β93, 1975. DOI:10.1179/sre.1975.23.176.88
[16] R. W. Sinnott. "Virtues of the Haversine." Sky & Telescope 68(2):158, 1984.
[17] Uber. "H3: Hexagonal Hierarchical Geospatial Indexing System." h3geo.org
[18] Open Geospatial Consortium. "3D Tiles Specification 1.1," OGC 22-025r4 (Community Standard), 2023. docs.ogc.org
[19] The Khronos Group. "glTF 2.0 β Runtime 3D Asset Delivery Format." Also ISO/IEC 12113:2022. khronos.org
[20] International Telecommunication Union. "Technical characteristics for an automatic identification system using TDMA in the VHF maritime mobile band," Recommendation ITU-R M.1371-5, 2014. itu.int
[21] RTCA, Inc. "Minimum Operational Performance Standards (MOPS) for 1090 MHz Extended Squitter ADS-B and TIS-B," RTCA DO-260B (ADS-B Version 2), 2009. (See also ICAO Annex 10, Vol. IV.) rtca.org
[22] A. P. Dempster. "Upper and Lower Probabilities Induced by a Multivalued Mapping." Annals of Mathematical Statistics 38(2):325β339, 1967. DOI:10.1214/aoms/1177698950
[23] G. Shafer. "A Mathematical Theory of Evidence." Princeton University Press, 1976. ISBN 9780691100425.
[24] R. A. Howard. "Information Value Theory." IEEE Transactions on Systems Science and Cybernetics 2(1):22β26, 1966. DOI:10.1109/TSSC.1966.300074
[25] T. Dean, M. Boddy. "An Analysis of Time-Dependent Planning." Proc. AAAI-88, pp. 49β54, 1988.
[26] S. J. Russell, E. H. Wefald. "Principles of Metareasoning." Artificial Intelligence 49(1β3):361β395, 1991. DOI:10.1016/0004-3702(91)90015-C
[27] R. E. Kalman. "A New Approach to Linear Filtering and Prediction Problems." Trans. ASME β J. Basic Engineering 82(D):35β45, 1960. DOI:10.1115/1.3662552
[28] T. E. Fortmann, Y. Bar-Shalom, M. Scheffe. "Sonar Tracking of Multiple Targets Using Joint Probabilistic Data Association." IEEE J. Oceanic Engineering 8(3):173β184, 1983. DOI:10.1109/JOE.1983.1145560
[29] J. C. Platt. "Probabilistic Outputs for Support Vector Machines and Comparisons to Regularized Likelihood Methods." In Advances in Large Margin Classifiers, MIT Press, 1999, pp. 61β74.
[30] C. Guo, G. Pleiss, Y. Sun, K. Q. Weinberger. "On Calibration of Modern Neural Networks." ICML 2017. arXiv:1706.04599. arxiv.org
[31] C. E. Shannon. "A Mathematical Theory of Communication." Bell System Technical Journal 27:379β423, 623β656, 1948. DOI:10.1002/j.1538-7305.1948.tb01338.x
[32] D. Lam, R. Kuzma, K. McGee, S. Dooley, M. Laielli, M. Klaric, Y. Bulatov, B. McCord. "xView: Objects in Context in Overhead Imagery." 2018. arXiv:1802.07856. arxiv.org
[33] G.-S. Xia, X. Bai, J. Ding, Z. Zhu, S. Belongie, J. Luo, M. Datcu, M. Pelillo, L. Zhang. "DOTA: A Large-Scale Dataset for Object Detection in Aerial Images." CVPR 2018. arXiv:1711.10398. arxiv.org
Appendix A β Authenticity & verification checklist
Per the research-paper methodology, this paper was held to the following gates:
- No fabricated authors/affiliations β author and institution are bracketed placeholders for the operator to complete.
- No fabricated citations β all 33 references verified against primary sources (arXiv, OGC, ITU, NGA, Project Euclid, Princeton UP, IEEE/ASME, AWS/tilezen, OSM/Microsoft) before inclusion.
- No fabricated results β the paper reports zero experimental results; every quantitative claim is tagged [PROPOSED] with a falsifiable test in Β§36.
- EXISTING vs PROPOSED separated β Parts IβII describe verified, deployed substrate; Parts IIIβVII are tagged design.
- Numeric facts grounded β the 156543.0339 GSD constant [9,10], the Terrarium decode [11], the Mercator latitude limit, and the WGS-84 flattening [1] in Eq. (1) are sourced.
- Grounded-validation gate (Claude WebSearch engine). Every load-bearing claim and all 33 citations were grounded against primary sources via live web search across three independent verification passes β arXiv/DOI for the academic citations; OGC, ITU-R, NGA/DMA, RTCA, AWS/tilezen, and OSM/Microsoft for the standards and constants; and direct checks for the numeric facts (ΟΒ²β 99% = 9.210; Web Mercator limit 85.0511Β°; equatorial circumference 40,075,016.686 m; Terrarium decode; WGS-84 flattening). Zero
CONTRADICTED/UNSUPPORTEDresults. - Phase 6.5 second-engine gate (
gemini_validate.mjs) β not run: the Gemini grounding key's account is over its monthly spending cap (HTTP 429RESOURCE_EXHAUSTED) at preparation time, an external constraint. The skill mandates dual-engine grounding (Phase 2.0); the Claude WebSearch engine above stands in for the blocked Gemini engine. To complete the dual-engine gate, re-rungemini_validate.mjs claims.jsononce the cap resets and tick this box on a clean pass.
Appendix B β A worked example: the click in the cover screenshot
To make the abstractions concrete, we walk a single click end to end with real numbers. The scene is the paper's cover image: the operator, in EU-OFFICIAL posture on the Cesium globe at zoom 15, right-clicks a structure near Trino, Piedmont, and chooses What's here? The reported coordinate is 45.5784 N, 8.1301 E, elevation β 355 m, MGRS 32TMR 32145 47577. (The identity below is illustrative of the pipeline's behaviour, not an assertion about the real parcel β this is a design walk-through, not a measurement.)
Step 0 β the envelope (client, ~0.4 ms). unproject returns the coordinate via the rayβellipsoid solve of Eq. (2); toMGRS yields the grid string via Eq. (4a). The active basemap is Esri World Imagery (Google is gated off in EU-OFFICIAL). At , $z=15$, Eq. (5) gives
The pitch is near-nadir, so the chip footprint (Eq. 6) for a $W=512$ px crop is m β a ~1.7 km scene, far larger than the target object. The compiler therefore reduces the crop toward the object scale m: a 256 px crop still spans ~857 m at this GSD, so SOI records that the available imagery is coarse for object-scale identification β a fact that will lower the vision tier's reliability in Eq. (14). Pick uncertainty (Eq. 8) with a mouse ( px) is m. The drill-pick hits the Esri basemap (pixels only β no vector feature) and one geojson overlay parcel with landuse=industrial. The neighbourhood within m holds one live mesh track, MESHLOCAL-3, at 600 m bearing ~090Β°.
Step 1 β T1 (deterministic, ~25 ms). No tracking-feed hit, so no track association. The parcel attribute landuse=industrial yields a weak hypothesis with mass 0.5, . There is no WMS GetFeatureInfo template on the visible layers, so that path is skipped. Reverse-geocode returns a place label ("Trino, VC, Italy") at β useful context, not an object identity. Fusing (Eqs. 14β15) leaves a diffuse belief: mass spread across industrial_site, several specific industrial subtypes, and a non-trivial (unknown). Entropy (Eq. 17) is high; the top hypothesis is not but not sharp either.
Step 2 β the gate after T1 (Eq. 19). is large because the confusions in play (substation vs generic industrial yard vs warehouse) carry different action-losses. The predictive model estimates T2 vision can meaningfully split these even at coarse GSD. β escalate. The chip's bytes leave the device now (Step 0 only captured a local blob); in EU-OFFICIAL the configured VLM endpoint must itself be in-region for this to be permitted, which the broker checks.
Step 3 β T2 (vision, ~2.3 s). The VLM, told the scene is overhead imagery at 3.3 m/px near Trino, returns electrical_substation 0.71 with the rationale "rectangular fenced compound with regular linear structures consistent with switchgear." Calibration (Eq. 16) with $T>1$ tempers this to ~0.66; the GSD-aware reliability (coarse imagery β discounted). Fusing into concentrates mass on electrical_substation but the calibrated is only ~0.6.
Step 4 β the gate after T2. Entropy has dropped but the top confidence (0.6) sits below and the operator is on a high-value infrastructure question. β escalate to retrieval.
Step 5 β T3 (ReAct retrieval, ~6 s, gated). Tools used: GraphRAG (internal) returns a prior dossier mentioning a Trino grid node; imagery_lookup against the operator's Copernicus archive (EU-hosted, allowlisted) confirms a persistent fenced compound; a gated web lookup returns the operating utility. Each observation is RAG-cited. Fusion lifts electrical_substation to a calibrated ~0.78, with a small residual on industrial_site and unknown.
Step 6 β the gate after T3 (stop). and is low; is small enough that no further tier clears its cost. The gate halts β T4 is not run unless the operator presses Deep research.
Result. The Identity Card of Β§30 renders: Trino Electrical Substation, infrastructureΒ·power, confidence 0.78 (likely), with extent ~40Γ25 m, the mesh-node neighbour, an agricultural-surround note, a four-row evidence chain (T1 parcel β T2 vision β T3 KB β T3 web), and the posture footer EU-OFFICIAL Β· external sources: 1 (gated ok). Total wall-clock β 8.3 s; one VLM call; one gated web call; everything else internal. The same machinery, on a click that had landed on a labelled AIS vessel, would have stopped at Step 1 in 25 ms with zero model cost β which is the entire economic argument of the paper, shown rather than asserted.
Appendix C β Design rationale: alternatives we rejected
A design is as much what it excludes as what it includes. Four forks, and why we took the branch we did.
Why tiers, not one big multimodal call? The tempting design is to throw the chip, the coordinate, and the layer dump at a single large multimodal model and let it sort everything out. We rejected this for three reasons: it pays full model cost on the ~80% of clicks that land on things the map already knows (a labelled track needs no inference); it cannot cite a deterministic source for a deterministic fact (an MMSI match is certain, and laundering it through an LLM only adds hallucination risk); and it has no principled stopping rule. Tiering with a value-of-computation gate fixes all three β cheap facts stay cheap and certain, and the model is invoked only when it adds value.
Why DempsterβShafer, not pure Bayes? Naive Bayesian fusion (Eq. 13) assumes conditional independence and forces every source onto the same probability simplex. Real SOI evidence violates both: T3's web result may echo T2's guess (not independent), and a hard registry hit and a fuzzy vision softmax have wildly different reliability. DST's reliability discounting (Eq. 14) and its explicit conflict mass (Eq. 15) model exactly this, and the conflict signal is operationally useful β "sources disagree" is itself worth showing. We keep the Bayesian core for the well-behaved case and escalate to DST for the messy one.
Why the inspector, not a popover on the result? A popover anchored to the clicked point is the obvious UI and the wrong one: on this platform floating panels have repeatedly eaten map taps and occluded each other, a regression class the team has paid for more than once. The inspector dock is the established home for "details about a selected thing," it auto-reveals and focuses, and it cannot occlude the map. Putting the Identity Card there is consistency, not novelty β which is the point.
Why capture the chip eagerly but upload it lazily? Capturing the screenshot at click time is necessary because the camera may move before a tier asks for it; the pixels must be frozen at the moment of the gesture. But sending them is a sovereignty-relevant act. Splitting capture from transmission (Β§11, Β§23) means a click resolved at T1 never moves a pixel off the device, while a click that needs vision has the right pixels ready β and the upload becomes an explicit, broker-checkable event rather than an ambient default.
Appendix D β Glossary
| Term | Meaning in this paper |
|---|---|
| SOI | Spatial Object Identification β the system this paper specifies. |
| Context Envelope | The client-built evidence bundle (point, view, layers, pick, neighbourhood, chip) that a click compiles to (Β§11). |
| Chip | A square screenshot crop centred on the click, with a recorded ground footprint, for the vision tiers (Β§17). |
| GSD | Ground sample distance β metres of ground per screen pixel, Eq. (5); the hard bound on what vision can resolve. |
| Tier (T1βT4) | The four identification stages: deterministic resolve, single-pass vision, tool-using retrieval, autonomous OSINT (Β§12). |
| The gate | The value-of-computation decision (Eq. 19) that escalates between tiers only when worthwhile (Β§21). |
| VoC / VoI | Value of computation / value of information β the decision-theoretic basis for the gate [24,26]. |
| Belief / | The distribution over candidate identities (including the explicit unknown ); the pignistic probability used for the decision (Β§20). |
| Identity Card | The single inspector component that renders any tier's result (Β§14, Β§30). |
| UNO | The platform's unified orchestrator that routes a dispatch to the workflow engine (Β§9). |
| Five-gate broker | The synergy-server admission control (classification, residency, export, spend, safety) every dispatch passes (Β§9). |
| Posture | The classification state (e.g. EU-OFFICIAL) that gates which external sources SOI may use (Β§33, Β§34). |
| COP | Common Operating Picture β the fused live-track layer at /api/v1/cop/picture (Β§8). |
End of paper. Distribution: link-only / noindex. Author and affiliation fields are placeholders for the publishing operator to complete prior to any external sharing.
