description: Clean 3-step buffer workflow — Rome zone expansion

description: Create initial Rome centro zone

description: Buffer 200m

description: Buffer 500m

explanation: All three steps contain valid closed polygons. Chain should reach length 3 with no rejection.

difficulty: easy


description: Clean 5-step Terna grid zone analysis workflow

description: Create Terna distribution zone boundary

description: Buffer 300m for safety exclusion

description: Clip to municipality boundary

description: Simplify for rendering

description: Final zone geometry

explanation: Five clean steps. All geometries valid. Chain length should be 5.


description: Self-intersecting bowtie at genesis — rejected immediately

description: Create zone (INVALID: self-intersecting bowtie)

description: Buffer (never reached)

explanation: Genesis geometry is a bowtie — edges cross. GEIANT GeometryGuard rejects at step 0 before any node is created.


description: Unclosed ring at genesis — missing closing coordinate

description: Create zone (INVALID: ring not closed)

explanation: Polygon ring has 4 coordinates but last != first. Classic LLM error — model generates [A,B,C,D] instead of [A,B,C,D,A]. Rejected at genesis.


description: Valid start, self-intersection injected at step 2 of 4

description: Create Rome zone

description: Buffer 200m

description: Merge with adjacent zone (INVALID: agent produced self-intersecting result)

description: Simplify (never reached)

explanation: Steps 0-1 succeed and create 2 memory nodes. Step 2 produces invalid geometry — GEIANT rejects mutation, preserving the valid chain at length 2. The corruption is caught before it enters the graph.

difficulty: medium


description: Valid start, unclosed ring injected at step 3 of 5

description: Create Terna zone

description: Buffer

description: Clip

description: Merge (INVALID: unclosed ring)

description: Simplify (never reached)

explanation: Three valid nodes created before error. Step 3 mutation rejected. Graph preserves 3-node chain. Agent receives structured error with suggestion to close the ring.


description: LLM hallucinated coordinate (lng=200) at step 1

description: Create Rome zone

description: Buffer result (INVALID: LLM hallucinated lng=200)

explanation: Step 1 geometry has longitude=200 which is outside WGS84 bounds (-180 to 180). Classic LLM coordinate hallucination — model invents coordinates that look plausible but are geographically impossible.


description: Coordinate transposition at step 2 — lat/lng swapped

description: Create Rome zone

description: Buffer

description: Reprojection result (INVALID: coordinates appear transposed)

explanation: Agent reprojects polygon but swaps lat/lng order. Coords like [41.89, 12.46] instead of [12.46, 41.89]. GEIANT heuristic detects the swap and returns a suggestion with the corrected coordinate order.


description: Rome zone drifts to Milan over 3 steps — boundary crossing detected

description: Create Rome zone

description: Transform toward Bologna

description: Final position in Milan — boundary crossed

explanation: All three geometries are individually valid. But the centroid moves from Rome (41.9°N, 12.5°E) to Milan (45.5°N, 9.2°E) — ~480km. H3 cell overlap drops to <5%, triggering territory_boundary_crossed breadcrumb at step 2.


description: ADVERSARIAL: Near-degenerate polygon — valid but suspicious

description: Create Rome zone

description: Simplify result — near-degenerate but technically valid

explanation: Near-degenerate polygon (width ~0.0000001 degrees = ~1cm) is technically valid GeoJSON — passes all validation checks. This is a known limitation of pure geometry validation without semantic context. Future: area threshold check.

difficulty: adversarial


description: ADVERSARIAL: 10-step workflow, error at random middle step

description: Step 0: Create

description: Step 1: Buffer

description: Step 2: Clip

description: Step 3: Simplify

description: Step 4: Re-buffer

description: Step 5: INJECTED BOWTIE — mid-workflow corruption

description: Step 6: (never reached)

description: Step 7: (never reached)

description: Step 8: (never reached)

description: Step 9: (never reached)

explanation: 10-step workflow. Error injected at step 5. GEIANT should build a 5-node chain (steps 0-4), then reject step 5. The adversarial test: without GEIANT, the corrupted geometry silently enters the workflow and corrupts all downstream steps.