description: Grid task in Rome — direct match to grid@rome-zone-1

expected_country: IT

explanation: grid@rome-zone-1 covers Rome at res-5, tier trusted >= observed required. Direct match.

difficulty: easy


description: Finance task in Zurich — FINMA jurisdiction, certified required

expected_country: CH

explanation: finance@swiss is certified and covers Zurich. finance@milan is only trusted — below required certified tier.

difficulty: medium


description: Health task in Berlin — GDPR + EU AI Act, certified agent available

expected_country: DE

explanation: health@eu-north covers Berlin, tier certified > trusted required. GDPR caps autonomous agents at trusted — certified is within limits.


description: Compliance audit in Berlin — sovereign agent, GDPR jurisdiction

explanation: compliance@berlin is sovereign tier — exceeds GDPR maxAutonomyTier of trusted. Router should warn but route — sovereign agent operating within certified task requirement.

difficulty: hard


description: Finance task near CH/IT border — Lugano area

explanation: Geneva resolves to CH (Switzerland), not IT. FINMA governs. finance@swiss covers the territory.


description: Legal task in London — UK GDPR post-Brexit, no EU AI Act

expected_country: GB

explanation: UK is post-Brexit — UK GDPR applies, NOT EU GDPR or EU AI Act. legal@london covers the territory.


description: Grid task in Naples — only provisioned agent available

explanation: grid@naples exists but is only provisioned tier. Task requires trusted. Router rejects with tier_insufficient.


description: Environment task in Singapore — no environment agent covers SG

expected_country: SG

explanation: environment@eu territory is in France/EU. Singapore is outside its H3 territory. No eligible ant.


description: Finance task in New York — no finance agent covers US territory

expected_country: US

explanation: Both finance agents cover EU territory only. New York is outside all registered territories.


description: Task in Atlantic Ocean — no jurisdiction resolvable

expected_country: XX

explanation: Atlantic Ocean H3 cell has no country mapping. Router cannot resolve jurisdiction. Task rejected at Gate 2.


description: Sovereign grid agent in Rome — GDPR caps at trusted

explanation: Task requires sovereign tier but task is in Rome under GDPR. GDPR maxAutonomyTier=trusted prevents dispatch of sovereign agents for most task types. No eligible ant below sovereign threshold.


description: Health task in São Paulo — LGPD jurisdiction, no local agent

expected_country: BR

explanation: health@eu-north covers Germany, not Brazil. LGPD governs in São Paulo. No agent covers South America.


description: ADVERSARIAL: Task cell in IT but agent claims CH territory — jurisdiction mismatch

explanation: Task originates in Rome (IT) but the only finance agent covers Zurich (CH). Territory mismatch — no eligible ant. This tests that H3 territory containment is enforced, not self-reported.

difficulty: adversarial


description: ADVERSARIAL: Agent tier self-reported as certified but ops count = 10

explanation: Router trusts the registered manifest tier. Tier/ops-count consistency is enforced at registration time by validateManifestStructure(), not at routing time. This is by design — the registry is the trust boundary.


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.


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.


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.


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.


description: Valid delegation — grid task in Rome, cert covers Rome territory

explanation: Human @cayerbe delegates to grid@rome-zone-1. Time window active, Rome cell in scope, facet matches, depth 0 <= max 1.


description: Valid delegation — finance task in Zurich, FINMA jurisdiction

explanation: FINMA jurisdiction. Cert depth 2 allows sub-delegation. All checks pass.


description: Valid multi-facet delegation — grid + compliance in Rome

explanation: Cert grants multiple facets. Task facet=compliance is included.


description: Expired cert — valid_until 7 days ago

explanation: Cert valid_until is 7 days ago. Router rejects at Gate 3 with cert_expired.


description: Not-yet-valid cert — valid_from 7 days in the future

explanation: Cert valid_from is 7 days in the future. Not yet active. Prevents pre-signed cert abuse.


description: Task in Rome but cert only covers Milan territory

explanation: Cert scope_cells covers Milan. Task originates in Rome. Rome H3 cell not in scope_cells.


description: Cross-border scope violation — cert covers IT only, task in CH

explanation: Human authorized agent for Milan (IT) but task originates in Zurich (CH). FINMA requires explicit Swiss authorization.


description: Task facet=health but cert only grants grid + finance

explanation: Health facet not in scope_facets. Health is sensitive data — must be explicitly authorized.


description: Legal task without explicit legal facet authorization

explanation: All facets granted EXCEPT legal. Legal tasks carry high liability — must be explicitly granted.


description: Sub-delegation depth exceeded — cert allows depth=0

explanation: max_subdelegation_depth=0 — agent cannot further delegate. Sub-delegation rejected.


description: Deep sub-delegation chain — depth=3 allowed, task arrives at depth=4

explanation: Chain: human→A→B→C→D = depth 4. Max is 3. Prevents unbounded delegation chains.


description: ADVERSARIAL: Cert covers superset scope — task in exact boundary cell

explanation: Cert includes Rome + one Milan cell. Task in Rome. Rome cell IS in scope. Valid superset.


description: ADVERSARIAL: Cert expired by exactly 1 millisecond

explanation: Cert expired 1ms ago. No grace periods. Expiry enforced to the millisecond.


description: ADVERSARIAL: Agent handle in cert does not match selected agent

explanation: Cert authorizes grid@milan-impersonator but task dispatched to grid@rome-zone-1. Handle mismatch — cert is for a different agent.


description: ADVERSARIAL: Recycled cert — issued 14 days ago, still technically valid

explanation: Cert valid_until is still future. Technically valid. Phase 0 has no revocation. Future: epoch-based invalidation.