v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Flight Dispatch Decision System

Rules-based aviation system that evaluates weather, aircraft, crew, and weight factors to ensure regulatory compliance and safe flight operations.

Solution

This automated dispatch system ensures flight safety by analyzing multiple critical factors before approving takeoff. It checks if current weather conditions fall within aircraft operational parameters, evaluating both wind speed and visibility against specific thresholds. The system verifies aircraft readiness by confirming no pending maintenance is required and adequate fuel reserves are available. For crew validation, the system ensures all rest requirements are met and sufficient crew members are present for the specific flight.

The weight assessment component calculates total passenger weight based on headcount, adds cargo weight, and confirms the combined weight with aircraft empty weight doesn't exceed maximum takeoff limitations. When any safety parameter fails, the system provides immediate identification of the specific issue with detailed reasoning. This enables dispatchers to efficiently address problems or implement necessary restrictions, ensuring all regulatory requirements are satisfied before clearance.

How it works

The decision graph contains multiple evaluation nodes that work together:

  1. Input Processing: Receives flight data including weather conditions, aircraft specifications, crew information, and passenger/cargo manifest.
  2. Weight Calculations: Computes total passenger weight, cargo load, and estimated takeoff weight.
  3. Weather Eligibility: Evaluates wind speed and visibility against safety requirements and aircraft limitations.
  4. Aircraft Eligibility: Assesses maintenance status and fuel reserves for airworthiness.
  5. Crew Eligibility: Verifies rest compliance and sufficient staffing levels.
  6. Weight Verification: Confirms takeoff weight is within aircraft's maximum limitation.
  7. Dispatch Summary: Consolidates all evaluations and produces a final decision with detailed reasoning.

Where teams use it

  • Commercial airline flight operations
  • Charter flight services
  • Cargo transport operations
  • Flight schools and training centers
  • Private aviation management
  • Military flight operations

Inside the decision model

Flight Dispatch Decision System ships as a JDM decision graph with 7 nodes, 4 decision tables and 13 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph7 nodes · read-only
input flightDispatchRequestexpression weightCalculationstable weightEligibilitytable crewEligibilitytable aircraftEligibilitytable weatherEligibilityexpression dispatchSummary
01

Flight Dispatch Request

input

A dispatch request arrives with five top-level blocks - weather, aircraft, manifest, crew, and flight - and every safety gate downstream reads directly from fields like weather.windSpeed, aircraft.fuelReserves, and manifest.cargoWeight.

Sample requestJSON
{
  "weather": {
    "windSpeed": 90,
    "visibility": 6500,
    "precipitation": "light",
    "temperature": 15
  },
  "aircraft": {
    "emptyWeight": 41500,
    "maxTakeoffWeight": 78000,
    "fuelReserves": 1.5,
    "maintenanceRequired": false,
    "type": "B737-800"
  },
  "manifest": {
    "passengers": [
      "P001",
      "P002",
      "P003",
      "P004",
      "P005",
      "P006",
      "P007",
      "P008",
      "P009",
      "P010"
    ],
    "cargoWeight": 2500
  },
  "crew": {
    "restCompliant": true,
    "members": [
      "C001",
      "C002",
      "C003"
    ]
  },
  "flight": {
    "number": "FL123",
    "origin": "LAX",
    "destination": "JFK",
    "scheduledDeparture": "2025-03-19T08:00:00Z"
  }
}
02

Weight Calculations

expression

Before any gate runs, this step derives the load figures: totalPassengers counts manifest.passengers, passengerWeight applies a flat 85 per head, and estimatedTakeoffWeight adds aircraft.emptyWeight, totalCargo, and passengerWeight together. Using a standard mass of 85 instead of weighing individuals mirrors the standard-passenger-mass method airlines use in load planning, and the resulting figure feeds the weight gate directly.

Expressions4 fields
totalPassengerslen(manifest.passengers)
passengerWeight$.totalPassengers * 85
totalCargomanifest.cargoWeight
estimatedTakeoffWeightaircraft.emptyWeight + $.totalCargo + $.passengerWeight
03

Weight Eligibility

table

One comparison settles the load check: when estimatedTakeoffWeight exceeds aircraft.maxTakeoffWeight the flag goes false with 'Aircraft exceeds maximum takeoff weight', otherwise the flight passes with 'Weight within acceptable limits'. Comparing against certified maximum takeoff weight is exactly how load control signs off a departure, since exceeding it invalidates the performance and certification basis of the aircraft.

Decision tablefirst hit policy
TakeoffWeightestimatedTakeoffWeightWeightFlagdispatch.weight.flagWeightReasondispatch.weight.reason
> aircraft.maxTakeoffWeightfalse'Aircraft exceeds maximum takeoff weight'
-true'Weight within acceptable limits'
04

Crew Eligibility

table

Legality of the crew resolves in order: crew.restCompliant equal to false trips 'Crew rest requirements not met', a computed len(crew.members) below 2 trips 'Insufficient crew members', and otherwise the table returns 'Crew requirements satisfied'.

Rest is checked first because flight and duty time limitation schemes such as FAA Part 117 make an unrested crew member ineligible no matter how many people are rostered. The floor of 2 reflects the two-pilot flight deck required on transport-category aircraft; a production system would also count required cabin crew against seat count, so this is a deliberately minimal staffing check.

Decision tablefirst hit policy
CrewRestCompliantcrew.restCompliantCrewCountlen(crew.members)CrewFlagdispatch.crew.flagCrewReasondispatch.crew.reason
false-false'Crew rest requirements not met'
-< 2false'Insufficient crew members'
--true'Crew requirements satisfied'
05

Aircraft Eligibility

table

Airworthiness comes down to two gates evaluated with first hit ordering: aircraft.maintenanceRequired set to true fails immediately with 'Aircraft requires maintenance', then aircraft.fuelReserves below 1 fails with 'Insufficient fuel reserves', and the final row confirms 'Aircraft is operational'.

Checking open maintenance before fuel matches line-maintenance practice, where a reported defect must be cleared or deferred under the minimum equipment list before the aircraft can be released. Requiring reserves of at least 1 echoes the final-reserve idea in fuel planning, but the exact threshold is a simplified stand-in for the fuller fuel policy an operator would actually file.

Decision tablefirst hit policy
MaintenanceRequiredaircraft.maintenanceRequiredFuelReservesaircraft.fuelReservesAircraftFlagdispatch.aircraft.flagAircraftReasondispatch.aircraft.reason
true-false'Aircraft requires maintenance'
-< 1false'Insufficient fuel reserves'
--true'Aircraft is operational'
06

Weather Eligibility

table

Wind and visibility are screened together under a first hit policy, ordered from the worst combination down. A weather.windSpeed above 45 with weather.visibility under 10000 fails as 'Extreme wind and low visibility', wind above 45 alone fails because 'Winds exceed aircraft limitations', wind above 35 paired with visibility below 5000 fails as 'High winds with low visibility', and visibility below 1000 fails on its own. Only when no restrictive row matches does the catch-all set dispatch.weather.flag to true with 'Weather conditions acceptable'.

Layered wind and visibility gates mirror how dispatchers apply operating minima: strong winds alone can exceed a type's demonstrated crosswind capability, while marginal winds only become disqualifying once visibility also degrades. A hard visibility floor reflects the takeoff-minima concept from instrument procedures, though the specific 45/35 and 10000/5000/1000 breakpoints here are conservative business choices rather than values from any particular regulation.

Decision tablefirst hit policy
WindSpeedweather.windSpeedVisibilityweather.visibilityWeatherFlagdispatch.weather.flagWeatherReasondispatch.weather.reason
> 45< 10000false'Extreme wind and low visibility'
> 45-false'Winds exceed aircraft limitations'
> 35< 5000false'High winds with low visibility'
-< 1000false'Visibility below minimum requirements'
--true'Weather conditions acceptable'
07

Dispatch Summary

expression

The verdict is assembled by folding the four gates together: isDispatchable holds only when all(values(dispatch), #.flag) is true, dispatchReasons and failedCriteria collect the sections whose flag is false, and dispatchSummary renders either 'Flight is cleared for dispatch' or 'Flight dispatch denied'. Surfacing which criteria failed, not just a boolean, is what lets a dispatcher act on the result instead of re-checking every input by hand.

Expressions4 fields
isDispatchableall(values(dispatch), #.flag)
dispatchReasonsfilter(values(dispatch), #.flag == false)
dispatchSummary$.isDispatchable ? 'Flight is cleared for dispatch' : 'Flight dispatch denied'
failedCriteriafilter(keys(dispatch), dispatch[#].flag == false)

Make this template
your own.

Load Flight Dispatch Decision System into GoRules, adjust the rules to your policy, and ship it behind your own API.