- A storm grounds an airline hub. 53 downstream flights lose their crew. The usual fix is a 4 to 12 hour manual scramble under FAA Part 117 and union rules. We built an advisor that returns a legal recovery plan in ~0.11 seconds. The trick isn't the solver. 🧵
- Everyone selling AI into airline ops claims a smarter optimizer. We built that, then benchmarked it against CBC, a mature MIP solver. CBC won. So we changed the claim, not the numbers: we use the solver, we don't beat it.
- Because in an IROPS meltdown the solver was never the problem. Recovery is too slow (the 4 to 12h scramble), too risky (one Part 117 or CBA violation is a compliance event), and too opaque: the cascade isn't visible until flights are already cancelling.
- So we put the regulation where it can't be broken: in column generation. Part 117 (780 min duty, 480 min flight time, 30 min sit) and a sample CBA (max 4 segments) are enforced when candidate duties are built. An illegal duty is never generated.
- That's the counterintuitive part for OR folks. Don't penalize illegal moves in the objective, make them impossible to produce. On the seeded storm that yields 1,762 legal recovery duties (52 deadhead repositions) plus 53 cancel fallbacks: 1,815 candidate columns.
- CBC then solves an 1,815-variable, 115-constraint min-cost set-partition to OPTIMAL: cover every open flight once, use each crew at most once. Status RECOVERED in ~0.11s. 52 of 53 flights re-crewed, 1 cancellation, 34 crews used. Legality verified: 0 illegal.
- 0 illegal isn't a score we hit, it's an invariant. No column entering the solver is illegal, so no solver or LLM choice downstream can break Part 117. It's unit-tested (3/3 pass). A legality guarantee belongs in deterministic code, not a model's judgment.
- Now the honest hard case. Toggle a severe event, reserves exhausted, ~30% of crews left. CBC still returns a legal plan in ~0.05s, but it would cancel 20 of 53 flights (38%), over the 15% auto-approve threshold. Status flips to ESCALATE, human sign-off required.
- That's the part most autonomous pitches skip: knowing when the day is bad enough that the right move is not to auto-approve, but to hand a controller a legal, flagged plan and let them own the call. Escalate, don't silently auto-approve a bad day.
- Full disclosure: the network, crews, and disruption are synthetic and seeded. The legality mask and CBC are real code; the 4 to 12h manual benchmark is externally sourced. It augments a Jeppesen/IBS-style stack in shadow mode. It doesn't replace it.
- For the OR crowd: when a hard constraint is non-negotiable, do you enforce it in column generation (mask it out) or as constraints and penalties in the model, and why? We landed on masking. Curious where you'd draw the line. #OperationsResearch #MIP #AirlineOps #IROPS
- The runnable demo, the interactive blast-radius dashboard, and the signed recovery_plan.json audit artifact are all here: veriprajna.com/demos/airline-crew-scheduling-ai
Published on X · July 31, 2026
On social media
See this post on its original platform
In our archive