Skip to main content
Glama
wasomma

fpv-sim-mcp

by wasomma

Compare two configurations over the same seeds

compare_configs
Read-only

Run paired simulations of two configurations over identical seeded engagements to compare win rates and outcome changes, returning deltas and a plain-language summary for testing doctrine questions.

Instructions

Run two CONFIG variants over the SAME consecutive seed range (a paired experimental design: terrain and emplacement luck cancel out, so a few hundred seeds resolve real effect differences) and return each variant's aggregate statistics, the paired outcome deltas, the seeds whose outcome flipped, and a plain-language summary generated from those numbers. Use it to test doctrine questions, e.g. what happens to win rates when OPFOR adopts EMCON discipline. Max count 500.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNoEngagement plan. "orbit" (default): one FPV per side holds a forward orbit while the DF nodes build the fix. "tactical": each side pushes a package of one-way strike sorties into a shared objective (OBJ TANTO), its GCS emitting sortie by sortie, while a reserved hunter-killer launches on the fix; can end in the STALEMATE reason packages_expended. Same terrain, sensors and fix math either way; the same seed gives the same emplacement in both modes.
countYesNumber of consecutive seeds run under BOTH variants.
label_aNoHuman-readable name for variant A.
label_bNoHuman-readable name for variant B.
config_aYesVariant A overrides (may be {} for the stock configuration).
config_bYesVariant B overrides (may be {} for the stock configuration).
start_seedYesDeterministic engagement seed. The same seed always replays the identical engagement. Featured orbit seeds: 20260719 (standard BLUFOR win), 66 (fast BLUFOR win), 57 (deliberate BLUFOR win), 41 (OPFOR win), 59 (close race, OPFOR). Featured tactical seeds: 12 (standard BLUFOR win), 26 (fast BLUFOR win), 5 (final-push BLUFOR win), 18 (close race, BLUFOR), 41 (OPFOR win), 14 (stalemate).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv0.3.0
    • addedInput schema / properties / config_a / properties / DRONE / properties / EDGE_MARGIN_M
      Added value: +{
      +  "description": "Commanded steering points are confined this far inside the AO edge, so flight turns back ahead of the boundary. Unit: m. Default 150, range [50, 500].",
      +  "maximum": 500,
      +  "minimum": 50,
      +  "type": "number"
      +}
    • addedInput schema / properties / config_a / properties / DRONE / properties / SEARCH_CEP_MULT
      Added value: +{
      +  "description": "Maximum search radius as a multiple of the current fix CEP (floored at ACQ_RANGE_M). Unit: multiplier. Default 2, range [1, 5].",
      +  "maximum": 5,
      +  "minimum": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / config_a / properties / DRONE / properties / SEARCH_MAX_R_M
      Added value: +{
      +  "description": "Absolute cap on the search radius; a completed no-joy pattern re-sweeps from the center. Unit: m. Default 650, range [200, 2000].",
      +  "maximum": 2000,
      +  "minimum": 200,
      +  "type": "number"
      +}
    • addedInput schema / properties / config_a / properties / DRONE / properties / SEARCH_MPS
      Added value: +{
      +  "description": "Visual-search airspeed over the fix area when nothing is acquired at the fix point. Unit: m/s. Default 24, range [5, 60].",
      +  "maximum": 60,
      +  "minimum": 5,
      +  "type": "number"
      +}
    • addedInput schema / properties / config_a / properties / DRONE / properties / SEARCH_RING_M
      Added value: +{
      +  "description": "Ring spacing per revolution of the expanding search orbit; keep it under ACQ_RANGE_M so successive rings overlap visually. Unit: m. Default 170, range [40, 600].",
      +  "maximum": 600,
      +  "minimum": 40,
      +  "type": "number"
      +}
    • removedInput schema / properties / config_a / properties / DRONE / properties / TERMINAL_SEARCH_GROW
      Removed value: -{
      -  "description": "Expanding-search radius growth when nothing is acquired at the fix point. Unit: m/s. Default 22, range [5, 60].",
      -  "maximum": 60,
      -  "minimum": 5,
      -  "type": "number"
      -}
  2. Changed4 schema fields changedv0.2.3
    • addedInput schema / properties / config_a / properties / TACTICAL
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "AIM_SIGMA_M": {
      +      "description": "1-sigma scatter of strike aim points about the objective center. Unit: m. Default 90, range [10, 400].",
      +      "maximum": 400,
      +      "minimum": 10,
      +      "type": "number"
      +    },
      +    "LAUNCH_INTERVAL_S": {
      +      "description": "Nominal spacing between strike launches. Unit: s. Default 90, range [10, 600].",
      +      "maximum": 600,
      +      "minimum": 10,
      +      "type": "number"
      +    },
      +    "LAUNCH_JITTER_S": {
      +      "description": "+/- uniform jitter on the launch spacing, drawn per sortie at reset. Unit: s. Default 20, range [0, 120].",
      +      "maximum": 120,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "OBJ_RADIUS_M": {
      +      "description": "Objective radius; strike aim points are scattered inside it. Unit: m. Default 260, range [60, 800].",
      +      "maximum": 800,
      +      "minimum": 60,
      +      "type": "number"
      +    },
      +    "OBJ_X": {
      +      "description": "Contested objective easting (nominal; jittered per seed like the emplacements). Unit: m. Default 1830, range [400, 3600].",
      +      "maximum": 3600,
      +      "minimum": 400,
      +      "type": "number"
      +    },
      +    "OBJ_Y": {
      +      "description": "Contested objective northing (nominal; jittered per seed like the emplacements). Unit: m. Default 1975, range [400, 3600].",
      +      "maximum": 3600,
      +      "minimum": 400,
      +      "type": "number"
      +    },
      +    "PILOTS": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "BLUFOR": {
      +          "description": "Pilot stations at this side's GCS = max FPVs airborne at once, one C2 link each (floored at 1 by the engine). Unit: count. Default 2, range [1, 6].",
      +          "maximum": 6,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "OPFOR": {
      +          "description": "Pilot stations at this side's GCS = max FPVs airborne at once, one C2 link each (floored at 1 by the engine). Unit: count. Default 2, range [1, 6].",
      +          "maximum": 6,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "RESERVE_HUNTER": {
      +      "description": "Hold one extra FPV back as the dedicated GCS hunter-killer. false: the next unflown strike airframe is retasked when the fix commits (and there is no final push once the package is expended). Boolean. Default true.",
      +      "type": "boolean"
      +    },
      +    "SORTIES": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "BLUFOR": {
      +          "description": "Strike airframes in this side's package (one-way; expended on impact). Unit: count. Default 5, range [1, 12].",
      +          "maximum": 12,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "OPFOR": {
      +          "description": "Strike airframes in this side's package (one-way; expended on impact). Unit: count. Default 5, range [1, 12].",
      +          "maximum": 12,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "STRIKE_TERMINAL_M": {
      +      "description": "A strike sortie hands from autonomous transit to manual terminal control this far from its aim point (manual control keys the uplink continuously). Unit: m. Default 380, range [100, 1500].",
      +      "maximum": 1500,
      +      "minimum": 100,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / config_b / properties / TACTICAL
      Added value: +{
      +  "$ref": "#/properties/config_a/properties/TACTICAL"
      +}
    • addedInput schema / properties / mode
      Added value: +{
      +  "description": "Engagement plan. \"orbit\" (default): one FPV per side holds a forward orbit while the DF nodes build the fix. \"tactical\": each side pushes a package of one-way strike sorties into a shared objective (OBJ TANTO), its GCS emitting sortie by sortie, while a reserved hunter-killer launches on the fix; can end in the STALEMATE reason packages_expended. Same terrain, sensors and fix math either way; the same seed gives the same emplacement in both modes.",
      +  "enum": [
      +    "orbit",
      +    "tactical"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / start_seed / description
      Previous value: -"Deterministic engagement seed. The same seed always replays the identical engagement. Featured seeds: 20260719 (standard BLUFOR win), 66 (fast BLUFOR win), 57 (deliberate BLUFOR win), 41 (OPFOR win), 59 (close race, OPFOR)."New value: +"Deterministic engagement seed. The same seed always replays the identical engagement. Featured orbit seeds: 20260719 (standard BLUFOR win), 66 (fast BLUFOR win), 57 (deliberate BLUFOR win), 41 (OPFOR win), 59 (close race, OPFOR). Featured tactical seeds: 12 (standard BLUFOR win), 26 (fast BLUFOR win), 5 (final-push BLUFOR win), 18 (close race, BLUFOR), 41 (OPFOR win), 14 (stalemate)."
  3. First observedv0.2.0

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already covers the safety profile, and the description adds useful behavioral context: the paired-seed rationale, the artifact list returned, and the count cap. It does not contradict the annotation, and the added detail goes beyond what readOnlyHint alone provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all high-signal: purpose and output list in the first, a concrete use case in the second, and the operational limit in the third. There is no filler or redundant elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the necessary work of telling the caller what will be returned. It also explains the experimental design, gives a representative use case, and caps the seed count. Combined with the highly detailed input schema, an agent has enough context to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameter semantics are already documented in the input schema. The description's references to same consecutive seeds and max count of 500 largely restate schema constraints rather than adding new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Run two CONFIG variants over the SAME consecutive seed range') and clearly identifies the tool's resource and experimental design. It also enumerates the concrete outputs (aggregate statistics, paired deltas, flipped seeds, plain-language summary), making it easy to distinguish from single-run or unpaired sweep tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool for doctrine questions and explains why the paired same-seed design is appropriate ('terrain and emplacement luck cancel out'). It does not explicitly name alternatives such as run_engagement or sweep_seeds or state when not to use this tool, so it falls just short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.