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 requiresorg_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
| Endpoint | Method | Operation Name | Description |
|---|---|---|---|
/missions | POST | Create Mission | Create a new mission |
/missions | GET | Get Missions | Get all missions |
/missions/\{mission_uuid\} | GET | Get One Mission | Get specific mission details |
/missions/\{mission_uuid\} | PUT | Update Mission | Update a mission |
/missions/\{mission_uuid\} | DELETE | Delete Mission | Soft delete mission (update status to INACTIVE) |
/permissions?parent_type=MISSION&parent_uuid=\{mission_uuid\} | POST | Create Mission Permission | Request access to an airspace segment for this mission |
/permissions/\{permission_uuid\} | PUT | Update Mission Permission | Grant or deny access to a specific airspace segment |
/flight-plans?mission_uuid=\{mission_uuid\} | POST | Create Flight Plan | Create a flight plan under a mission |
/flight-plans?mission_uuid=\{mission_uuid\} | GET | Get Flight Plans | Get all flight plans for a mission |
/flight-plans/\{plan_uuid\} | GET | Get One Flight Plan | Get specific flight plan details |
/flight-plans/\{plan_uuid\} | PUT | Update Flight Plan | Update a flight plan |
/flight-plans/\{plan_uuid\} | DELETE | Delete Flight Plan | Soft delete a flight plan (INACTIVE) |
/permissions?parent_type=FLIGHT_PLAN&parent_uuid=\{plan_uuid\} | POST | Create Flight Plan Permission | Request access to an airspace segment for a flight plan |
/permissions/\{permission_uuid\} | PUT | Update Flight Plan Permission | Grant or deny access to a specific airspace segment for flight plan |
/flight-plans/logs | GET | Get Flight Plan Logs | Get 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"
]
}| Field | Type | Description |
|---|---|---|
start_time / end_time | timestamp | Overall operational window |
mission_envelope | GeoJSON Polygon | Broad area for all flight plans |
min_height / max_height | double | Altitude bounds metres AGL |
assets | array | \{ asset_uuid, payload_id, payload_type \} per asset |
pilots | array | user_uuids of assigned pilots |
airspace_restrictions_covered | array | Zone 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:
| Param | Type | Description |
|---|---|---|
page | int (optional) | Page number (default: 1) |
limit | int (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"
}| Field | Type | Description |
|---|---|---|
permission_status | int | 1 = Approved, -1 = Rejected |
permission_reference | string | Reference number from the airspace manager |
valid_from / valid_to | timestamp | Window for which airspace access is valid |
remarks | string | Explanation 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 itspermission_summarytherefore 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
Rejectedon 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_summaryreflects"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:
| Param | Type | Description |
|---|---|---|
page | int (optional) | Page number (default: 1) |
limit | int (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:
| Param | Type | Description |
|---|---|---|
page | int (optional) | Page number (default: 1) |
limit | int (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:
- Detects all intersecting airspace zones using geospatial queries
- Creates Permission entities for each intersecting zone
- Evaluates each permission using the auto-approval engine based on zone characteristics
- Sets the permission status to Approved or Pending: zone-level evaluation never auto-rejects
- 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 lifeRejectedcan never be re-opened (PUT /permissions/\{permission_uuid\}only accepts transitions out ofPending).
For zone type definitions see enums.md:
airspace_zone_typeandairspace_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 Type | Restriction Type | Decision | Validity Period | Remarks |
|---|---|---|---|---|
| AwarenessZone (6) | GreenZone (3) | Approved | Mission/plan dates | “Auto-approved: awareness zone, operations may proceed with awareness” |
| AwarenessZone (6) | anything except GreenZone | Pending | Mission/plan dates (tentative) | “Pending manual review by airspace manager” |
| OuterYellowZone (4) | Any | Pending | Mission/plan dates (tentative) | “Pending manual review by airspace manager” |
| InnerYellowZone (3) | Any | Pending | Mission/plan dates (tentative) | “Pending manual review by airspace manager” |
| RedZone (1) | Any | Pending | Mission/plan dates (tentative) | “Pending manual review by airspace manager” |
| AirportRedZone (2) | Any | Pending | Mission/plan dates (tentative) | “Pending manual review by airspace manager” |
| TemporaryRedZone (5) | Any | Pending | Mission/plan dates (tentative) | “Pending manual review by airspace manager” |
One Approved cell, everything else Pending, nothing Rejected. An
AwarenessZonecarrying a non-green restriction: or a red/yellow zone carrying a strayGreenZonerestriction: 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).
| Condition | Override Decision | Remarks |
|---|---|---|
| Envelope overlaps an active approved flight plan in the same time window | Rejected 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_summarybecomes"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 Value | Description | Mission/Flight Plan Status |
|---|---|---|
| approved | All permissions are approved | Can be activated |
| rejected | One or more permissions rejected | Cannot be activated |
| pending | One or more permissions pending approval | Cannot be activated until approved |
| not_required | No permissions needed | Can be activated |
Status Transition Validation:
- Missions cannot transition from
DrafttoActiveorInProgressifpermission_summaryisrejectedorpending - 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
AwarenessZonewith aGreenZonerestriction 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
AwarenessZonewhose restriction is notGreenZoneis ambiguous data and is held Pending - Human judgment needed to assess operational risk and context
Audit Trail
| Decision | permission_status | updated_by | Validity Fields |
|---|---|---|---|
| Approved (auto) | 1 | “SYSTEM_AUTO_APPROVAL” | Set to mission/plan dates |
| Pending (auto) | 0 | User who created mission/plan | Tentative (mission/plan dates) |
| Rejected (flight-plan deconfliction only) | -1 | “SYSTEM_AUTO_APPROVAL” | Tentative (plan dates) |
| Approved / Rejected (manager) | 1 / -1 | Airspace manager user | Set 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 aPendingpermission.
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.