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
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.
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.
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.
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.
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.
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 request | Operation | Result |
|---|---|---|---|
| Section 1 — Fix the survivor & read his terrain | |||
| 1 | Mark the survivor's last known position at -110.245, 32.560 and call it survivor | CREATE / LIST | Created entity survivor — survivor at 32.56000, -110.24500. |
| 2 | What's the elevation at survivor? | ELEVATION_POINT | Elevation = 1602 m |
| 3 | How steep is the ground at survivor? I need to know if he's on a slope. | SLOPE_POINT | Slope = 14.31° |
| 4 | Generate a hillshade around survivor so we can read the terrain he's in. | HILLSHADE | raster 361×361 px |
| 5 | Generate a slope raster around survivor. | SLOPE | raster 361×361 px |
| 6 | Generate contours around survivor every 20 meters for the recovery overlay. | CONTOUR | 535 contour lines |
| 7 | What's the highest ground within 2 kilometers of survivor? | ELEVATION_STATS | min 1479 m / max 1912 m / mean 1595 m (20305 px) |
| 8 | Find the lowest ground within 1 kilometer of survivor. | ELEVATION_STATS | min 1505 m / max 1717 m / mean 1573 m (5005 px) |
| Section 2 — Joint ops area & search area | |||
| 9 | Create a polygon with corners -110.30, 32.51, -110.16, 32.51, -110.16, 32.64, -110.30, 32.64 and call it joa | CREATE / LIST | Created entity joa — joa (polygon, 4 vertices) on the map. |
| 10 | Create a polygon with corners -110.27, 32.54, -110.22, 32.54, -110.22, 32.58, -110.27, 32.58 and call it search_area | CREATE / LIST | Created entity search_area — search_area (polygon, 4 vertices) on the map. |
| 11 | What's the area of the joa in square kilometers? | AREA | Area = 189.6 km² (1.896e+08 m²) |
| 12 | What's the area of search_area in square kilometers? | AREA | Area = 20.84 km² (2.084e+07 m²) |
| 13 | Is survivor inside search_area? | POINT_IN_POLYGON | INSIDE (1/1 intersecting) |
| 14 | Is survivor inside the joa? | POINT_IN_POLYGON | INSIDE (1/1 intersecting) |
| Section 3 — Threats & MANPADS | |||
| 15 | Plot a suspected enemy position at -110.215, 32.540 and call it threat_1 | CREATE / LIST | Created entity threat_1 — threat_1 at 32.54000, -110.21500. |
| 16 | Plot another suspected enemy position at -110.205, 32.590 and call it threat_2 | CREATE / LIST | Created entity threat_2 — threat_2 at 32.59000, -110.20500. |
| 17 | Mark a possible MANPADS site on the ridge at -110.278, 32.550 and call it manpads | CREATE / LIST | Created entity manpads — manpads at 32.55000, -110.27800. |
| 18 | What's the elevation at manpads? If they're up high it changes our ingress. | ELEVATION_POINT | Elevation = 2083 m |
| 19 | How far is threat_1 from survivor, in meters? | DISTANCE | Distance = 3585.5 m |
| 20 | How far is threat_2 from survivor, in meters? | DISTANCE | Distance = 5017.6 m |
| 21 | How far is the manpads site from survivor, in meters? | DISTANCE | Distance = 3286.5 m |
| 22 | Compute the viewshed from manpads at a 2 meter height. I want to see what that MANPADS can cover. | VIEWSHED | raster 361×361 px |
| 23 | Compute the viewshed from threat_1 at a 2 meter height. | VIEWSHED | raster 361×361 px |
| 24 | Is survivor visible from manpads? Can they see our guy? | INTERVISIBILITY | Line of sight = NO (0/1) |
| 25 | Does the manpads site have line of sight to threat_1? Checking if it's a coordinated position. | INTERVISIBILITY | Line of sight = NO (0/1) |
| Section 4 — Weapon-engagement zones | |||
| 26 | Put a 4 kilometer ring around manpads and call it manpads_wez | BUFFER | Buffer 4000 m |
| 27 | What's the area of manpads_wez in square kilometers? | AREA | Area = 50.01 km² (5.001e+07 m²) |
| 28 | Put a 2 kilometer ring around threat_1 and call it threat_1_ring | BUFFER | Buffer 2000 m |
| 29 | Put a 2 kilometer ring around threat_2 and call it threat_2_ring | BUFFER | Buffer 2000 m |
| 30 | Does survivor fall inside manpads_wez? | POINT_IN_POLYGON | INSIDE (1/1 intersecting) |
| 31 | Does search_area overlap manpads_wez? | OVERLAP | overlaps(a,b) = TRUE |
| Section 5 — HLZ selection | |||
| 32 | We 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_alpha | CREATE / LIST | Created entity hlz_alpha — hlz_alpha at 32.56000, -110.26000. |
| 33 | Mark a second HLZ candidate at -110.245, 32.545 and call it hlz_bravo | CREATE / LIST | Created entity hlz_bravo — hlz_bravo at 32.54500, -110.24500. |
| 34 | Mark a third candidate at -110.230, 32.560 and call it hlz_charlie | CREATE / LIST | Created entity hlz_charlie — hlz_charlie at 32.56000, -110.23000. |
| 35 | What's the slope at hlz_alpha? It needs to be under 7 degrees for the Black Hawk. | SLOPE_POINT | Slope = 15.96° |
| 36 | What's the slope at hlz_bravo? | SLOPE_POINT | Slope = 3.03° |
| 37 | What's the slope at hlz_charlie? | SLOPE_POINT | Slope = 1.12° |
| 38 | What's the elevation at hlz_alpha? | ELEVATION_POINT | Elevation = 1629 m |
| 39 | What's the elevation at hlz_bravo? | ELEVATION_POINT | Elevation = 1549 m |
| 40 | What's the elevation at hlz_charlie? | ELEVATION_POINT | Elevation = 1498 m |
| 41 | Is hlz_alpha inside manpads_wez? If it's in the threat ring it's out. | POINT_IN_POLYGON | INSIDE (1/1 intersecting) |
| 42 | Is hlz_bravo inside manpads_wez? | POINT_IN_POLYGON | INSIDE (1/1 intersecting) |
| 43 | Is hlz_charlie inside manpads_wez? | POINT_IN_POLYGON | OUTSIDE (0/1 intersecting) |
| 44 | Can the manpads site see hlz_alpha? | INTERVISIBILITY | Line of sight = NO (0/1) |
| 45 | Can the manpads site see hlz_charlie? | INTERVISIBILITY | Line of sight = NO (0/1) |
| 46 | How far is hlz_alpha from survivor, in meters? That's how far the ground team has to move him. | DISTANCE | Distance = 1405.7 m |
| 47 | How far is hlz_charlie from survivor, in meters? | DISTANCE | Distance = 1405.7 m |
| 48 | Range and bearing from hlz_charlie to survivor. | RANGE_AND_BEARING | Range = 1408.7 m, bearing = 270.0° |
| Section 6 — Ingress (direct vs terrain-masked) | |||
| 49 | Set the ingress start point at -110.290, 32.520 and call it ingress_ip | CREATE / LIST | Created entity ingress_ip — ingress_ip at 32.52000, -110.29000. |
| 50 | What's the elevation at ingress_ip? | ELEVATION_POINT | Elevation = 1877 m |
| 51 | Create a line from -110.290, 32.520 to -110.230, 32.560 and call it ingress_route | CREATE / LIST | Created entity ingress_route — ingress_route (line, 2 vertices) on the map. |
| 52 | How long is ingress_route in kilometers? | LENGTH | Length = 7.171 km (7171 m) |
| 53 | Pull an elevation profile along ingress_route. Let me see what the direct run looks like. | PROFILE_LINE | Elevation profile = 128 stations over 7170 m, min 1498 m / max 2056 m |
| 54 | Does ingress_route pass through manpads_wez? If it does we reroute. | CROSSES | crosses(a,b) = TRUE |
| 55 | Does ingress_route cross threat_1_ring? | CROSSES | crosses(a,b) = FALSE |
| 56 | Compute the least cost path from ingress_ip to hlz_charlie and call it masked_ingress | LEAST_COST_PATH | Least-cost path = 354 cells |
| 57 | How long is masked_ingress in kilometers? | LENGTH | Length = 10.99 km (1.099e+04 m) |
| 58 | Pull an elevation profile along masked_ingress. I want to fly it nap-of-the-earth. | PROFILE_LINE | Elevation profile = 128 stations over 10980 m, min 1490 m / max 2080 m |
| 59 | Buffer masked_ingress by 500 meters as the ingress corridor and call it ingress_corridor | BUFFER_LAYER | Line/area buffer |
| 60 | Does ingress_corridor overlap manpads_wez? | OVERLAP | overlaps(a,b) = TRUE |
| Section 7 — Ground team move & overwatch | |||
| 61 | The ground team inserts at the HLZ. Create a line from -110.230, 32.560 to -110.245, 32.560 and call it gt_route | CREATE / LIST | Created entity gt_route — gt_route (line, 2 vertices) on the map. |
| 62 | How long is gt_route in meters? | LENGTH | Length = 1406 |
| 63 | Pull an elevation profile along gt_route. How much climbing for the team carrying gear? | PROFILE_LINE | Elevation profile = 128 stations over 1408 m, min 1498 m / max 1619 m |
| 64 | Does gt_route cross into manpads_wez? | CROSSES | crosses(a,b) = TRUE |
| 65 | Buffer gt_route by 100 meters as the movement corridor and call it gt_corridor | BUFFER_LAYER | Line/area buffer |
| 66 | Mark an overwatch position for the team at -110.245, 32.555 and call it gt_overwatch | CREATE / LIST | Created entity gt_overwatch — gt_overwatch at 32.55500, -110.24500. |
| 67 | What's the elevation at gt_overwatch? | ELEVATION_POINT | Elevation = 1577 m |
| 68 | Compute the viewshed from gt_overwatch at a 2 meter height. I want eyes on the survivor and his draw. | VIEWSHED | raster 361×361 px |
| 69 | Can gt_overwatch see survivor? | INTERVISIBILITY | Line of sight = YES (1/1) |
| 70 | Can gt_overwatch see hlz_charlie? | INTERVISIBILITY | Line of sight = NO (0/1) |
| 71 | Does gt_overwatch have line of sight to manpads? I don't want them skylined to that site. | INTERVISIBILITY | Line of sight = NO (0/1) |
| Section 8 — Egress & CASEVAC handoff | |||
| 72 | Set the egress endpoint at -110.170, 32.630 and call it egress_rp | CREATE / LIST | Created entity egress_rp — egress_rp at 32.63000, -110.17000. |
| 73 | What's the elevation at egress_rp? | ELEVATION_POINT | Elevation = 1331 m |
| 74 | Create a line from -110.230, 32.560 to -110.170, 32.630 and call it egress_route | CREATE / LIST | Created entity egress_route — egress_route (line, 2 vertices) on the map. |
| 75 | How long is egress_route in kilometers? | LENGTH | Length = 9.601 km (9601 m) |
| 76 | Does egress_route pass through manpads_wez? We are not flying back out through the threat. | CROSSES | crosses(a,b) = FALSE |
| 77 | Compute the least cost path from hlz_charlie to egress_rp and call it masked_egress | LEAST_COST_PATH | Least-cost path = 404 cells |
| 78 | How long is masked_egress in kilometers? | LENGTH | Length = 12.28 km (1.228e+04 m) |
| 79 | Pull an elevation profile along masked_egress. | PROFILE_LINE | Elevation profile = 128 stations over 12269 m, min 1303 m / max 1501 m |
| 80 | Does masked_egress cross threat_2_ring? | CROSSES | crosses(a,b) = TRUE |
| 81 | Buffer masked_egress by 500 meters as the egress corridor and call it egress_corridor | BUFFER_LAYER | Line/area buffer |
| 82 | Mark the CASEVAC handoff point at -110.165, 32.625 and call it casevac_hp | CREATE / LIST | Created entity casevac_hp — casevac_hp at 32.62500, -110.16500. |
| 83 | What's the distance from egress_rp to casevac_hp, in kilometers? | DISTANCE | Distance = 726.8 m |
| 84 | What's the slope at casevac_hp? Confirming the second bird can set down. | SLOPE_POINT | Slope = 2.25° |
| 85 | Create a line from -110.170, 32.630 to -110.165, 32.625 and call it casevac_leg | CREATE / LIST | Created entity casevac_leg — casevac_leg (line, 2 vertices) on the map. |
| 86 | How long is casevac_leg in kilometers? | LENGTH | Length = 0.7269 km (726.9 m) |
| Section 9 — Consolidated recovery package | |||
| 87 | Find the centroid of search_area and call it search_center | CENTROID | Centroid |
| 88 | How far is search_center from survivor, in meters? | DISTANCE | Distance = 5.2 m |
| 89 | Draw the convex hull around survivor, hlz_charlie, gt_overwatch, and ingress_ip and call it recovery_hull | CONVEX_HULL_POINTS | Convex hull |
| 90 | What's the area of recovery_hull in square kilometers? | AREA | Area = 3.127 km² (3.127e+06 m²) |
| 91 | Union threat_1_ring and threat_2_ring into combined_threat | DISSOLVE_ENTITIES | Union/dissolve |
| 92 | What's the area of combined_threat in square kilometers? | AREA | Area = 25.00 km² (2.500e+07 m²) (sum of 2 features — total area, overlaps not dissolved) |
| 93 | Union manpads_wez and combined_threat into total_threat | DISSOLVE_ENTITIES | Union/dissolve |
| 94 | What's the area of total_threat in square kilometers? | AREA | Area = 75.01 km² (7.501e+07 m²) (sum of 3 features — total area, overlaps not dissolved) |
| 95 | Does recovery_hull overlap total_threat? I want to know how much of our working area is under threat. | OVERLAP | overlaps(a,b) = TRUE |
| 96 | What's the bounding box of survivor, hlz_charlie, gt_overwatch, and egress_rp? | BBOX | bbox of 4 entities computed |
| 97 | Reproject survivor to UTM zone 12N for the nine-line. | REPROJECT | To EPSG:32612 → (570878, 3602762) |
| 98 | Reproject hlz_charlie to UTM zone 12N. | REPROJECT | To EPSG:32612 → (572286, 3602772) |
| 99 | Reproject masked_ingress to UTM zone 12N. | REPROJECT_LAYER | Reprojected 1 feature(s) to EPSG:32612 |
| 100 | Reproject recovery_hull to UTM zone 12N. | REPROJECT_LAYER | Reprojected 1 feature(s) to EPSG:32612 |
| 101 | Generate contours around hlz_charlie every 10 meters for the HLZ card. | CONTOUR | 1143 contour lines |
| 102 | List everything on the map so I can confirm the recovery package is complete. | CREATE / LIST | 29 entities confirmed on map |
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.
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.
| Typical LLM agent loop | ForgeMind compiler | |
|---|---|---|
| What the LLM does | Plans and executes, reasons about geometry directly | Extracts intent into a typed IR, nothing more |
| Where math happens | Inside the model's reasoning (unverifiable) | Deterministic engine · GPU-accelerated ForgeGIS |
| Failure mode | Plausible, confident, wrong | Explicit refusal. Never a fabricated number |
| Cost / latency | Many model calls per task | One intent pass, then deterministic execution |
| Auditability | Opaque chain of thought | Inspectable IR for every single turn |
102 dependent operations in one session with no context reset, no entity drift, and a 29-node dependency graph held intact end to end.
A full CSAR scenario planned from plain-English requests. No GIS menus, no scripting, no coordinate wrangling beyond stating them once.
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.
Zero failed and zero confident-wrong results across the entire run, because the model never executes. It only declares intent that deterministic machinery verifies.
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.
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.