GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!
Watch the launch videoWatchFlight 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:
- Input Processing: Receives flight data including weather conditions, aircraft specifications, crew information, and passenger/cargo manifest.
- Weight Calculations: Computes total passenger weight, cargo load, and estimated takeoff weight.
- Weather Eligibility: Evaluates wind speed and visibility against safety requirements and aircraft limitations.
- Aircraft Eligibility: Assesses maintenance status and fuel reserves for airworthiness.
- Crew Eligibility: Verifies rest compliance and sufficient staffing levels.
- Weight Verification: Confirms takeoff weight is within aircraft's maximum limitation.
- 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.
Flight Dispatch Request
inputA 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"
}
}Weight Calculations
expressionBefore 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.
len(manifest.passengers)$.totalPassengers * 85manifest.cargoWeightaircraft.emptyWeight + $.totalCargo + $.passengerWeightWeight Eligibility
tableOne 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.
| TakeoffWeightestimatedTakeoffWeight | WeightFlagdispatch.weight.flag | WeightReasondispatch.weight.reason |
|---|---|---|
| > aircraft.maxTakeoffWeight | false | 'Aircraft exceeds maximum takeoff weight' |
| - | true | 'Weight within acceptable limits' |
Crew Eligibility
tableLegality 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.
| CrewRestCompliantcrew.restCompliant | CrewCountlen(crew.members) | CrewFlagdispatch.crew.flag | CrewReasondispatch.crew.reason |
|---|---|---|---|
| false | - | false | 'Crew rest requirements not met' |
| - | < 2 | false | 'Insufficient crew members' |
| - | - | true | 'Crew requirements satisfied' |
Aircraft Eligibility
tableAirworthiness 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.
| MaintenanceRequiredaircraft.maintenanceRequired | FuelReservesaircraft.fuelReserves | AircraftFlagdispatch.aircraft.flag | AircraftReasondispatch.aircraft.reason |
|---|---|---|---|
| true | - | false | 'Aircraft requires maintenance' |
| - | < 1 | false | 'Insufficient fuel reserves' |
| - | - | true | 'Aircraft is operational' |
Weather Eligibility
tableWind 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.
| WindSpeedweather.windSpeed | Visibilityweather.visibility | WeatherFlagdispatch.weather.flag | WeatherReasondispatch.weather.reason |
|---|---|---|---|
| > 45 | < 10000 | false | 'Extreme wind and low visibility' |
| > 45 | - | false | 'Winds exceed aircraft limitations' |
| > 35 | < 5000 | false | 'High winds with low visibility' |
| - | < 1000 | false | 'Visibility below minimum requirements' |
| - | - | true | 'Weather conditions acceptable' |
Dispatch Summary
expressionThe 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.
all(values(dispatch), #.flag)filter(values(dispatch), #.flag == false)$.isDispatchable ? 'Flight is cleared for dispatch' : 'Flight dispatch denied'filter(keys(dispatch), dispatch[#].flag == false)Other Aviation templates
View all templatesDynamic Airline Ticket Pricing Engine
Automated fare optimization system that sets ticket prices based on time to departure, seat availability, market demand, and competitor pricing.
AviationBooking Personalization System
Dynamic flight booking platform that tailors UI, discounts, and features based on customer loyalty status, device type, booking history, and traffic source.
AviationFlight Ancillary Recommendations
Data-driven system that personalizes travel add-on recommendations based on customer profile, route details, and previous purchasing behavior.
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.