Skip to content

Aerospace MRO — Feature Showcase & Test Guide

Tenant DB: aerospace | Schema: scenario
MRO = Maintenance, Repair & Overhaul. Demand is driven by aircraft fleet activity, not customer orders.
Living document — add examples as new features are validated.


Table of Contents

  1. Fleet & Asset Model
  2. Causal BOM — Position-Aware Parts Requirements
  3. Failure Rate Waterfall (4-Level Specificity)
  4. Expiry Dates — Chemical/Consumable MRO Items
  5. Repair Loop (OH Bad → Repair → OH Good)
  6. AOG (Aircraft on Ground) Forward Depot
  7. Multi-Asset-Type Cross-Use (Shared LRUs)
  8. Regional Warehouse Network
  9. Failure Rate → Indirect Demand Calculation

1. Fleet & Asset Model

What it shows: Individual aircraft assets deployed at specific locations. Each asset has a type (determines BOM), a serial number, an airline owner (encoded in asset_id), and a deployment site.

Asset ID Type Serial Airline Deployed at
AFL-A320-001 Airbus A320neo F-HXAA Air France (AFL) Regional Warehouse London Heathrow (site 205)
AFL-A320-002 Airbus A320neo F-HXAB Air France (AFL) Regional Warehouse London Heathrow (site 205)
DLH-B737-001 Boeing 737 MAX 8 D-AMAA Lufthansa (DLH) AOG Forward Depot Frankfurt (site 302)
IBE-A321-001 Airbus A321XLR EC-NXA Iberia (IBE) Regional Warehouse London Heathrow (site 205)
SIA-A350-001 Airbus A350-900 9V-SGA Singapore Airlines (SIA) Regional Warehouse Singapore (site 207)
UAE-A350-001 Airbus A350-900 A6-XAA Emirates (UAE) Regional Warehouse Dubai (site 206)

Asset ID convention: {ICAO_code}-{type_abbrev}-{sequence} — e.g. AFL-A320-001 = Air France, first A320neo.

Test Steps:

  1. Navigate to /causalAssets tab.
  2. Verify the table shows the 6 aircraft listed above with their serial numbers and deployment sites.
  3. Filter by asset_type = "Airbus A320neo" → should show AFL-A320-001, AFL-A320-002.
  4. Filter by airline ICAO code "UAE" → should show the A350-900 at site 206 (Dubai).
  5. Confirm DLH-B737-001 is at AOG Forward Depot Frankfurt (site 302), not at the regional warehouse.

Where to look:
/causal → Causal Forecasting page → Assets tab → table of all assets with deployment sites.
Filter by asset_type to see all A320neos together.

📸 Screenshot: Causal Forecasting → Assets tab showing 6 aircraft with their serial numbers and deployment sites.


2. Causal BOM — Position-Aware Parts Requirements

What it shows: Which parts each aircraft type needs, how many per aircraft, whether they are LRUs, their repair yield, and their position on the airframe. Position-awareness enables failure rate specificity (global → position-level waterfall).

Airbus A320neo BOM (asset_type_id=1):

Part P/N Qty/Aircraft LRU Repair Yield Sub-Assembly Position
Hydraulic Spoiler Actuator Parker 66-39840 (item 11) 1 each 70% left_wing outboard
Hydraulic Spoiler Actuator Parker 66-39840 (item 11) 1 each 70% left_wing inboard
Hydraulic Spoiler Actuator Parker 66-39840 (item 11) 1 each 70% right_wing outboard
Hydraulic Spoiler Actuator Parker 66-39840 (item 11) 1 each 70% right_wing inboard
Nose Landing Gear Assembly (item 14) Messier B787 Type 1 85% nose_gear nose
Nose Gear Tire Michelin Air X (item 30) 18x5.75 10PR 2 100%

Boeing 737 MAX 8 BOM (asset_type_id=3):

Part Qty/Aircraft LRU Repair Yield Position
Carbon Brake Assembly Meggitt B737 MAX (item 15) 4 60% main_gear left
Carbon Brake Assembly Meggitt B737 MAX (item 15) 4 60% main_gear right
Hydraulic Filter Element Parker 944839 (item 20) 3 100%
TCAS II Processor ACSS T2CAS (item 4) 1 100%

Key insight — repair yield: Carbon Brake (item 15) has repair_yield=0.60 — only 60% of removed brakes can be repaired and returned to stock. 40% are scrapped and must be bought new. This directly affects the OH Bad → Repair flow in the supply plan: if 10 brakes are removed, only 6 come back as good stock.

Test Steps:

  1. Navigate to /causalBOM tab.
  2. Filter by asset_type = "Boeing 737 MAX 8".
  3. Confirm item 15 (Carbon Brake Assembly) appears twice — once for main_gear left, once for main_gear right, qty=4 each, repair_yield=0.60.
  4. Filter by asset_type = "Airbus A320neo" → confirm item 11 (Hydraulic Spoiler Actuator) appears 4 times across left_wing/right_wing × inboard/outboard positions.
  5. Note repair_yield=0.70 for item 11 vs 0.60 for item 15 — higher scrappage rate for brakes.

Where to look:
/causal → Causal Forecasting → BOM tab → filter by asset_type = "Boeing 737 MAX 8" → see item 15 with qty=4 per aircraft at both main_gear positions.

📸 Screenshot: BOM tab showing 737 MAX 8 with Carbon Brake × 4 at main_gear left/right, repair_yield=0.60.


3. Failure Rate Waterfall (4-Level Specificity)

What it shows: Failure rates follow a 4-level specificity waterfall: global → position → site+position → asset+position. The most specific available rate wins.

Current data — global rates only (site_id, asset_id, position all NULL):

Item Failure Rate Notes
Engine Oil Mobil Jet Oil II 1qt (item 16) 0.0046 /flight-hr (highest variant) 4 global rates — different usage types
Engine Oil Mobil Jet Oil II 1qt (item 16) 0.0044, 0.0042, 0.0040 Rate varies by usage_type
Nose Gear Tire Michelin Air X (item 30) 0.003833, 0.003667 2 global rates
O-Ring Assortment Parker MIL-P-5315 (item 18) 0.003450 1 global rate

Engine Oil has 4 rates because it has different consumption rates per usage_type (e.g. flight hours vs. cycles vs. calendar). The causal model multiplies failure_rate × fleet_activity × qty_per_aircraft to derive indirect demand.

Waterfall resolution example:
If asset AFL-A320-001 has a position-specific failure rate for item 11 at left_wing/outboard, that rate wins over the global rate. If not found → falls back to position-level rate → then global. Current DB only has global level → all aircraft use the same rate regardless of age/operator.

Test Steps:

  1. Navigate to /causalFailure Rates tab.
  2. Confirm all rows have NULL for asset_id, site_id, and position (global level only).
  3. Filter by item_id=16 (Engine Oil) → should show 4 rows with different usage_type_ids and rates 0.0040–0.0046.
  4. Filter by item_id=30 (Nose Gear Tire) → should show 2 rows.
  5. Note: adding a position-specific rate (e.g. asset_id=AFL-A320-001, position=outboard) would override the global rate for that specific case — currently none exist.

Where to look:
/causal → Failure Rates tab → all rows show NULL for asset_id/site_id/position = global level.

📸 Screenshot: Failure Rates tab showing item 16 with 4 rows, all asset_id/site_id/position = NULL (global).


4. Expiry Dates — Chemical/Consumable MRO Items

What it shows: Aviation chemicals and fluids have strict shelf-life limits (regulatory requirement). Stock must be consumed or scrapped before expiry.

Item Site Qty Expiry Days remaining
Fuel System Sealant PR1440C-B2 310ml (item 21) Regional Warehouse Frankfurt (site 202) 18.8 units 2026-05-08 ~20 days
Hydraulic Fluid Skydrol LD-4 5L (item 17) Regional Warehouse Singapore (site 207) 20 units 2026-05-22 ~34 days

Critical: Fuel System Sealant at Frankfurt expires 2026-05-08 — within the next 20 days. If not consumed by then, it becomes OH Bad and cannot be used. The system should flag this as an upcoming expiry exception.

Planning implication: Short-shelf-life items need consumption-paced replenishment. Ordering too far in advance creates write-off risk. The EOQ model does not natively account for shelf life — this must be handled via max_qty constraints on the route or segment-level parameter overrides.

Test Steps:

  1. Navigate to /series/21_202 (Fuel System Sealant × Frankfurt).
  2. Click the Supply tab → Planning Grid → Inventory section.
  3. Observe the OH Good row — it starts at 18.8 units and drops to 0 at the expiry week (~week 3).
  4. At the same week, OH Bad should increase by ~18.8 units (expired stock).
  5. Navigate to /series/17_207 (Hydraulic Fluid × Singapore) — same pattern with 20 units expiring ~week 5.
  6. Check the Supply chart for both series — look for the vertical cliff drop in the OH Good line at the expiry week.

Where to look:
/series/21_202 → Supply tab → Planning Grid → Inventory section → OH Good drops to 0 around week 3 (expiry cutoff).

📸 Screenshot: /series/21_202 planning grid showing OH Good cliff-drop at the expiry week.


5. Repair Loop (OH Bad → Repair → OH Good)

What it shows: Removed LRUs that are repairable enter a "repair loop": they become OH Bad stock, are sent to repair (Repair Out order), and return as OH Good stock after repair TAT (Turn-Around Time). Repair yield determines how many come back.

Carbon Brake Assembly (item 15) at Boeing 737 MAX 8: - Repair yield = 0.60 → 40% scrapped, 60% returned as OH Good - 4 brakes per aircraft × 2 aircraft positions × fleet activity = significant repair flow - Repair TAT determines the lag between Repair Out and incoming repaired stock

Hydraulic Spoiler Actuator (item 11) on A320neo: - 4 positions × repair_yield = 0.70 → 30% must be purchased new each cycle - Position-specific (left_wing/right_wing, inboard/outboard) → failure rate can be set per position

Test Steps:

  1. Find a series for item 15 (Carbon Brake) at a site with a deployed B737 MAX 8 (site 302 — AOG depot).
  2. Navigate to /series/15_302Supply tab.
  3. In the inventory projection chart, identify:
  4. Blue area: OH Good (usable stock)
  5. Red area at bottom: OH Bad (removed brakes awaiting repair)
  6. Repair incoming bars: units returning from repair after TAT
  7. In Planning Grid → Incoming section → Repair row → verify units arrive some weeks after removal (TAT lag).
  8. In the Orders panel → filter by type REPAIR → see individual repair work orders with release_week and arrival_week separated by the repair TAT.
  9. Verify: if 10 brakes removed, only 6 return (60% yield) → remaining 4 must be purchased new (BUY orders for the shortfall).

Where to look:
/series/15_302 → Supply tab → chart (red OH Bad at bottom) + Planning Grid Repair row + Orders filtered by REPAIR.

📸 Screenshot: Supply chart showing red OH Bad area at bottom, blue OH Good above, with "Repair" incoming bars representing units returning from repair shop.


6. AOG (Aircraft on Ground) Forward Depot

What it shows: Site 302 "AOG Forward Depot Frankfurt" is a forward-positioned emergency stock point. It holds Lufthansa's B737 MAX 8 (DLH-B737-001). AOG situations require same-day part availability — the depot pre-positions critical LRUs to avoid grounding an aircraft.

Deployment: Asset DLH-B737-001 (D-AMAA, Lufthansa, 737 MAX 8) is at site 302 — AOG depot rather than a regional warehouse. This means: - Lead time from this depot to the aircraft = near-zero - Safety stock at the depot must cover AOG probability × cost of grounding - AOG cost per day is tracked in causal_asset_type.aog_cost_per_day

Test Steps:

  1. Navigate to /causalAssets tab.
  2. Find DLH-B737-001 (D-AMAA) — confirm its deployment site is AOG Forward Depot Frankfurt (site 302), not the regional Frankfurt warehouse (site 202).
  3. Navigate to /meio → filter by site_id=302 — check that MEIO assigns a high fill rate to critical LRUs at this depot.
  4. Compare fill rates for the same item at site 302 (AOG depot) vs site 202 (regional warehouse) — the depot should have higher fill rates.

Where to look:
/causal → Assets tab → DLH-B737-001 deployment site = "AOG Forward Depot Frankfurt".

📸 Screenshot: Asset table showing DLH-B737-001 deployed at "AOG Forward Depot Frankfurt" distinct from the regional warehouses.


7. Multi-Asset-Type Cross-Use (Shared LRUs)

What it shows: Some LRUs are used across multiple aircraft types. This creates shared demand pools and allows cross-fleet stock balancing.

Items used by ALL aircraft types (A320neo, A321XLR, 737 MAX 8, A350-900, 777-300ER):

Item Used by
Hydraulic Filter Element Parker 944839 (item 20) A321XLR, 737 MAX 8, A350-900, 777-300ER
TCAS II Processor ACSS T2CAS (item 4) A321XLR, 737 MAX 8, A350-900, 777-300ER

Planning implication: A single stock pool of item 20 at a regional warehouse serves 4 aircraft types. Demand is the sum of failure rates × fleet counts × usage for each type. If one airline grounds a fleet, the shared stock benefits other airlines.

Test Steps:

  1. Navigate to /causalBOM tab.
  2. Filter by item_id=20 (Hydraulic Filter Parker 944839) — should appear in 4 rows for A321XLR, 737 MAX 8, A350-900, 777-300ER.
  3. Filter by item_id=4 (TCAS II Processor) — same 4 asset types.
  4. Navigate to /series/20_205 (Hydraulic Filter × London Heathrow) — click Forecast tab → Indirect Demand overlay shows demand from multiple aircraft types combined.
  5. Verify total indirect demand is the sum of (qty_per_asset × deployed_fleet × failure_rate × usage_rate) across all asset types at that site.

Where to look:
/causal → BOM tab → filter by item_id=20 → appears in 4 rows (one per asset type).

📸 Screenshot: BOM tab with item 20 (Hydraulic Filter) appearing for A321XLR, 737 MAX 8, A350-900, and 777-300ER rows.


8. Regional Warehouse Network

Sites in the aerospace network:

Site Type Key aircraft
Regional Warehouse London Heathrow (site 205) Regional hub AFL A320neo ×2, IBE A321XLR
Regional Warehouse Frankfurt (site 202) Regional hub DLH 737 MAX 8 (forward deployed to AOG depot)
Regional Warehouse Dubai (site 206) Regional hub UAE A350-900
Regional Warehouse Singapore (site 207) Regional hub SIA A350-900
AOG Forward Depot Frankfurt (site 302) AOG depot DLH-B737-001

Test Steps:

  1. Navigate to /causalCoverage tab.
  2. Verify the matrix shows all 5 sites × relevant assets.
  3. Site 302 (AOG Forward Depot) should appear as a distinct entry from site 202 (Regional Frankfurt).
  4. Navigate to each regional warehouse's series detail to confirm the supply network spans only within regional scope (no cross-continental transfers).

Where to look:
/causal → Coverage tab → matrix of asset × site coverage percentages.


9. Failure Rate → Indirect Demand Calculation

How the math works (example):

Item 30: Nose Gear Tire Michelin Air X 18x5.75 10PR
  BOM: 2 tires per A320neo
  Deployed A320neos at site 205: 2 (AFL-A320-001, AFL-A320-002)
  Failure rate: 0.003833 /flight-hr
  Fleet usage: e.g. 80 flight-hrs/week per aircraft

  Indirect demand/week = qty_per_asset × fleet_qty × failure_rate × usage_rate
                       = 2 × 2 × 0.003833 × 80
                       = 1.227 tires/week at site 205

This indirect demand replaces/supplements the statistical forecast for these items — the causal model is always more accurate than a time-series model for MRO parts because it is driven by physics (failure rates) not history patterns.

Test Steps:

  1. Navigate to /series/30_205 (Nose Gear Tire × London Heathrow).
  2. Click the Forecast tab.
  3. Toggle Indirect Demand on — the causal demand line (physics-based) appears alongside the statistical forecast.
  4. Verify the causal demand is smooth (constant rate driven by fleet usage) vs the statistical line which shows historical noise.
  5. Calculate manually: 2 tires/aircraft × 2 aircraft × 0.003833 /flight-hr × 80 hrs/wk ≈ 1.23 tires/week — confirm this matches the causal forecast level.
  6. Navigate to /series/16_205 (Engine Oil × London Heathrow) — the 4 usage-type failure rates should combine into a single total indirect demand.

Where to look:
/series/30_205 → Forecast tab → Indirect Demand toggle → causal vs statistical comparison.

📸 Screenshot: Forecast chart for item 30 showing causal demand (solid) vs statistical baseline (dashed), with causal being smoother and physics-based.


Last updated: 2026-04-25