1. Pre-flight permission & airspace pre-check (agents assemble, the pilot signs)
Today: the crew is loading the van at 5am and the pre-check is a WhatsApp exchange — 'permission still valid na?', 'ha, checked last month'. The zone check was done on a phone browser standing in the yard, the airframe's insurance and the pilot's currency dates live in a Google Sheet that one person maintains, and the client's own site conditions ('no flying over the tank farm, escort required past gate 3') are buried in an email chain from six weeks ago. Nothing is written down for this specific flight. It is fine every time until the one time it is not, and then there is no record of what anyone actually checked.
Trigger: Webhook (mission scheduled) / Email (client booking confirmed)
How the workflow runs
- Trigger
Mission is scheduled. A Webhook from the scheduling tool (or an Email confirming a client booking) fires with the site coordinates, planned date/time, airframe and assigned pilot — so the pre-check starts when the mission is booked, not in the yard at 5am.
- Parallel
Run the checks side by side. A Parallel node runs the independent lookups at once — airspace/zone classification, permission and airframe/pilot validity, and the client's own site access conditions — so the pre-check is one wait, not three sequential ones.
- Tool (MCP)
Pull the regulatory + registry facts. Tool (MCP) nodes query the airspace/permission portal and the airframe/pilot registry. There is NO first-party connector for DGCA-style permission portals, airspace services or registries — each is reached over MCP or an inbound Webhook, and the workflow treats their output as evidence to show a human, never as clearance.
- Knowledge
Apply the operator's own SOP. A Knowledge node scoped to your operations manual grounds the check in airframe-specific limits, client-site conditions and the internal rules that are stricter than the baseline regulation — the email chain, made searchable and current.
- Code
Band the expiries deterministically. A Code node runs the operator's user-defined SpEL tool over the returned validity fields to label each as EXPIRED / RENEW_SOON / VALID. Dates are arithmetic, not a judgement call, and this keeps them out of the model entirely.
- Agent
Assemble the pre-flight brief. An Agent node assembles the evidence into a single brief: each check with its source and timestamp, an explicit list of anything unverified, and the blockers first — never a clearance verdict of its own.
- Condition
Anything unverified or blocking?. A Condition node routes any missing, stale or blocking check to the top of the brief; an unverified item is never quietly dropped or treated as passed.
- Approval
Pilot-in-command signs off. An Approval node holds the go/no-go. This is a flight-safety and regulatory decision — the pilot-in-command owns it, with the assembled brief in front of them. The workflow never issues clearance.
- Output
Attach the signed brief to the mission. On sign-off, an Output node files the brief against the mission record and sends it to the crew on Slack, WhatsApp and Email — so what was checked, when, from which source and by whom is auditable afterwards.
Channels & connectors
- Webhook
- Slack
- Knowledge base
- Tool (MCP → airspace / permission portal)
- Tool (MCP → airframe & pilot registry)
- Approval / HITL
Outcome
Every mission carries a timestamped, source-cited pre-flight brief with an explicit unverified list, signed off by the pilot-in-command before the van leaves — instead of a WhatsApp 'ha, checked'.
Why it helps
The risk in a pre-check is not the flying, it is the checks quietly skipped under time pressure and the ones that silently went stale in someone's spreadsheet. Assembling every source with its timestamp, computing expiries as arithmetic, and forcing unverified items to the top instead of letting them vanish is what makes the pilot's sign-off an informed one — and leaves a record. The decision itself never leaves the pilot.
Build spec
1 agent — 1 brief-assembly agent. The parallel lookups, the expiry banding (Code + SpEL tool), the blocking-item branch and the pilot sign-off are workflow nodes — deliberately, because the go/no-go must not sit inside a model. · Pattern: Parallel evidence gathering → deterministic expiry banding → assembly agent → pilot-in-command approval
System prompt (paste-ready)
You assemble a PRE-FLIGHT BRIEF for {{operator}}. You do NOT grant, imply or withhold clearance — a pilot-in-command decides that. Inputs: mission {site_coords, datetime, airframe, pilot}, airspace/zone lookup results, permission + airframe + pilot validity records with their computed expiry bands, client site conditions, and the operations manual in your Knowledge collection. Return {checks[{name, status (PASS|FAIL|UNVERIFIED), source, checked_at, note}], blockers[], unverified[], summary}. Mark UNVERIFIED — never PASS — whenever a lookup failed, returned nothing, or returned data older than the manual's freshness rule. Never infer a zone classification, a permission validity or an expiry date that was not returned, and never recompute an expiry band yourself. Never write 'cleared', 'approved to fly' or any equivalent anywhere in your output.Agent roles & model tiers
Pre-flight brief assembler — Standard tier with a fallback model — one call per mission, low volume, and faithful citation of regulatory evidence matters far more than the tier saving; the fallback exists so a provider outage never becomes a reason to fly on an unwritten check
Assemble every check with its source and timestamp, force failed or stale lookups to UNVERIFIED, surface blockers first, and never state or imply clearance.
MCP connectors
- Airspace / zone + permission portal (DGCA-style) — via Tool (MCP): classify the site coordinates against restricted/controlled zones for the planned window and fetch the operator's permission record with its validity dates. Output is treated as EVIDENCE for a human, never as clearance. No first-party connector.
- Airframe + pilot registry / currency records — via Tool (MCP): resolve the assigned airframe to its registration, insurance and maintenance validity, and the assigned pilot to their licence and currency dates. No first-party connector.
- Scheduling tool — inbound Webhook announces the mission; write-back via Tool (MCP): attach the signed brief to the mission record with the approver's identity and timestamp. No first-party connector.
- Slack / WhatsApp / Email — first-party channels for crew distribution of the signed brief.
Built-in tools
- knowledge_search (scoped to the operations manual, airframe limits and per-client site-condition collection)
- http_request (airspace/zone lookup, permission and currency validity, mission write-back)
- user-defined tool `validity_band` (SpEL): input.daysToExpiry == null ? 'UNVERIFIED' : (input.daysToExpiry <= 0 ? 'EXPIRED' : (input.daysToExpiry < input.renewWindowDays ? 'RENEW_SOON' : 'VALID')) — a formula over the tool's JSON input: no API calls, no loops, no code. It matters because an expiry is arithmetic, not an opinion, and this is exactly the fact a model should never be trusted to eyeball. The operator sets their own renewal window in the expression and changes it without a developer, and a null input yields UNVERIFIED rather than a false pass.
Guardrails
- The workflow NEVER issues clearance — the go/no-go is the pilot-in-command's decision at the Approval node, and the agent is prompt-forbidden from writing 'cleared' or any equivalent
- A failed, empty or stale lookup becomes UNVERIFIED, never PASS — unverified items are surfaced at the top of the brief and can never be silently dropped
- Expiry bands are computed by the tenant's SpEL formula, not read off by the model; a null or missing date yields UNVERIFIED by construction
- Every check carries its source and a checked_at timestamp, so the brief is auditable after the flight rather than a snapshot of nothing
- Where the operator's own manual is stricter than the baseline regulation, the manual wins — the agent grounds in the scoped Knowledge collection, not in general knowledge
- The signed brief is attached to the mission record with the approver's identity, giving a defensible trail of what was checked and who accepted it
Cost strategy
One standard-tier call per mission and no batch multiplier — volume is bounded by how many flights you actually fly, making this among the cheapest recipes here per run. Do not cheapen it further: the whole value is faithful citation of regulatory evidence, and a hallucinated zone classification is not a cost saving. The Parallel node buys wall-clock speed at zero extra model cost because the lookups are tool calls rather than agent turns, and the expiry arithmetic is a free SpEL evaluation rather than an inference.
Output & delivery
The Parallel node fires the airspace, registry and site-condition lookups at once → the Code node bands every validity date with the operator's SpEL formula → the agent assembles a source-cited brief with blockers and unverified items first → the Condition node keeps anything unverified visible → the pilot-in-command signs off at the Approval node → an Output node files the signed brief against the mission record and pushes it to the crew on Slack, WhatsApp and Email.