Skip to Content
APIsMission Planning

Mission Planning API

Hierarchy: Mission → Flight Plans → Flight Sessions → Flight Data

Access: org_type = Asset Owner for create/update/delete (Admin+) and reads (Member+). Airspace Managers (Member+) can read missions that fall within zones they own or hold a Manager/Monitor zone membership for: access is automatically scoped to their managed zones. Permission evaluation requires org_type = Airspace Manager with a Manager membership for the target zone. See access-control.

A Mission is the high-level operational container. It covers a broad geographic envelope, names the assets and pilots involved, and holds airspace permissions for each restricted or controlled Airspace Zone the operation intersects. One or more Flight Plans are filed within a mission, each for a specific asset, pilot, and window. Flight plans inherit mission permissions by reference and apply strategic deconfliction where envelopes conflict.


Mission Endpoints Summary

EndpointMethodOperation NameDescription
/missionsPOSTCreate MissionCreate a new mission
/missionsGETGet MissionsGet all missions
/missions/\{mission_uuid\}GETGet One MissionGet specific mission details
/missions/\{mission_uuid\}PUTUpdate MissionUpdate a mission
/missions/\{mission_uuid\}DELETEDelete MissionSoft delete mission (update status to INACTIVE)
/permissions?parent_type=MISSION&parent_uuid=\{mission_uuid\}POSTCreate Mission PermissionRequest access to an airspace segment for this mission
/permissions/\{permission_uuid\}PUTUpdate Mission PermissionGrant or deny access to a specific airspace segment
/flight-plans?mission_uuid=\{mission_uuid\}POSTCreate Flight PlanCreate a flight plan under a mission
/flight-plans?mission_uuid=\{mission_uuid\}GETGet Flight PlansGet all flight plans for a mission
/flight-plans/\{plan_uuid\}GETGet One Flight PlanGet specific flight plan details
/flight-plans/\{plan_uuid\}PUTUpdate Flight PlanUpdate a flight plan
/flight-plans/\{plan_uuid\}DELETEDelete Flight PlanSoft delete a flight plan (INACTIVE)
/permissions?parent_type=FLIGHT_PLAN&parent_uuid=\{plan_uuid\}POSTCreate Flight Plan PermissionRequest access to an airspace segment for a flight plan
/permissions/\{permission_uuid\}PUTUpdate Flight Plan PermissionGrant or deny access to a specific airspace segment for flight plan
/flight-plans/logsGETGet Flight Plan LogsGet combined list of all flight plans

Create Mission

POST /missions

Create a new mission.

Request Body:

{ "mission_name": "Border Surveillance Q3", "mission_description": "Quarterly aerial surveillance along northern border sector", "start_time": "2025-07-05T06:00:00Z", "end_time": "2025-07-05T18:00:00Z", "mission_envelope": { "type": "Polygon", "coordinates": [ [ [ 77.1, 28.55 ], [ 77.2, 28.55 ], [ 77.2, 28.45 ], [ 77.1, 28.45 ], [ 77.1, 28.55 ] ] ] }, "min_height": 30, "max_height": 150, "assets": [ { "asset_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "payload_id": "payload-thermal-01", "payload_type": "thermal_sensor" }, { "asset_uuid": "b8c401c1-8f27-4a89-b9ea-89edc49ec1d4", "payload_id": "payload-cam-02", "payload_type": "camera" } ], "pilots": [ "550e8400-0000-41d4-a716-446655440000", "fd16a4a5-52a3-4f12-bf88-78b0cf7d34b2" ], "airspace_restrictions_covered": [ "ZONE-RESTRICTED-007" ] }
FieldTypeDescription
start_time / end_timetimestampOverall operational window
mission_envelopeGeoJSON PolygonBroad area for all flight plans
min_height / max_heightdoubleAltitude bounds metres AGL
assetsarray\{ asset_uuid, payload_id, payload_type \} per asset
pilotsarrayuser_uuids of assigned pilots
airspace_restrictions_coveredarrayZone UUIDs overlapped by the mission

Permissions Auto-Creation: When a mission is created, the system automatically detects intersecting airspace zones and creates permission requests for each zone. Each permission is automatically evaluated by the auto-approval engine (see Permission Auto-Approval Rules below). Operators can also manually request permissions via the permission endpoints if needed.

Responses:

  • 201 Created:
{ "message": "Mission created successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'start_time' must be before 'end_time'" }
  • 404 Not Found:
{ "error": "One or more asset or pilot UUIDs not found" }
  • 422 Unprocessable Entity:
{ "error": "'mission_envelope' must be a valid closed GeoJSON Polygon" }

Get Missions

GET /missions

Query Parameters:

ParamTypeDescription
pageint (optional)Page number (default: 1)
limitint (optional)Records per page (default: 25)

Responses:

  • 200 OK:
{ "data": [ { "mission_uuid": "a9f2aeb8-b0b2-4b9e-8d3b-61d4f37a742b", "mission_udai_id": "UDAI-MSN-0001", "mission_name": "Border Surveillance Q3", "start_time": "2025-07-05T06:00:00Z", "end_time": "2025-07-05T18:00:00Z", "min_height": 30, "max_height": 150, "asset_count": 2, "pilot_count": 2, "permissions": [ { "zone_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "zone_udai_id": "UDAI-ZON-0007", "manager_org_uuid": "f0154cf0-fef0-4c3e-b816-43e34b9cfbc1", "airspace_type": "RESTRICTED_ZONE", "permission_status": 1 }, { "zone_uuid": "b8c401c1-8f27-4a89-b9ea-89edc49ec1d4", "zone_udai_id": "UDAI-ZON-0012", "manager_org_uuid": "a1b2c3d4-e5f6-7890-1234-567890abcdef", "airspace_type": "TEMPORARY_RESTRICTED_AREA", "permission_status": 0 } ], "permission_summary": "pending", "mission_status": 1, "created_at": "2025-07-04T18:00:00Z" } ], "pagination": { "total_records": 150, "total_pages": 6, "current_page": 1, "per_page": 25, "has_next": true, "has_previous": false } }

Get One Mission

GET /missions/{mission_uuid}

Responses:

  • 200 OK:
{ "data": { "mission_uuid": "a9f2aeb8-b0b2-4b9e-8d3b-61d4f37a742b", "mission_udai_id": "UDAI-MSN-0001", "org_uuid": "550e8400-0000-41d4-a716-446655440000", "created_by_user_uuid": "550e8400-0000-41d4-a716-446655440000", "mission_name": "Border Surveillance Q3", "mission_description": "Quarterly aerial surveillance along northern border sector", "start_time": "2025-07-05T06:00:00Z", "end_time": "2025-07-05T18:00:00Z", "mission_envelope": { "type": "Polygon", "coordinates": [ [ [ 77.1, 28.55 ], [ 77.2, 28.55 ], [ 77.2, 28.45 ], [ 77.1, 28.45 ], [ 77.1, 28.55 ] ] ] }, "min_height": 30, "max_height": 150, "assets": [ { "asset_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "asset_udai_id": "UDAI-AST-005", "asset_uin": "UIN-987654321" }, { "asset_uuid": "b8c401c1-8f27-4a89-b9ea-89edc49ec1d4", "asset_udai_id": "UDAI-AST-009", "asset_uin": "UIN-112233441" } ], "pilots": [ { "user_uuid": "550e8400-0000-41d4-a716-446655440000", "user_udai_id": "UDAI-USR-0001", "first_name": "Adarsh", "last_name": "Pandey" }, { "user_uuid": "fd16a4a5-52a3-4f12-bf88-78b0cf7d34b2", "user_udai_id": "UDAI-USR-0193", "first_name": "Nidhi", "last_name": "Sharma" } ], "airspace_restrictions_covered": [ "ZONE-RESTRICTED-007" ], "permissions": [ { "permission_uuid": "p1a2b3c4-d5e6-7890-abcd-ef1234567890", "permission_udai_id": "UDAI-PERM-0001", "zone_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "zone_udai_id": "UDAI-ZON-0007", "manager_org_uuid": "f0154cf0-fef0-4c3e-b816-43e34b9cfbc1", "airspace_type": "RESTRICTED_ZONE", "permission_status": 1, "permission_reference": "AAI-ATC-2025-00412", "valid_from": "2025-07-05T06:00:00Z", "valid_to": "2025-07-05T18:00:00Z", "remarks": null }, { "permission_uuid": "q2b3c4d5-e6f7-8901-bcde-fg2345678901", "permission_udai_id": "UDAI-PERM-0002", "zone_uuid": "b8c401c1-8f27-4a89-b9ea-89edc49ec1d4", "zone_udai_id": "UDAI-ZON-0012", "manager_org_uuid": "fd16a4a5-52a3-4f12-bf88-78b0cf7d34b2", "airspace_type": "TEMPORARY_RESTRICTED_AREA", "permission_status": 0, "permission_reference": null, "valid_from": null, "valid_to": null, "remarks": "Awaiting access grant from Military for temporary zone" } ], "permission_summary": "pending", "flight_plans": [ { "plan_uuid": "c1d2e3f4-1234-4abc-9000-aabbccddeeff", "plan_udai_id": "UDAI-PLN-0001", "asset_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "asset_uin": "UIN-987654321", "payload_id": "payload-thermal-01", "payload_type": "thermal_sensor", "pilot_uuid": "550e8400-0000-41d4-a716-446655440000", "schedule_start_time": "2025-07-05T08:00:00Z", "schedule_end_time": "2025-07-05T09:30:00Z", "permissions": [ { "zone_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "zone_udai_id": "UDAI-ZON-0007", "manager_org_uuid": "f0154cf0-fef0-4c3e-b816-43e34b9cfbc1", "airspace_type": "RESTRICTED_ZONE", "permission_status": 1 } ], "permission_summary": "approved", "flight_status": 0 } ], "mission_status": 1, "created_at": "2025-07-04T18:00:00Z", "updated_at": "2025-07-04T18:00:00Z" } }
  • 404 Not Found:
{ "error": "Mission not found" }
  • 410 Gone:
{ "error": "Mission has been deactivated" }

Update Mission

PUT /missions/{mission_uuid}

Request Body:

{ "mission_name": "string", "mission_description": "string", "start_time": "timestamp", "end_time": "timestamp", "mission_envelope": "GeoJSON Polygon", "min_height": "double", "max_height": "double", "assets": [ { "asset_uuid": "string", "payload_id": "string", "payload_type": "string" } ], "pilots": [ "string (user_uuid)" ], "airspace_restrictions_covered": [ "string" ] }

Responses:

  • 200 OK:
{ "message": "Mission updated successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'start_time' must be before 'end_time'" }
  • 404 Not Found:
{ "error": "Mission not found" }
  • 422 Unprocessable Entity:
{ "error": "'mission_envelope' must be a valid closed GeoJSON Polygon" }

Delete Mission

DELETE /missions/{mission_uuid}

Responses:

  • 200 OK:
{ "message": "Status updated to INACTIVE" }
  • 404 Not Found:
{ "error": "Mission not found" }
  • 410 Gone:
{ "error": "Mission is already inactive" }

Create Mission Permission

POST /permissions?parent_type=MISSION&parent_uuid={mission_uuid}

Request access to an airspace segment or restricted zone for this mission.

Request Body:

{ "zone_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "manager_org_uuid": "f0154cf0-fef0-4c3e-b816-43e34b9cfbc1", "airspace_type": "RESTRICTED_ZONE", "remarks": "Requesting access to restricted zone for northern sector operation" }

Responses:

  • 201 Created:
{ "message": "Airspace permission request created successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'zone_uuid' is required" }
  • 404 Not Found:
{ "error": "Mission not found, or airspace zone not found" }
  • 409 Conflict:
{ "error": "A permission for this zone already exists on this mission" }

Update Mission Permission

PUT /permissions/{permission_uuid}

Grant or deny access to a specific airspace segment (updated by the airspace manager or platform admin).

Request Body:

{ "permission_status": 1, "permission_reference": "AAI-ATC-2025-00412", "valid_from": "2025-07-05T06:00:00Z", "valid_to": "2025-07-05T18:00:00Z", "remarks": "Access approved to ZONE-007 within specified altitude and time window" }
FieldTypeDescription
permission_statusint1 = Approved, -1 = Rejected
permission_referencestringReference number from the airspace manager
valid_from / valid_totimestampWindow for which airspace access is valid
remarksstringExplanation for approval/rejection

Responses:

  • 200 OK:
{ "message": "Airspace permission updated successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'permission_status' must be 1 (Approved) or -1 (Rejected)" }
  • 404 Not Found:
{ "error": "Permission not found" }
  • 422 Unprocessable Entity:
{ "error": "'valid_from' must be before 'valid_to'" }

Create Flight Plan

POST /flight-plans?mission_uuid={mission_uuid}

Request Body:

{ "asset_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "payload_id": "payload-thermal-01", "payload_type": "thermal_sensor", "pilot_uuid": "550e8400-0000-41d4-a716-446655440000", "schedule_start_time": "2025-07-05T08:00:00Z", "schedule_end_time": "2025-07-05T09:30:00Z", "flight_envelope": { "type": "Polygon", "coordinates": [ [ [ 77.123, 28.567 ], [ 77.124, 28.567 ], [ 77.124, 28.566 ], [ 77.123, 28.566 ], [ 77.123, 28.567 ] ] ] }, "min_height": 40, "max_height": 120, "airspace_restrictions_covered": [ "ZONE-RESTRICTED-007", "ZONE-TEMP-012" ] }

Permissions are inherited from the mission. A flight plan always operates inside its mission’s authorised envelope, height band and time window, so it does not evaluate airspace zones for itself. On creation it copies the mission’s permissions by reference: same permission_uuid, same status: and its permission_summary therefore always matches the mission’s. When an airspace manager later approves or rejects one of those mission permissions, the change propagates to every flight plan under that mission.

Strategic deconfliction is the only flight-plan-specific override: if the flight envelope spatially and temporally overlaps an existing active approved flight plan, the zones the envelope intersects are force-set to Rejected on this plan ("Deconfliction: flight envelope overlaps with an active approved flight plan in the same time window"), shadowing the inherited rows. The flight plan is still created; permission_summary reflects "rejected".

Responses:

  • 201 Created:
{ "message": "Flight plan created successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'schedule_start_time' must be before 'schedule_end_time'" }
  • 404 Not Found:
{ "error": "Mission, asset, or pilot UUID not found" }
  • 422 Unprocessable Entity:
{ "error": "Flight plan window must fall within the mission's start_time and end_time" }

Get Flight Plans

GET /flight-plans?mission_uuid={mission_uuid}

Query Parameters:

ParamTypeDescription
pageint (optional)Page number (default: 1)
limitint (optional)Records per page (default: 25)

Responses:

  • 200 OK:
{ "data": [ { "plan_uuid": "c1d2e3f4-1234-4abc-9000-aabbccddeeff", "plan_udai_id": "UDAI-PLN-0001", "asset_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "asset_uin": "UIN-987654321", "payload_id": "payload-thermal-01", "payload_type": "thermal_sensor", "pilot_uuid": "550e8400-0000-41d4-a716-446655440000", "schedule_start_time": "2025-07-05T08:00:00Z", "schedule_end_time": "2025-07-05T09:30:00Z", "min_height": 40, "max_height": 120, "permissions": [ { "manager_org_uuid": "fd16a4a5-52a3-4f12-bf88-78b0cf7d34b2", "permission_type": "BVLOS", "permission_status": 1 } ], "flight_status": 0 } ], "pagination": { "total_records": 3, "total_pages": 1, "current_page": 1, "per_page": 25, "has_next": false, "has_previous": false } }

Get One Flight Plan

GET /flight-plans/{plan_uuid}

Responses:

  • 200 OK:
{ "data": { ... } }
  • 404 Not Found:
{ "error": "Flight plan not found" }
  • 410 Gone:
{ "error": "Flight plan has been deactivated" }

Update Flight Plan

PUT /flight-plans/{plan_uuid}

Request Body:

{ "asset_uuid": "string (UUID)", "payload_id": "string", "payload_type": "string", "pilot_uuid": "string (UUID)", "schedule_start_time": "timestamp", "schedule_end_time": "timestamp", "flight_envelope": "GeoJSON Polygon", "min_height": "double", "max_height": "double", "airspace_restrictions_covered": [ "string" ] }

Responses:

  • 200 OK:
{ "message": "Flight plan updated successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'schedule_start_time' must be before 'schedule_end_time'" }
  • 404 Not Found:
{ "error": "Flight plan not found" }
  • 422 Unprocessable Entity:
{ "error": "Flight plan window must fall within the mission's start_time and end_time" }

Delete Flight Plan

DELETE /flight-plans/{plan_uuid}

Soft-deletes a flight plan (sets status to INACTIVE) and attempts to remove its associated geospatial constraint. Requires MemberPlus.

Responses:

  • 200 OK:
{ "message": "Flight plan deleted successfully", "data": null }
  • 404 Not Found:
{ "error": "Not Found", "message": "Flight plan not found" }
  • 410 Gone:
{ "error": "Gone", "message": "Flight plan is already inactive" }
  • 401 Unauthorized: Caller is not authorised to delete the plan.

Create Flight Plan Permission

POST /permissions?parent_type=FLIGHT_PLAN&parent_uuid={plan_uuid}

Add a permission request for a specific flight plan.

Request Body:

{ "zone_uuid": "b8c401c1-8f27-4a89-b9ea-89edc49ec1d4", "manager_org_uuid": "fd16a4a5-52a3-4f12-bf88-78b0cf7d34b2", "airspace_type": "TEMPORARY_RESTRICTED_AREA", "remarks": "Requesting access to temporary restricted area" }

Responses:

  • 201 Created:
{ "message": "Airspace permission request created successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'zone_uuid' is required" }
  • 404 Not Found:
{ "error": "Flight plan or airspace zone not found" }
  • 409 Conflict:
{ "error": "A permission for this zone already exists on this flight plan" }

Update Flight Plan Permission

PUT /permissions/{permission_uuid}

Grant or deny access to a specific airspace segment for this flight plan.

Request Body:

{ "permission_status": 1, "permission_reference": "MIL-TRA-2025-00089", "valid_from": "2025-07-05T08:00:00Z", "valid_to": "2025-07-05T09:30:00Z", "remarks": "Access approved to ZONE-TEMP-012 for the specified window" }

Responses:

  • 200 OK:
{ "message": "Airspace permission updated successfully", "data": { ... } }
  • 400 Bad Request:
{ "error": "'permission_status' must be 1 (Approved) or -1 (Rejected)" }
  • 404 Not Found:
{ "error": "Permission not found" }
  • 422 Unprocessable Entity:
{ "error": "'valid_from' must be before 'valid_to'" }

Get Flight Plan Logs

GET /flight-plans/logs

Query Parameters:

ParamTypeDescription
pageint (optional)Page number (default: 1)
limitint (optional)Records per page (default: 25)

Responses:

  • 200 OK:
{ "message": "Flight plan logs fetched successfully", "data": [ { "plan_uuid": "c1d2e3f4-1234-4abc-9000-aabbccddeeff", "plan_udai_id": "UDAI-PLN-0001", "asset_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "asset_uin": "UIN-987654321", "payload_id": "payload-thermal-01", "payload_type": "thermal_sensor", "pilot_uuid": "550e8400-0000-41d4-a716-446655440000", "schedule_start_time": "2025-07-20T09:00:00Z", "schedule_end_time": "2025-07-20T10:30:00Z", "permissions": [ { "zone_uuid": "e7a6d7a1-ffb2-4d62-bd7a-034fb8a34a55", "zone_udai_id": "UDAI-ZON-0007", "manager_org_uuid": "f0154cf0-fef0-4c3e-b816-43e34b9cfbc1", "airspace_type": "RESTRICTED_ZONE", "permission_status": 1 }, { "zone_uuid": "b8c401c1-8f27-4a89-b9ea-89edc49ec1d4", "zone_udai_id": "UDAI-ZON-0012", "manager_org_uuid": "fd16a4a5-52a3-4f12-bf88-78b0cf7d34b2", "airspace_type": "TEMPORARY_RESTRICTED_AREA", "permission_status": 0 } ], "permission_summary": "pending", "flight_status": 0 } ], "pagination": { "total_records": 10, "total_pages": 1, "current_page": 1, "per_page": 25, "has_next": false, "has_previous": false } }

Permission Auto-Approval Rules

When a Mission or Flight Plan is created, the system:

  1. Detects all intersecting airspace zones using geospatial queries
  2. Creates Permission entities for each intersecting zone
  3. Evaluates each permission using the auto-approval engine based on zone characteristics
  4. Sets the permission status to Approved or Pending: zone-level evaluation never auto-rejects
  5. Populates the parent’s Permissions array with actual Permission UUIDs

Auto-approval never rejects. The engine only ever returns Approved or Pending. A rejection is always a deliberate decision: either an airspace manager acting on a pending permission via PUT /permissions/\{permission_uuid\}, or the flight-plan strategic-deconfliction override (see below). This keeps denials reversible: a permission that starts life Rejected can never be re-opened (PUT /permissions/\{permission_uuid\} only accepts transitions out of Pending).

For zone type definitions see enums.md: airspace_zone_type and airspace_restriction_type.

Auto-Approval Decision Matrix

Auto-approval requires both fields to agree that the zone is benign: the operational classification must be AwarenessZone and the restriction category must be GreenZone. Every other combination is left Pending for the airspace manager. This matches FlightSessionService.IsGreenZone, so a mission that auto-approves is also flyable at session time.

Zone TypeRestriction TypeDecisionValidity PeriodRemarks
AwarenessZone (6)GreenZone (3)ApprovedMission/plan dates“Auto-approved: awareness zone, operations may proceed with awareness”
AwarenessZone (6)anything except GreenZonePendingMission/plan dates (tentative)“Pending manual review by airspace manager”
OuterYellowZone (4)AnyPendingMission/plan dates (tentative)“Pending manual review by airspace manager”
InnerYellowZone (3)AnyPendingMission/plan dates (tentative)“Pending manual review by airspace manager”
RedZone (1)AnyPendingMission/plan dates (tentative)“Pending manual review by airspace manager”
AirportRedZone (2)AnyPendingMission/plan dates (tentative)“Pending manual review by airspace manager”
TemporaryRedZone (5)AnyPendingMission/plan dates (tentative)“Pending manual review by airspace manager”

One Approved cell, everything else Pending, nothing Rejected. An AwarenessZone carrying a non-green restriction: or a red/yellow zone carrying a stray GreenZone restriction: is treated as ambiguous and held Pending rather than trusted.

Strategic Deconfliction (Flight Plans only)

When a flight plan is created, the system checks whether its envelope spatially and temporally overlaps any existing active approved flight plan (same airspace + overlapping schedule + overlapping height band).

ConditionOverride DecisionRemarks
Envelope overlaps an active approved flight plan in the same time windowRejected for each zone the envelope intersects (shadows the inherited mission rows)"Deconfliction: flight envelope overlaps with an active approved flight plan in the same time window"
  • The flight plan is still created; if its envelope intersects at least one zone, permission_summary becomes "rejected".
  • Deconfliction does not apply to missions (only to flight plans, which are the precise operative unit).
  • If a conflicting plan envelope intersects no Airspace Zone, the conflict is not recorded on the plan.

Permission Summary

The permission_summary field in mission and flight plan responses provides an aggregated status of all permissions:

Summary ValueDescriptionMission/Flight Plan Status
approvedAll permissions are approvedCan be activated
rejectedOne or more permissions rejectedCannot be activated
pendingOne or more permissions pending approvalCannot be activated until approved
not_requiredNo permissions neededCan be activated

Status Transition Validation:

  • Missions cannot transition from Draft to Active or InProgress if permission_summary is rejected or pending
  • Flight plans follow the same validation rules
  • Appropriate error messages are returned: “Cannot activate mission: one or more airspace permissions are pending approval” or “…have been rejected”

Decision Rationale

Auto-Approved (Awareness + Green only):

  • An AwarenessZone with a GreenZone restriction is a monitored area where operations may proceed with awareness only: no permission or notification required
  • Both fields must say so; a single field is not trusted, because a mis-tagged red/yellow zone with a stray green restriction would otherwise be greenlit
  • Operations can proceed immediately without manager intervention

Pending Manual Review (everything else):

  • Yellow zones (inner and outer) require coordination or notification the manager must acknowledge; they are not auto-approved
  • Red zones and airport red zones are permanently restricted for safety/security reasons (military, critical infrastructure); operations need explicit regulatory clearance, so the permission is held Pending for the airspace manager rather than auto-rejected. The manager may hold a standing approval, and auto-rejection would be terminal.
  • Temporary red zones are time-sensitive and require context-specific approval
  • An AwarenessZone whose restriction is not GreenZone is ambiguous data and is held Pending
  • Human judgment needed to assess operational risk and context

Audit Trail

Decisionpermission_statusupdated_byValidity Fields
Approved (auto)1“SYSTEM_AUTO_APPROVAL”Set to mission/plan dates
Pending (auto)0User who created mission/planTentative (mission/plan dates)
Rejected (flight-plan deconfliction only)-1“SYSTEM_AUTO_APPROVAL”Tentative (plan dates)
Approved / Rejected (manager)1 / -1Airspace manager userSet by manager (approve) / NULL-able (reject)

Zone-level auto-approval never writes -1. The only automatic rejection is the flight-plan deconfliction override; every other rejection is an airspace manager acting on a Pending permission.

Error Handling

Zone Not Found: If an intersecting zone cannot be fetched, it is skipped with a logged warning.

Permission Creation Failure: If auto-approval logic throws an exception, the permission is created with Pending status and remarks: “Auto-approval failed, pending manual review”.

Complete Failure: If even fallback creation fails, a record with a null permission_uuid is added, requiring manual creation via POST /permissions.

Important: Mission/flight plan creation is never blocked due to permission failures. The system prioritizes availability over strict enforcement.

Last updated on