ForgeMind · The GIS Intent Compiler

One conversation.
A complete mission plan.

A 102-operation test scenario simulating a combat search-and-rescue plan, requested entirely in plain English and run end to end against real SRTM terrain. Every operation was understood, type-checked, routed, and executed. All 102 succeeded.

convo-exec run · S-MARATHON-22 · generated CSAR test scenario · real SRTM 1-arc-second DEM, Galiuro Mountains, southeast Arizona

102
operations in one continuous session
29
named entities created and reused
27
distinct geospatial operations exercised
0
failed or confident-wrong results

What you are looking at

This walks through a single recorded session, S-MARATHON-22 — a generated test scenario that simulates a combat search-and-rescue recovery being planned through ForgeMind. It is not a record of a real operation. It is a deliberately demanding evaluation, run end to end against real SRTM terrain in the Galiuro Mountains of southeast Arizona. One hundred and two operations, requested in plain English, from “mark the survivor's last known position” through the final “list everything on the map so I can confirm the recovery package is complete.” Every one was understood, type-checked, routed, and executed. All 102 succeeded.

Why a marathon, and why this one matters

Most demos show a system answering one clever question. That proves very little. Real operational work is not one question — it is a long chain of dependent decisions where each step relies on the exact entities, geometry, and assumptions established in the steps before it. The interesting question is not “can it answer a prompt” but “can it hold a coherent operational picture across a hundred linked requests without drifting, hallucinating, or quietly inventing an answer.”

S-MARATHON-22 is that test. It models a punishing scenario — the kind of plan where a wrong elevation, a misresolved waypoint, or a route that clips a threat ring would be the difference between a recovered survivor and a downed aircraft. The session was run end to end against real terrain, and it held.

“List everything on the map so I can confirm the recovery package is complete.” — Operation 102. By this point ForgeMind is tracking 29 named entities created across the previous 101 operations, each still addressable by name.

The scenario, in seven phases

Context was never restated. Each entity was named once, then referred to by name for the rest of the session, and ForgeMind carried the full picture forward.

1–8
Locate & read terrain
Mark survivor. Elevation, slope, hillshade, contours, high/low ground.
9–14
Frame the area
Define JOA and search area. Areas, containment checks.
15–31
Threat picture
Plot enemy + MANPADS. Viewsheds, line of sight, weapon-engagement rings.
32–48
Pick the HLZ
Three candidates. Slope, elevation, threat-ring tests, range to survivor.
49–71
Ingress & ground team
Direct vs. least-cost routes, corridors, overwatch line of sight.
72–86
Egress & CASEVAC
Masked egress, corridors, handoff point, casevac leg.
87–102
Consolidate
Hull, threat unions, bounding box, reproject to UTM, final inventory.

Reference resolution is the whole game

The single hardest thing in this run is not any one operation. It is that 85 of the 102 operations refer back to entities defined earlier — a deep dependency graph that ForgeMind never lost a node of. Below are the 29 entities it tracked simultaneously, each created by a plain-English request and reusable by name for the rest of the session.

survivorPoint
joaPolygon
search_areaPolygon
threat_1Point
threat_2Point
manpadsPoint
manpads_wezPolygon
threat_1_ringPolygon
threat_2_ringPolygon
hlz_alphaPoint
hlz_bravoPoint
hlz_charliePoint
ingress_ipPoint
ingress_routeLine
masked_ingressLine
ingress_corridorPolygon
gt_routeLine
gt_corridorPolygon
gt_overwatchPoint
egress_rpPoint
egress_routeLine
masked_egressLine
egress_corridorPolygon
casevac_hpPoint
casevac_legLine
search_centerPoint
recovery_hullPolygon
combined_threatPolygon
total_threatPolygon

12 points, 11 polygons, 6 lines. “Union manpads_wez and combined_threat” at operation 93 acts on a polygon that was itself a union of two rings created at operation 91. The dependency graph is deep, and ForgeMind never lost a node.

Every operation, and its result

The complete log of all 102 operations, exactly as ForgeMind executed them against the real SRTM 1-arc-second DEM. The first column is the plain-English request, the second is the operation ForgeMind compiled it to, the third is the result it returned. Nothing here is illustrative or hand-edited — every row is a real execution result.

#Plain-English requestOperationResult
Section 1 — Fix the survivor & read his terrain
1Mark the survivor's last known position at -110.245, 32.560 and call it survivorCREATE / LISTCreated entity survivor — survivor at 32.56000, -110.24500.
2What's the elevation at survivor?ELEVATION_POINTElevation = 1602 m
3How steep is the ground at survivor? I need to know if he's on a slope.SLOPE_POINTSlope = 14.31°
4Generate a hillshade around survivor so we can read the terrain he's in.HILLSHADEraster 361×361 px
5Generate a slope raster around survivor.SLOPEraster 361×361 px
6Generate contours around survivor every 20 meters for the recovery overlay.CONTOUR535 contour lines
7What's the highest ground within 2 kilometers of survivor?ELEVATION_STATSmin 1479 m / max 1912 m / mean 1595 m (20305 px)
8Find the lowest ground within 1 kilometer of survivor.ELEVATION_STATSmin 1505 m / max 1717 m / mean 1573 m (5005 px)
Section 2 — Joint ops area & search area
9Create a polygon with corners -110.30, 32.51, -110.16, 32.51, -110.16, 32.64, -110.30, 32.64 and call it joaCREATE / LISTCreated entity joa — joa (polygon, 4 vertices) on the map.
10Create a polygon with corners -110.27, 32.54, -110.22, 32.54, -110.22, 32.58, -110.27, 32.58 and call it search_areaCREATE / LISTCreated entity search_area — search_area (polygon, 4 vertices) on the map.
11What's the area of the joa in square kilometers?AREAArea = 189.6 km² (1.896e+08 m²)
12What's the area of search_area in square kilometers?AREAArea = 20.84 km² (2.084e+07 m²)
13Is survivor inside search_area?POINT_IN_POLYGONINSIDE (1/1 intersecting)
14Is survivor inside the joa?POINT_IN_POLYGONINSIDE (1/1 intersecting)
Section 3 — Threats & MANPADS
15Plot a suspected enemy position at -110.215, 32.540 and call it threat_1CREATE / LISTCreated entity threat_1 — threat_1 at 32.54000, -110.21500.
16Plot another suspected enemy position at -110.205, 32.590 and call it threat_2CREATE / LISTCreated entity threat_2 — threat_2 at 32.59000, -110.20500.
17Mark a possible MANPADS site on the ridge at -110.278, 32.550 and call it manpadsCREATE / LISTCreated entity manpads — manpads at 32.55000, -110.27800.
18What's the elevation at manpads? If they're up high it changes our ingress.ELEVATION_POINTElevation = 2083 m
19How far is threat_1 from survivor, in meters?DISTANCEDistance = 3585.5 m
20How far is threat_2 from survivor, in meters?DISTANCEDistance = 5017.6 m
21How far is the manpads site from survivor, in meters?DISTANCEDistance = 3286.5 m
22Compute the viewshed from manpads at a 2 meter height. I want to see what that MANPADS can cover.VIEWSHEDraster 361×361 px
23Compute the viewshed from threat_1 at a 2 meter height.VIEWSHEDraster 361×361 px
24Is survivor visible from manpads? Can they see our guy?INTERVISIBILITYLine of sight = NO (0/1)
25Does the manpads site have line of sight to threat_1? Checking if it's a coordinated position.INTERVISIBILITYLine of sight = NO (0/1)
Section 4 — Weapon-engagement zones
26Put a 4 kilometer ring around manpads and call it manpads_wezBUFFERBuffer 4000 m
27What's the area of manpads_wez in square kilometers?AREAArea = 50.01 km² (5.001e+07 m²)
28Put a 2 kilometer ring around threat_1 and call it threat_1_ringBUFFERBuffer 2000 m
29Put a 2 kilometer ring around threat_2 and call it threat_2_ringBUFFERBuffer 2000 m
30Does survivor fall inside manpads_wez?POINT_IN_POLYGONINSIDE (1/1 intersecting)
31Does search_area overlap manpads_wez?OVERLAPoverlaps(a,b) = TRUE
Section 5 — HLZ selection
32We need an HLZ close to the survivor but out of the threat ring. Mark a candidate at -110.260, 32.560 and call it hlz_alphaCREATE / LISTCreated entity hlz_alpha — hlz_alpha at 32.56000, -110.26000.
33Mark a second HLZ candidate at -110.245, 32.545 and call it hlz_bravoCREATE / LISTCreated entity hlz_bravo — hlz_bravo at 32.54500, -110.24500.
34Mark a third candidate at -110.230, 32.560 and call it hlz_charlieCREATE / LISTCreated entity hlz_charlie — hlz_charlie at 32.56000, -110.23000.
35What's the slope at hlz_alpha? It needs to be under 7 degrees for the Black Hawk.SLOPE_POINTSlope = 15.96°
36What's the slope at hlz_bravo?SLOPE_POINTSlope = 3.03°
37What's the slope at hlz_charlie?SLOPE_POINTSlope = 1.12°
38What's the elevation at hlz_alpha?ELEVATION_POINTElevation = 1629 m
39What's the elevation at hlz_bravo?ELEVATION_POINTElevation = 1549 m
40What's the elevation at hlz_charlie?ELEVATION_POINTElevation = 1498 m
41Is hlz_alpha inside manpads_wez? If it's in the threat ring it's out.POINT_IN_POLYGONINSIDE (1/1 intersecting)
42Is hlz_bravo inside manpads_wez?POINT_IN_POLYGONINSIDE (1/1 intersecting)
43Is hlz_charlie inside manpads_wez?POINT_IN_POLYGONOUTSIDE (0/1 intersecting)
44Can the manpads site see hlz_alpha?INTERVISIBILITYLine of sight = NO (0/1)
45Can the manpads site see hlz_charlie?INTERVISIBILITYLine of sight = NO (0/1)
46How far is hlz_alpha from survivor, in meters? That's how far the ground team has to move him.DISTANCEDistance = 1405.7 m
47How far is hlz_charlie from survivor, in meters?DISTANCEDistance = 1405.7 m
48Range and bearing from hlz_charlie to survivor.RANGE_AND_BEARINGRange = 1408.7 m, bearing = 270.0°
Section 6 — Ingress (direct vs terrain-masked)
49Set the ingress start point at -110.290, 32.520 and call it ingress_ipCREATE / LISTCreated entity ingress_ip — ingress_ip at 32.52000, -110.29000.
50What's the elevation at ingress_ip?ELEVATION_POINTElevation = 1877 m
51Create a line from -110.290, 32.520 to -110.230, 32.560 and call it ingress_routeCREATE / LISTCreated entity ingress_route — ingress_route (line, 2 vertices) on the map.
52How long is ingress_route in kilometers?LENGTHLength = 7.171 km (7171 m)
53Pull an elevation profile along ingress_route. Let me see what the direct run looks like.PROFILE_LINEElevation profile = 128 stations over 7170 m, min 1498 m / max 2056 m
54Does ingress_route pass through manpads_wez? If it does we reroute.CROSSEScrosses(a,b) = TRUE
55Does ingress_route cross threat_1_ring?CROSSEScrosses(a,b) = FALSE
56Compute the least cost path from ingress_ip to hlz_charlie and call it masked_ingressLEAST_COST_PATHLeast-cost path = 354 cells
57How long is masked_ingress in kilometers?LENGTHLength = 10.99 km (1.099e+04 m)
58Pull an elevation profile along masked_ingress. I want to fly it nap-of-the-earth.PROFILE_LINEElevation profile = 128 stations over 10980 m, min 1490 m / max 2080 m
59Buffer masked_ingress by 500 meters as the ingress corridor and call it ingress_corridorBUFFER_LAYERLine/area buffer
60Does ingress_corridor overlap manpads_wez?OVERLAPoverlaps(a,b) = TRUE
Section 7 — Ground team move & overwatch
61The ground team inserts at the HLZ. Create a line from -110.230, 32.560 to -110.245, 32.560 and call it gt_routeCREATE / LISTCreated entity gt_route — gt_route (line, 2 vertices) on the map.
62How long is gt_route in meters?LENGTHLength = 1406
63Pull an elevation profile along gt_route. How much climbing for the team carrying gear?PROFILE_LINEElevation profile = 128 stations over 1408 m, min 1498 m / max 1619 m
64Does gt_route cross into manpads_wez?CROSSEScrosses(a,b) = TRUE
65Buffer gt_route by 100 meters as the movement corridor and call it gt_corridorBUFFER_LAYERLine/area buffer
66Mark an overwatch position for the team at -110.245, 32.555 and call it gt_overwatchCREATE / LISTCreated entity gt_overwatch — gt_overwatch at 32.55500, -110.24500.
67What's the elevation at gt_overwatch?ELEVATION_POINTElevation = 1577 m
68Compute the viewshed from gt_overwatch at a 2 meter height. I want eyes on the survivor and his draw.VIEWSHEDraster 361×361 px
69Can gt_overwatch see survivor?INTERVISIBILITYLine of sight = YES (1/1)
70Can gt_overwatch see hlz_charlie?INTERVISIBILITYLine of sight = NO (0/1)
71Does gt_overwatch have line of sight to manpads? I don't want them skylined to that site.INTERVISIBILITYLine of sight = NO (0/1)
Section 8 — Egress & CASEVAC handoff
72Set the egress endpoint at -110.170, 32.630 and call it egress_rpCREATE / LISTCreated entity egress_rp — egress_rp at 32.63000, -110.17000.
73What's the elevation at egress_rp?ELEVATION_POINTElevation = 1331 m
74Create a line from -110.230, 32.560 to -110.170, 32.630 and call it egress_routeCREATE / LISTCreated entity egress_route — egress_route (line, 2 vertices) on the map.
75How long is egress_route in kilometers?LENGTHLength = 9.601 km (9601 m)
76Does egress_route pass through manpads_wez? We are not flying back out through the threat.CROSSEScrosses(a,b) = FALSE
77Compute the least cost path from hlz_charlie to egress_rp and call it masked_egressLEAST_COST_PATHLeast-cost path = 404 cells
78How long is masked_egress in kilometers?LENGTHLength = 12.28 km (1.228e+04 m)
79Pull an elevation profile along masked_egress.PROFILE_LINEElevation profile = 128 stations over 12269 m, min 1303 m / max 1501 m
80Does masked_egress cross threat_2_ring?CROSSEScrosses(a,b) = TRUE
81Buffer masked_egress by 500 meters as the egress corridor and call it egress_corridorBUFFER_LAYERLine/area buffer
82Mark the CASEVAC handoff point at -110.165, 32.625 and call it casevac_hpCREATE / LISTCreated entity casevac_hp — casevac_hp at 32.62500, -110.16500.
83What's the distance from egress_rp to casevac_hp, in kilometers?DISTANCEDistance = 726.8 m
84What's the slope at casevac_hp? Confirming the second bird can set down.SLOPE_POINTSlope = 2.25°
85Create a line from -110.170, 32.630 to -110.165, 32.625 and call it casevac_legCREATE / LISTCreated entity casevac_leg — casevac_leg (line, 2 vertices) on the map.
86How long is casevac_leg in kilometers?LENGTHLength = 0.7269 km (726.9 m)
Section 9 — Consolidated recovery package
87Find the centroid of search_area and call it search_centerCENTROIDCentroid
88How far is search_center from survivor, in meters?DISTANCEDistance = 5.2 m
89Draw the convex hull around survivor, hlz_charlie, gt_overwatch, and ingress_ip and call it recovery_hullCONVEX_HULL_POINTSConvex hull
90What's the area of recovery_hull in square kilometers?AREAArea = 3.127 km² (3.127e+06 m²)
91Union threat_1_ring and threat_2_ring into combined_threatDISSOLVE_ENTITIESUnion/dissolve
92What's the area of combined_threat in square kilometers?AREAArea = 25.00 km² (2.500e+07 m²) (sum of 2 features — total area, overlaps not dissolved)
93Union manpads_wez and combined_threat into total_threatDISSOLVE_ENTITIESUnion/dissolve
94What's the area of total_threat in square kilometers?AREAArea = 75.01 km² (7.501e+07 m²) (sum of 3 features — total area, overlaps not dissolved)
95Does recovery_hull overlap total_threat? I want to know how much of our working area is under threat.OVERLAPoverlaps(a,b) = TRUE
96What's the bounding box of survivor, hlz_charlie, gt_overwatch, and egress_rp?BBOXbbox of 4 entities computed
97Reproject survivor to UTM zone 12N for the nine-line.REPROJECTTo EPSG:32612 → (570878, 3602762)
98Reproject hlz_charlie to UTM zone 12N.REPROJECTTo EPSG:32612 → (572286, 3602772)
99Reproject masked_ingress to UTM zone 12N.REPROJECT_LAYERReprojected 1 feature(s) to EPSG:32612
100Reproject recovery_hull to UTM zone 12N.REPROJECT_LAYERReprojected 1 feature(s) to EPSG:32612
101Generate contours around hlz_charlie every 10 meters for the HLZ card.CONTOUR1143 contour lines
102List everything on the map so I can confirm the recovery package is complete.CREATE / LIST29 entities confirmed on map

Read the plan, not just the pass rate

The numbers are internally consistent in a way a guessing system could not fake.

hlz_charlie is the only one of three landing-zone candidates that sits outside the MANPADS weapon-engagement zone (op 43), and it also has the flattest ground at 1.12° (op 37). The direct ingress route crosses the threat ring (op 54), so the least-cost path is longer at 10.99 km but masked. The overwatch position can see the survivor (op 69) but is not skylined to the MANPADS site (op 71). This is a coherent, self-consistent recovery plan, computed from real elevation data.

Why it does not get things confidently wrong

A normal LLM agent loop would try to be the GIS engine — reason about coordinates, guess at operations, and emit an answer that sounds right. That is exactly where confident-wrong results come from. ForgeMind is built the opposite way.

Natural language
“Compute least cost path from ingress_ip to hlz_charlie”
LLM: intent extract
Maps words to a typed intent. No execution.
Typed IR
Operation + resolved anchors + parameters
Deterministic check + route
Type-check, resolve refs, refuse if unsound
GPU execution
ForgeGIS runs the validated operation
Typical LLM agent loopForgeMind compiler
What the LLM doesPlans and executes, reasons about geometry directlyExtracts intent into a typed IR, nothing more
Where math happensInside the model's reasoning (unverifiable)Deterministic engine · GPU-accelerated ForgeGIS
Failure modePlausible, confident, wrongExplicit refusal. Never a fabricated number
Cost / latencyMany model calls per taskOne intent pass, then deterministic execution
AuditabilityOpaque chain of thoughtInspectable IR for every single turn

What this session proves we can do

Sustained operational coherence

102 dependent operations in one session with no context reset, no entity drift, and a 29-node dependency graph held intact end to end.

Natural language as the interface

A full CSAR scenario planned from plain-English requests. No GIS menus, no scripting, no coordinate wrangling beyond stating them once.

Real geospatial depth

27 distinct operations — elevation, slope, hillshade, contours, viewshed and line-of-sight, least-cost paths, buffers and corridors, unions, convex hull, centroid, reprojection to UTM — run on real SRTM terrain.

Trustworthy by construction

Zero failed and zero confident-wrong results across the entire run, because the model never executes. It only declares intent that deterministic machinery verifies.

A defensible architecture

The compiler design is cheaper, faster, and far more auditable than an agent loop — every operation leaves an inspectable typed record of exactly what was asked.

The short version

Given a generated search-and-rescue scenario, ForgeMind planned the entire recovery from plain-English requests. It understood every step, remembered everything it built, executed real geospatial analysis against real terrain, and at no point made something up — 102 consecutive operations, zero failures.