4 ready-to-build workflows

AI agent workflows for Drone services & aerial survey

Pre-check permissions, hold weather windows, pre-filter thousands of frames and turn flight logs into deliverables — with every flight-safety, regulatory and client commitment human-signed.

Each recipe below is expressed only in VegaDūta's real workflow building blocks — Trigger, Agent, Knowledge, Condition, Approval, Output, Tool (MCP), Voice, Device, Loop, Code and Parallel — so it maps 1:1 to something you can assemble in the Workflow designer. Consequential actions always pass a human Approval step.

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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
  • Email
  • Slack
  • WhatsApp
  • 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 agent1 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.

2. Weather-window watch → reschedule proposal, client-confirmed

Today: the survey is booked for Thursday in a shared Google Calendar. Nobody looks at the forecast until Wednesday night, when the ops coordinator opens a weather app on their phone, squints at gust figures against a wind limit they half-remember, and starts calling — the pilot, the client's site contact, then the crew WhatsApp group to move the 4am departure. Half the time the decision is made too late, the crew drives three hours, stands in the wind for two, and drives back. The client hears about it from the crew, in the field, which is the worst possible place to renegotiate a date.

Trigger: Webhook (scheduled watch on upcoming missions)

How the workflow runs

  1. Trigger

    Watch the booked missions. A scheduled Webhook trigger runs against the upcoming mission list — so the forecast is checked every cycle from booking onward, not once, panicking, the night before.

  2. Loop

    Map: check each mission's window. A Loop node runs a cheap agent per upcoming mission, so watching forty bookings costs the same per item as watching four.

  3. Code

    Compare against the airframe's real limits. A Code node runs the operator's user-defined SpEL tool over the forecast and the airframe's documented gust limit to produce a hard flyability band — the number the coordinator was half-remembering on their phone, made deterministic.

  4. Agent

    Assess flyability with the full picture. The per-mission agent takes the computed band plus visibility, precipitation, cloud base and light window against the limits in the airframe Knowledge collection, returning FLYABLE / MARGINAL / NOT_FLYABLE with the specific figures it used.

  5. Condition

    Marginal or worse?. A Condition node lets FLYABLE missions pass silently — no notification noise, so the alerts stay credible — and pushes MARGINAL and NOT_FLYABLE onward for a reschedule proposal.

  6. Agent

    Propose the next viable window. A second agent proposes alternative slots that satisfy the forecast limits, the site's access hours and crew availability, ranked, each with the reason it clears the limits.

  7. Approval

    Ops approves before the client hears anything. An Approval node holds the reschedule proposal. Moving a booked mission is a client commitment and a crew-cost decision — ops approves the option before a single message goes out, so the client is never renegotiating with a crew standing in a field.

  8. Output

    Offer it to the client. An Output node sends the approved options to the client on WhatsApp or Email with the plain reason, and on their pick a Tool (MCP) node updates the mission record and Slack notifies the crew.

Channels & connectors

  • Webhook
  • WhatsApp
  • Email
  • Slack
  • Tool (MCP → scheduling tool)
  • Tool (MCP → weather service)
  • Approval / HITL

Outcome

Marginal weather is caught days out with a ranked, limit-checked alternative already drafted, and no client is told anything until ops has approved the move — instead of a Wednesday-night phone tree and a wasted Thursday.

Why it helps

The cost of a weather scrub is mostly travel and a lost crew day, and both are avoidable only if the call is made early. Running the check continuously from booking onward, and grounding flyability in the airframe's documented limits via a deterministic formula rather than a remembered number, is the mechanism — the commitment to the client still waits for a human.

Build spec

2 agents1 flyability checker (runs once per upcoming mission per watch cycle via the Loop node) + 1 reschedule proposer (runs only for marginal-or-worse missions). The wind banding, the approval and the calendar write are workflow nodes. · Pattern: Map (cheap per-mission check) → Condition filter → proposer on the exceptions only → human approves the client-facing move

System prompt (paste-ready)

(Flyability checker) Assess ONE booked drone mission's weather window. Inputs: mission {site_coords, window_start, window_end, airframe}, the forecast for that site and window, the computed wind band, and the airframe's operating limits from your Knowledge collection. Return strict JSON {verdict (FLYABLE|MARGINAL|NOT_FLYABLE), limiting_factors[{factor (WIND_MEAN|WIND_GUST|VISIBILITY|PRECIP|CLOUD_BASE|LIGHT), forecast_value, limit_value}], confidence_note}. Compare ONLY against the documented limits — never soften a limit, never average a gust away, never override the computed wind band, and never mark FLYABLE on a missing forecast field (return MARGINAL with the gap named). You do not reschedule or contact anyone.

Agent roles & model tiers

  • Flyability checker (per mission, per watch cycle) Economy tier with a fallback model — it runs across every upcoming mission on every cycle, making it by far the highest-volume step here and the dominant cost lever twice over

    Combine the computed wind band with visibility, precipitation, cloud base and light against documented limits, and return FLYABLE / MARGINAL / NOT_FLYABLE with the exact figures. Missing forecast data ⇒ MARGINAL, never FLYABLE.
  • Reschedule proposer (exceptions only) Standard tier — multi-constraint reasoning across forecast, site access hours and crew availability; it only ever runs on missions the Condition node flagged

    Propose ranked alternative windows that clear the documented limits and fit the site's access hours and crew availability, each with the reason it clears. Propose only — never message the client, never write the calendar.

MCP connectors

  • Scheduling / crew-roster tool — via Tool (MCP): list upcoming missions with their site, window, airframe and assigned crew, read crew availability for candidate slots, and write the approved reschedule back to the mission record. The watch cycle is fired by a scheduled Webhook. No first-party connector.
  • Weather / forecast service — via Tool (MCP): fetch the point forecast for the site coordinates across the planned window, including mean and gust wind, visibility, precipitation probability, cloud base and civil light times. No first-party connector.
  • WhatsApp / Email — first-party client channels for the approved options.
  • Slack — first-party crew notification channel.

Built-in tools

  • knowledge_search (scoped to the airframe operating-limits + per-site access-conditions collection)
  • http_request (forecast pull, mission list, mission update)
  • user-defined tool `wind_band` (SpEL): input.gustForecast == null ? 'MARGINAL' : (input.gustForecast >= input.airframeGustLimit ? 'NOT_FLYABLE' : (input.gustForecast >= input.airframeGustLimit * 0.8 ? 'MARGINAL' : 'FLYABLE')) — arithmetic and a ternary over the tool's JSON input, nothing more: no API calls, no loops. It matters because the operator's own safety margin (here, 80% of the airframe limit) is a decision they should own explicitly rather than hope a model applies consistently; the margin sits in the expression, is identical on every mission, and can be tightened for a new airframe without a developer.

Guardrails

  • No client is contacted and no booking is moved until ops approves at the Approval node — the agents propose windows, they never commit one
  • Flyability is decided strictly against documented airframe limits, with the wind margin applied by the tenant's SpEL formula; the agent is forbidden from softening a limit, averaging away a gust, or overriding the computed band
  • A missing or partial forecast yields MARGINAL, never FLYABLE — the absence of bad news is not treated as good news, and a null gust value is banded MARGINAL by construction
  • FLYABLE missions produce no notification at all, so the alerting stays credible instead of becoming background noise the crew learns to ignore
  • The mission write-back is keyed to the mission id, so repeated watch cycles cannot create duplicate reschedules

Cost strategy

This runs on a schedule, so per-run cost multiplies by CYCLES as well as by missions — which is exactly why the checker sits on the economy tier with a hard cap and a fallback model. The expensive proposer only runs on missions the Condition node flagged, so a settled week of good weather costs almost nothing. The wind banding is a free SpEL evaluation rather than an inference. If you want more value, widen the watch window before you upgrade the checker's model — earlier warning is worth more than a smarter forecast reader.

Output & delivery

The scheduled watch loops the economy-tier checker over every upcoming mission, with the SpEL wind band computed first → the Condition node lets FLYABLE pass silently and forwards the rest → the standard-tier proposer drafts ranked alternative windows → ops approves at the Approval node → an Output node offers the options to the client on WhatsApp/Email, and on their pick a Tool (MCP) node updates the mission and Slack notifies the crew.

3. Defect detection on solar farms & towers — cheap pre-filter, expert second pass, human sign-off (3 agents)

Today: a single solar-farm or tower inspection comes back with thousands of thermal and RGB frames on an SD card. A junior analyst scrubs through them in a viewer for two days, marking anything that looks warm, writing 'String 14, module 7 — hotspot?' into an Excel sheet with a screenshot pasted in the next column, and matching frames to actual modules by counting rows on a site map PDF. By hour six they are tired, so the report either misses a real hotspot or floods the client with false positives — and either way it lands a week after the flight, when the crew is on another site.

Trigger: Webhook (flight imagery uploaded / processing job complete)

How the workflow runs

  1. Trigger

    Imagery lands. A Webhook fires when the flight's imagery finishes uploading or the processing job completes. The imagery store and photogrammetry pipeline have no first-party connector — the workflow is notified via Webhook and reads assets through a Tool (MCP) node.

  2. Loop

    Map: pre-filter every frame. A Loop node runs a cheap vision pre-filter over every frame, keeping only those with a plausible anomaly. This is the step that replaces two days of scrubbing — and the step that makes the whole recipe affordable.

  3. Parallel

    Batch the pre-filter for wall-clock speed. A Parallel node runs the pre-filter in batches — same per-frame cost, a fraction of the elapsed time on a multi-thousand-frame set.

  4. Agent

    Expert pass on the survivors only. A stronger vision agent examines only the flagged frames, classifying the defect against the client's asset taxonomy in a scoped Knowledge collection (PV: hotspot, cracked cell, soiling, string outage; towers: corrosion, loose fixing, antenna misalignment, obstruction) with a severity and its visual reasoning.

  5. Tool (MCP)

    Locate it on the real asset. A Tool (MCP) node resolves each finding to the actual asset — string/module id, tower leg and level — by joining the frame's geotag and the flight log against the GIS/asset registry. This is the counting-rows-on-a-PDF step, done by a spatial join.

  6. Code

    Rank with the client's own severity rule. A Code node applies the operator's user-defined SpEL tool to turn defect type and severity into the priority band that client's contract actually uses — different clients band the same hotspot differently, and that is a commercial fact, not a model judgement.

  7. Agent

    Draft the findings report. A third agent composes the client report: findings grouped by band and asset, each with its frame reference and resolved location, and an explicit list of areas the flight did not adequately cover.

  8. Approval

    Inspection lead signs off every finding. An Approval node holds the report. A defect call drives maintenance spend and a missed one is a liability — a qualified inspector confirms, downgrades or rejects each finding before anything reaches the client.

  9. Output

    Deliver the signed report. On sign-off, an Output node emails the report to the client and a Tool (MCP) node files it against the asset registry with the sign-off recorded.

Channels & connectors

  • Webhook
  • Email
  • Knowledge base
  • Tool (MCP → imagery / photogrammetry pipeline)
  • Tool (MCP → GIS & asset registry)
  • Approval / HITL

Outcome

Thousands of frames become a short list of located, severity-banded findings with an explicit coverage-gap list, every one confirmed by a qualified inspector — days earlier, and without anyone counting rows on a site-map PDF.

Why it helps

Two-stage vision is the whole point: a cheap pass removes the overwhelming majority of empty frames so the expensive, accurate pass only ever looks at candidates. That is what makes reviewing every single frame affordable at all — where a tired human on hour six was effectively sampling. The human sign-off is what keeps a model's defect call from silently becoming a maintenance work order.

Build spec

3 agents1 vision pre-filter (runs once per frame via the Loop node) + 1 expert classifier (flagged frames only) + 1 report writer (once). Loop, Parallel, the asset join, the severity banding and the sign-off are workflow nodes. · Pattern: Two-stage vision funnel: cheap per-frame filter → expert pass on survivors → client-specific banding → report writer → qualified human signs off every finding

System prompt (paste-ready)

(Pre-filter) Look at ONE inspection frame. Your ONLY job is to decide whether it plausibly contains an anomaly worth an expert look. Return strict JSON {candidate (true|false), hint (THERMAL_ANOMALY|SURFACE_DAMAGE|STRUCTURAL|OBSTRUCTION|NONE), frame_ref, unusable (true|false)}. Be deliberately generous: a false positive costs one extra expert call, a false negative loses a real defect — when uncertain, return candidate=true. Do NOT classify the defect, do NOT assign severity, do NOT name an asset. If the frame is unusable (blurred, over-exposed, obscured), return candidate=false with unusable=true so coverage can be reported honestly.

Agent roles & model tiers

  • Vision pre-filter (per frame) Economy tier, vision-capable, with a fallback model and a hard token cap — it runs on EVERY frame, so it alone determines whether the recipe is affordable, and a mid-batch provider outage must not orphan a flight

    Binary candidate/not-candidate per frame, biased toward false positives. No classification, no severity, no asset naming. Flag unusable frames so coverage gaps are reported.
  • Expert defect classifier (candidates only) Premium tier, vision-capable — the hard step, affordable precisely because it only ever sees the small surviving fraction

    Classify each candidate frame against the client's asset taxonomy in the scoped Knowledge collection, with defect type, severity and the visual reasoning. Return UNCERTAIN rather than guessing; never infer a defect from context outside the frame.
  • Report writer (once) Standard tier — synthesis and client-facing writing, one call per inspection

    Group the confirmed findings by the computed priority band and by asset, cite each frame reference and resolved location, and list explicitly the areas the flight did not adequately cover. Never add a finding that is not in the classifier output, and never soften or upgrade a severity.

MCP connectors

  • Imagery store / photogrammetry + orthomosaic pipeline — via Tool (MCP): list the flight's frames, fetch individual frames and their EXIF geotags for the vision passes, and read the processed orthomosaic reference for the report. Completion is announced by Webhook. No first-party connector.
  • GIS + asset registry — via Tool (MCP): spatially join a frame's geotag and the flight log to the actual asset id (PV string and module, or tower leg and level) and return the asset's metadata, replacing manual row-counting on a site-map PDF. No first-party connector.
  • Client asset-management system — via Tool (MCP): file the signed report against each affected asset with the inspector's sign-off recorded. No first-party connector.
  • Email — first-party channel for delivering the signed report to the client.

Built-in tools

  • knowledge_search (scoped to the per-client asset taxonomy + defect severity rubric collection)
  • http_request (fetch frames and the flight log, resolve geotags against the registry, file the signed report)
  • user-defined tool `defect_priority_band` (SpEL): input.severity == 'HIGH' && input.assetCriticality == 'PRIMARY' ? 'P1' : (input.severity == 'HIGH' || (input.severity == 'MEDIUM' && input.assetCriticality == 'PRIMARY') ? 'P2' : 'P3') — a pure formula over the tool's JSON input, with no API access and no loops. It matters because two clients band the same hotspot differently depending on what the asset feeds and what their contract says; keeping that mapping in a tenant-authored expression means the commercial rule is explicit, identical across every finding in a report, and editable per client without a developer or a redeploy.

Guardrails

  • No finding reaches the client without the inspection lead confirming, downgrading or rejecting it at the Approval node — a model defect call is never a work order
  • The pre-filter is prompt-biased toward false positives: an extra expert call is cheap, a missed defect is not
  • The expert classifier may return UNCERTAIN and must not infer a defect from anything outside the frame it was given
  • Priority banding comes from the tenant's SpEL rule, so the model never quietly re-prioritises a client's contractual severity mapping
  • Unusable frames (blur, over-exposure, obstruction) are tracked and reported as coverage gaps — the report says what was NOT adequately inspected, so silence is never mistaken for a clean bill
  • The report writer cannot add findings or shift a severity beyond the classifier output; the report is grouped, not reinterpreted
  • Findings are keyed to frame reference and resolved asset id, so a re-processed flight cannot duplicate a defect against an asset

Cost strategy

This is the clearest tiering case in the guide. The pre-filter runs on EVERY frame — thousands per flight — so it must be the cheapest vision-capable model available, hard-capped, with a fallback so a mid-batch outage does not orphan the flight; that one choice sets the cost of the whole recipe. The premium classifier is affordable precisely because it only ever sees the small surviving fraction, and the report writer runs once. Inverting this (premium on every frame) is what makes full-coverage review economically impossible — which is why the manual process quietly became sampling. Parallel batching cuts elapsed time without touching per-frame cost, and the priority banding is a free SpEL evaluation.

Output & delivery

The Loop and Parallel nodes run the economy-tier pre-filter across every frame → surviving candidates go to the premium classifier → a Tool (MCP) node resolves each finding to a real asset via the geotag, flight log and GIS registry → the Code node bands priority with the client's own SpEL rule → the writer drafts the report with an explicit coverage-gap section → the inspection lead signs off each finding at the Approval node → an Output node emails the signed report and a Tool (MCP) node files it against the asset registry with the sign-off recorded.

4. Flight log → deliverable pipeline with a completeness gate

Today: the crew lands, copies the cards to a laptop in the van, and uploads over a hotel wifi that night. Whether the capture is actually good enough is a judgement someone makes by opening a few frames and going 'looks fine'. The GCP sheet is a photo of a paper form in the crew WhatsApp group. Two weeks later the client rejects the orthomosaic because overlap was short over the north-east corner — and by then the crew, the site access window and the weather are all gone, so the reflight is at the operator's cost and the client relationship takes the hit.

Trigger: Webhook (flight log + imagery uploaded from the field)

How the workflow runs

  1. Trigger

    Crew uploads the flight. A Webhook fires when the flight log and imagery are uploaded from the field — so the check happens that night, while the crew is still near the site, not a fortnight later.

  2. Code

    Deterministic capture checks first. A Code node does the arithmetic before any model runs: frame count vs planned waypoints, geotag presence, altitude and overlap consistency, GCP records, battery-swap gaps in the log. Facts that can be computed are computed, not inferred.

  3. Code

    Score the shortfall with the operator's own formula. A second Code node runs the user-defined SpEL tool to convert measured overlap against the contracted spec into a shortfall percentage and a reflight scope band — the operator's tolerance, encoded once, applied identically to every flight.

  4. Agent

    Explain the gaps against the job spec. An Agent node compares the computed capture picture against the contracted deliverable spec in a scoped Knowledge collection (product type, GSD, coverage polygon, accuracy class) and states plainly whether the capture supports the promised deliverable, and exactly where it does not.

  5. Condition

    Completeness gate. A Condition node blocks the pipeline on any material gap — a partial capture never quietly proceeds into processing and becomes a deliverable that fails on the client's desk instead of yours.

  6. Approval

    Survey lead approves the reflight or the commitment. An Approval node holds both branches: authorising a reflight (crew cost, another window) and, on a clean capture, committing to the deliverable and its date. Both are client and cost commitments — a human owns them.

  7. Sub-workflow

    Kick the processing run. On approval of a clean capture, a Sub-workflow node starts the processing/deliverable run and tracks it to completion, keeping this workflow readable rather than nesting the whole pipeline inline.

  8. Output

    Tell the client what is actually happening. An Output node sends the approved message on Email or WhatsApp — either the confirmed deliverable and date, or the honest reflight reason and the revised date, while it is still cheap to fix.

Channels & connectors

  • Webhook
  • Email
  • WhatsApp
  • Slack
  • Knowledge base
  • Tool (MCP → photogrammetry / processing pipeline)
  • Approval / HITL

Outcome

Every flight is checked against its contracted deliverable spec the night it lands, so gaps surface while the crew and the site access window are still reachable — and no deliverable date is promised without a survey lead approving it.

Why it helps

A capture gap is cheap to fix on the day and expensive to fix a fortnight later, at the operator's cost. Doing the deterministic checks the moment the data lands, banding the shortfall with the operator's own tolerance, and refusing to let a partial capture slide into processing is what moves the discovery earlier — the reflight decision and the client commitment stay human because both spend real money.

Build spec

1 agent1 capture-assessment agent. The arithmetic (Code nodes + SpEL tool), the completeness gate, the approvals and the processing run (Sub-workflow) are workflow nodes — the numbers are computed, not reasoned. · Pattern: Deterministic Code checks → operator tolerance formula → agent explains against the spec → completeness gate → human approves reflight or deliverable commitment → Sub-workflow processes

System prompt (paste-ready)

You assess whether a completed drone flight supports its CONTRACTED deliverable for {{operator}}. Inputs: the computed capture summary {frames, planned_waypoints, geotagged_pct, mean_overlap, overlap_shortfall_pct, altitude_variance, gcp_count, log_gaps[]} and the job spec from your Knowledge collection {product, target_gsd, coverage_polygon, accuracy_class}. Return {supports_deliverable (true|false|UNCLEAR), gaps[{area_or_metric, computed_value, spec_value, consequence}], reflight_scope (NONE|PARTIAL|FULL), plain_summary}. Use ONLY the computed numbers you were given — never estimate coverage, overlap or GSD yourself, never recompute a shortfall, and never restate a computed figure differently. If a required metric is missing, return UNCLEAR and name it. You do not authorise a reflight, start processing, or promise a delivery date.

Agent roles & model tiers

  • Capture-vs-spec assessor Standard tier with a fallback model — one call per flight, reasoning over a small computed summary rather than over imagery, so it stays cheap without dropping a tier; the fallback matters because this check is time-critical while the crew is still near the site

    Compare the computed capture summary to the contracted spec, name every gap with its computed and required value and the consequence, and scope the reflight. Never recompute or estimate a metric; a missing metric yields UNCLEAR.

MCP connectors

  • Field upload / imagery store — inbound Webhook announces the upload; via Tool (MCP): read the flight log, frame manifest, geotag coverage and GCP records for the deterministic checks. No first-party connector.
  • Photogrammetry / processing pipeline — via Tool (MCP): submit the flight for processing with the contracted product and accuracy class, then poll the orthomosaic/point-cloud job to completion. No first-party connector.
  • Scheduling tool — via Tool (MCP): book the approved reflight against the site and crew, keyed to the original mission id. No first-party connector.
  • Email / WhatsApp — first-party client channels for the confirmed date or the reflight message.
  • Slack — first-party crew notification channel.

Built-in tools

  • knowledge_search (scoped to the contracted deliverable specs, accuracy classes and capture SOP collection)
  • http_request (read the flight log and capture metrics, submit and poll the processing job, book a reflight)
  • user-defined tool `overlap_shortfall_pct` (SpEL): input.meanOverlap == null ? -1 : (input.specOverlap - input.meanOverlap) / input.specOverlap * 100 — arithmetic over the tool's JSON input, no method calls and no loops, with -1 as an explicit 'not measured' sentinel that routes to UNCLEAR instead of a false pass. It matters because overlap tolerance is where operators genuinely differ by product and client, and this is precisely the number a model must never eyeball; the formula makes it identical across every flight and adjustable by the survey lead without a developer.
  • user-defined tool `reflight_scope_band` (SpEL): input.shortfallPct < 0 ? 'UNCLEAR' : (input.shortfallPct <= 0 ? 'NONE' : (input.shortfallPct < input.partialThresholdPct ? 'PARTIAL' : 'FULL')) — so the crew-cost decision is scoped by the operator's own threshold rather than by a model's sense of 'material'.

Guardrails

  • The agent never authorises a reflight, starts processing or promises a date — the Approval node gates both the reflight (crew cost) and the deliverable commitment (client promise)
  • All capture metrics are computed deterministically in Code nodes and the tenant's SpEL formulas; the agent may only explain them, never recompute, estimate or restate them differently
  • The completeness gate blocks processing on any material gap — a partial capture cannot slide through and become a failed client deliverable two weeks later
  • A missing required metric yields the sentinel value and routes to UNCLEAR for a human, rather than being reasoned into a pass
  • The processing run is started only once per flight id via the Sub-workflow node, so a re-uploaded flight cannot double-bill a processing job

Cost strategy

Cheap by construction: the expensive work — counting frames, checking geotags, measuring overlap, banding the shortfall — is deterministic Code and SpEL, not model inference, so exactly ONE standard-tier call per flight reads a small computed summary. Resist the temptation to have a model 'look at the imagery' to judge coverage; that inverts this recipe's cost profile for a worse answer. Per-flight cost stays flat as frame counts grow, because it never scales with imagery volume.

Output & delivery

The Code nodes compute the capture metrics and the operator's shortfall band the moment the upload lands → the agent explains them against the contracted spec → the Condition node's completeness gate blocks any material gap → the survey lead approves either the scoped reflight or the deliverable commitment at the Approval node → a Sub-workflow node submits and tracks the processing job → an Output node tells the client the confirmed deliverable and date, or the honest reflight reason and revised date, on Email/WhatsApp with the crew notified on Slack.

Related industries

Build one of these in minutes

The sandbox gives you a live agent workspace — no account, no card. Or head back to the full catalogue and compare patterns across every industry.

See how VegaDūta compares to n8n, Dify and BotpressWhy VegaDūta's architectureEstimate your WhatsApp API costs