1
0
This commit is contained in:
2026-05-18 14:05:37 +03:00
parent 3da6362c49
commit ed1d44e94a
16 changed files with 1686 additions and 867 deletions

110
README.md
View File

@@ -1,87 +1,49 @@
# lv.civdef.drone-threat-public-address
# Drone Threat Public Address & Citizen Notification
**UAPF Level-4 process package v0.2.0 (draft)**
**Conformant to UAPF specification v2.2.0** — see `docs/04-validation-report.md`.
UAPF v2.2.0 process package · `lv.civdef.drone-threat-public-address` · v0.3.0 · **draft**
Drone Threat Public Address & Citizen Notification — a process model of the
cross-institutional algorithm for detecting a drone threat over Latvian
airspace, deciding on and triggering public cell-broadcast notification,
coordinating interception, and conducting field response and origin
investigation.
A Level-4 UAPF package modelling the cross-institutional algorithm by which
Latvia turns a detected drone threat into a timely public cell-broadcast,
coordinates interception, and runs field response and origin investigation.
Modelled from the public chronology of the **7 May 2026 Rezekne drone
incident**, whose defining failure was a ~40-minute delay in alerting the
public.
Built from the public record of the 7 May 2026 Rēzekne drone incident and the
Ministry of Defence commitment to revise the inter-institutional notification
algorithms. **Not approved for operational use** (`lifecycle.status: draft`).
## Layout
```
lv-civdef-drone-threat-public-address/
├── uapf.yaml # manifest (kind: uapf.package, level 4)
├── bpmn/
│ └── drone-threat-public-address.bpmn # end-to-end process flow
├── dmn/
│ └── air-threat-decisions.dmn # 3 decisions: severity / scope / interception
├── cmmn/
│ └── field-response-investigation.cmmn # field-response & origin-investigation case
├── resources/
│ ├── mappings.yaml # 11 targets, 19 bindings
│ └── guardrails.yaml # UAPF-IP guardrails policy snapshot
├── metadata/
│ ├── ownership.yaml
│ ├── lifecycle.yaml
│ └── policies.yaml # classification / execution / delegation
└── docs/ # non-normative supporting analysis
├── 00-incident-chronology.md
├── 01-institutional-gap-analysis.md
├── 02-raci.md
├── 03-uapf-ip-integration.md
└── 04-validation-report.md
```
> Independent modelling demonstrator. **Not** an official algorithm of the NBS,
> VUGD, the Ministry of Defence or any Latvian state institution.
## Cornerstones
- **BPMN** `Process_DroneThreatPublicAddress` — detection → threat assessment
gateway → broadcast-scope decision → request → parallel block
{cell broadcast | agency notification | interception evaluation} →
synchronise → local response → all-clear → field-response case → close.
- **DMN** one DRD, three decisions — `Decision_AirThreatSeverity`,
`Decision_CellBroadcastScope`, `Decision_InterceptionAuthorization`.
- **CMMN** `Case_DroneIncidentFieldResponse` — debris search, fire suppression,
scene security, an investigation stage (technical exam, origin attribution,
disinformation monitoring), plus discretionary press and after-action review.
- **Resources** 11 targets (NBS surveillance/Joint Staff/air-defence, VUGD duty
and cell-broadcast system, State Police, KVC, Ministry of Defence, municipal
commissions, an AI threat-assessment agent, an OSINT MCP tool) bound to every
process / decision / case element via the v2.2.0 resource-mapping schema.
| Cornerstone | File | Content |
|-------------|------|---------|
| Process (BPMN) | `bpmn/drone-threat-public-address.bpmn` | 26 nodes across **6 institution lanes**; non-interrupting **SLA-breach boundary timer**; parallel broadcast / notify / interception; 3-way interception gateway; stand-down loop; handoff to the investigation case. |
| Decisions (DMN) | `dmn/air-threat-decisions.dmn` | **6 chained, documented decisions** with a clean DRD. Object classification → severity → notification urgency & SLA → broadcast scope; interception authorization; stand-down. |
| Case (CMMN) | `cmmn/field-response-investigation.cmmn` | 3 stages, 11 human tasks, milestones and entry sentries for field response, origin investigation and public communication. |
| Resources | `resources/mappings.yaml` | Every process/decision/case element bound to an executing institution, system or agent — with a legend tracing each binding to its diagram element. Guardrails in `resources/guardrails.yaml`. |
## UAPF-IP & MCP
## What changed in v0.3.0
The manifest declares `requires_capabilities`, `profiles_supported`
(`uapf-ip-orchestrated`, `uapf-ip-sync-decision`), `guardrails`, and an
`exposure.mcp` block exposing the process and the three decisions as MCP tools.
See `docs/03-uapf-ip-integration.md`.
Rebuilt deeper and broader from v0.2.0, and the v0.2.0 defects fixed:
## Validation
- DMN expanded **3 → 6 decisions**; every decision and every rule now carries a
description; the DRD uses an all-positive, tidy layout.
- **Interception logic fixed** — `positiveHostileId` was declared as a required
input but never tested, so the table could reach `engage` without it. It is
now rule 1: no positive hostile ID → always `hold`.
- **Cell-broadcast scope** now genuinely consumes `corridorMunicipalities` (a
FEEL expression, not a quoted string).
- BPMN expanded from a flat flow to a **6-lane collaboration** with the SLA
boundary timer that models the Rezekne lesson directly.
- `mappings.yaml` given an element-level **legend** so the resource↔process
linkage is readable and machine-checkable.
```
python3 ../../validate.py ../.. <path-to-UAPF-specification-repo>
```
## Documentation
Result: PASS, 0 errors, 0 warnings against UAPF v2.2.0. The reference CLI
`tools/uapf-cli/uapf.py` will wrongly reject this package because it checks for
the obsolete `.bpmn.xml` extension — this is a known upstream bug, documented in
`docs/04-validation-report.md`.
`docs/00` chronology · `docs/01` gap analysis · `docs/02` RACI ·
`docs/03` notification timing & SLA · `docs/04` UAPF-IP integration ·
`docs/05` validation report (19/19 passed).
## Intended steward
## Status
Authored as an external draft (owner: Rihards Gailums). The intended
institutional steward on hand-over is the Ministry of Defence
(Aizsardzības ministrija) jointly with the Crisis Management Centre
(Krīzes vadības centrs).
## Sources
Public reporting only — LSM / eng.lsm.lv, Apollo, TV3, Meduza, Defense News,
The Globe and Mail, and the Wikipedia article "2026 Ukrainian drone incursions
into Baltic states". Dated record in `docs/00-incident-chronology.md`.
`draft`. Decision thresholds and SLA values are modelling proposals pending
institutional review — see `docs/01` and `docs/03`.

View File

@@ -1,245 +1,476 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
id="defs_drone_threat_public_address"
targetNamespace="http://uapf.dev/lv.civdef.drone-threat-public-address">
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
id="defs_drone_threat" targetNamespace="http://uapf.dev/lv.civdef.drone-threat-public-address">
<bpmn:collaboration id="Collab_DroneThreat">
<bpmn:participant id="Participant_Response" name="National drone-threat civil-defence response" processRef="Process_DroneThreatPublicAddress" />
<bpmn:participant id="Participant_BAP" name="NATO Baltic Air Policing" />
<bpmn:messageFlow id="mf_bap" name="Air interception request" sourceRef="Task_RequestBAP" targetRef="Participant_BAP" />
</bpmn:collaboration>
<bpmn:process id="Process_DroneThreatPublicAddress" name="Drone Threat Public Address &amp; Citizen Notification" isExecutable="false">
<bpmn:startEvent id="Start_Detect" name="Unidentified airborne object detected near eastern border">
<bpmn:laneSet id="LaneSet_1">
<bpmn:lane id="Lane_Surveillance" name="NBS Air Surveillance &amp; Radar">
<bpmn:flowNodeRef>Start_Detection</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_TrackObject</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_ClassifyObject</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_LogAndMonitor</bpmn:flowNodeRef>
<bpmn:flowNodeRef>End_NoThreat</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_MaintainTrack</bpmn:flowNodeRef>
</bpmn:lane>
<bpmn:lane id="Lane_JointStaff" name="NBS Joint Staff (operational duty)">
<bpmn:flowNodeRef>Task_AssessSeverity</bpmn:flowNodeRef>
<bpmn:flowNodeRef>GW_Threat</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_DetermineUrgency</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_DetermineBroadcast</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_AuthorizeBroadcast</bpmn:flowNodeRef>
<bpmn:flowNodeRef>GW_Fork</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_NotifyAgencies</bpmn:flowNodeRef>
<bpmn:flowNodeRef>GW_Join</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_AssessStandDown</bpmn:flowNodeRef>
<bpmn:flowNodeRef>GW_StandDown</bpmn:flowNodeRef>
</bpmn:lane>
<bpmn:lane id="Lane_VUGD" name="VUGD / Cell-broadcast (sunu apraide)">
<bpmn:flowNodeRef>Task_DispatchBroadcast</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_AllClearBroadcast</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Boundary_SlaBreach</bpmn:flowNodeRef>
</bpmn:lane>
<bpmn:lane id="Lane_AirDefence" name="NBS Air Defence">
<bpmn:flowNodeRef>Task_AuthorizeInterception</bpmn:flowNodeRef>
<bpmn:flowNodeRef>GW_Interception</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_GroundEngage</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_RequestBAP</bpmn:flowNodeRef>
</bpmn:lane>
<bpmn:lane id="Lane_Field" name="State Police &amp; Municipal civil protection">
</bpmn:lane>
<bpmn:lane id="Lane_Command" name="Ministry of Defence / Crisis Management Centre">
<bpmn:flowNodeRef>Task_EscalateSla</bpmn:flowNodeRef>
<bpmn:flowNodeRef>End_SlaEscalated</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Task_HandToInvestigation</bpmn:flowNodeRef>
<bpmn:flowNodeRef>End_Resolved</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="Start_Detection" name="Airborne object detected">
<bpmn:messageEventDefinition id="med_Start_Detection" />
<bpmn:outgoing>f1</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:task id="Task_Classify" name="Classify object and track trajectory">
<bpmn:documentation>NBS air surveillance and Joint Staff classify the object (drone / aircraft / unknown) and establish its track and predicted corridor.</bpmn:documentation>
<bpmn:task id="Task_TrackObject" name="Establish &amp; maintain object track">
<bpmn:incoming>f1</bpmn:incoming>
<bpmn:outgoing>f2</bpmn:outgoing>
</bpmn:task>
<bpmn:businessRuleTask id="BR_AssessThreat" name="Assess air threat severity">
<bpmn:documentation>Applies DMN decision Decision_AirThreatSeverity.</bpmn:documentation>
<bpmn:businessRuleTask id="Task_ClassifyObject" name="Classify object &amp;#10; [Object classification]">
<bpmn:incoming>f2</bpmn:incoming>
<bpmn:outgoing>f3</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:exclusiveGateway id="GW_ThreatConfirmed" name="Confirmed threat over LV territory?">
<bpmn:businessRuleTask id="Task_AssessSeverity" name="Assess air-threat severity &amp;#10; [Air-threat severity]">
<bpmn:incoming>f3</bpmn:incoming>
<bpmn:outgoing>f4</bpmn:outgoing>
<bpmn:outgoing>f5</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:endEvent id="End_MonitorOnly" name="Continue monitoring; log event">
</bpmn:businessRuleTask>
<bpmn:exclusiveGateway id="GW_Threat" name="Civil-defence threat?">
<bpmn:incoming>f4</bpmn:incoming>
</bpmn:endEvent>
<bpmn:businessRuleTask id="BR_AlertScope" name="Determine cell-broadcast scope and message">
<bpmn:documentation>Applies DMN decision Decision_CellBroadcastScope to derive affected municipalities and message template.</bpmn:documentation>
<bpmn:outgoing>f5</bpmn:outgoing>
<bpmn:outgoing>f7</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Task_LogAndMonitor" name="Log &amp; monitor (no public alert)">
<bpmn:incoming>f5</bpmn:incoming>
<bpmn:outgoing>f6</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:task id="Task_RequestBroadcast" name="Issue cell-broadcast request to VUGD">
<bpmn:documentation>GAP: in the AS-IS algorithm this NBS request is the single trigger; if it is not issued (or issued late) no public alert fires. See docs/01-institutional-gap-analysis.md.</bpmn:documentation>
<bpmn:incoming>f6</bpmn:incoming>
<bpmn:outgoing>f7</bpmn:outgoing>
</bpmn:task>
<bpmn:parallelGateway id="GW_ParallelSplit" name="Parallel response">
<bpmn:endEvent id="End_NoThreat" name="No civil-defence action">
<bpmn:incoming>f6</bpmn:incoming>
</bpmn:endEvent>
<bpmn:businessRuleTask id="Task_DetermineUrgency" name="Determine notification urgency &amp; SLA &amp;#10; [Notification urgency]">
<bpmn:incoming>f7</bpmn:incoming>
<bpmn:outgoing>f8</bpmn:outgoing>
<bpmn:outgoing>f9</bpmn:outgoing>
<bpmn:outgoing>f10</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:task id="Task_CellBroadcast" name="Trigger cell broadcast in affected municipalities">
<bpmn:documentation>VUGD executes the cell broadcast (sunu apraide) on receipt of the NBS request.</bpmn:documentation>
<bpmn:incoming>f8</bpmn:incoming>
<bpmn:outgoing>f11</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Task_NotifyAgencies" name="Notify KVC, IeM and municipal civil-protection commissions">
<bpmn:documentation>Parallel information flow to crisis-management and municipal actors. GAP: AS-IS lacks a unified, simultaneous notification to all responsible institutions.</bpmn:documentation>
<bpmn:incoming>f9</bpmn:incoming>
<bpmn:outgoing>f12</bpmn:outgoing>
</bpmn:task>
<bpmn:businessRuleTask id="BR_Interception" name="Evaluate interception per safety criteria">
<bpmn:documentation>Applies DMN decision Decision_InterceptionAuthorization.</bpmn:documentation>
<bpmn:incoming>f10</bpmn:incoming>
<bpmn:outgoing>f13</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:task id="Task_CoordBAP" name="Coordinate interception with NATO Baltic Air Policing / PGA">
<bpmn:documentation>Engage or hold per Decision_InterceptionAuthorization; scramble BAP fighters and/or move ground air-defence units to cleared firing positions.</bpmn:documentation>
<bpmn:incoming>f13</bpmn:incoming>
<bpmn:businessRuleTask id="Task_DetermineBroadcast" name="Determine cell-broadcast scope &amp;#10; [Cell-broadcast scope]">
<bpmn:incoming>f8</bpmn:incoming>
<bpmn:outgoing>f9</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:userTask id="Task_AuthorizeBroadcast" name="Authorize public broadcast">
<bpmn:incoming>f9</bpmn:incoming>
<bpmn:outgoing>f10</bpmn:outgoing>
</bpmn:userTask>
<bpmn:parallelGateway id="GW_Fork" name="Parallel response">
<bpmn:incoming>f10</bpmn:incoming>
<bpmn:outgoing>f11</bpmn:outgoing>
<bpmn:outgoing>f12</bpmn:outgoing>
<bpmn:outgoing>f13</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:task id="Task_DispatchBroadcast" name="Dispatch public cell-broadcast">
<bpmn:incoming>f11</bpmn:incoming>
<bpmn:outgoing>f14</bpmn:outgoing>
</bpmn:task>
<bpmn:parallelGateway id="GW_ParallelJoin" name="Synchronise">
<bpmn:incoming>f11</bpmn:incoming>
<bpmn:incoming>f12</bpmn:incoming>
<bpmn:incoming>f14</bpmn:incoming>
<bpmn:outgoing>f15</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:task id="Task_LocalResponse" name="Activate local civil-protection response">
<bpmn:documentation>Municipal civil-protection commissions act on shelter guidance, school closures (IZM guidance) and resident enquiries.</bpmn:documentation>
<bpmn:incoming>f15</bpmn:incoming>
<bpmn:outgoing>f16</bpmn:outgoing>
<bpmn:task id="Task_EscalateSla" name="Escalate SLA breach to Crisis Mgmt">
<bpmn:incoming>fb</bpmn:incoming>
<bpmn:outgoing>fb2</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Task_AllClear" name="Declare threat ended and issue all-clear broadcast">
<bpmn:endEvent id="End_SlaEscalated" name="SLA breach escalated">
<bpmn:incoming>fb2</bpmn:incoming>
</bpmn:endEvent>
<bpmn:task id="Task_NotifyAgencies" name="Notify KVC, IeM &amp; municipal commissions">
<bpmn:incoming>f12</bpmn:incoming>
<bpmn:outgoing>f15</bpmn:outgoing>
</bpmn:task>
<bpmn:businessRuleTask id="Task_AuthorizeInterception" name="Authorize interception &amp;#10; [Interception authorization]">
<bpmn:incoming>f13</bpmn:incoming>
<bpmn:outgoing>f16</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:exclusiveGateway id="GW_Interception" name="Interception decision">
<bpmn:incoming>f16</bpmn:incoming>
<bpmn:outgoing>f17</bpmn:outgoing>
</bpmn:task>
<bpmn:callActivity id="Call_FieldResponse" name="Field response &amp; origin investigation" calledElement="Case_DroneIncidentFieldResponse">
<bpmn:documentation>Invokes the CMMN case cmmn/field-response-investigation.cmmn.xml.</bpmn:documentation>
<bpmn:incoming>f17</bpmn:incoming>
<bpmn:outgoing>f18</bpmn:outgoing>
</bpmn:callActivity>
<bpmn:endEvent id="End_Closed" name="Incident closed; after-action review scheduled">
<bpmn:outgoing>f19</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Task_GroundEngage" name="Ground air-defence engagement">
<bpmn:incoming>f17</bpmn:incoming>
<bpmn:outgoing>f20</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Task_RequestBAP" name="Request NATO BAP engagement">
<bpmn:incoming>f18</bpmn:incoming>
<bpmn:outgoing>f21</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Task_MaintainTrack" name="Maintain track &amp; monitor">
<bpmn:incoming>f19</bpmn:incoming>
<bpmn:outgoing>f22</bpmn:outgoing>
</bpmn:task>
<bpmn:parallelGateway id="GW_Join" name="Join">
<bpmn:incoming>f14</bpmn:incoming>
<bpmn:incoming>f15</bpmn:incoming>
<bpmn:incoming>f20</bpmn:incoming>
<bpmn:incoming>f21</bpmn:incoming>
<bpmn:incoming>f22</bpmn:incoming>
<bpmn:outgoing>f23</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:businessRuleTask id="Task_AssessStandDown" name="Assess stand-down criteria &amp;#10; [Stand-down &amp; all-clear]">
<bpmn:incoming>f23</bpmn:incoming>
<bpmn:incoming>f25</bpmn:incoming>
<bpmn:outgoing>f24</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:exclusiveGateway id="GW_StandDown" name="All clear?">
<bpmn:incoming>f24</bpmn:incoming>
<bpmn:outgoing>f25</bpmn:outgoing>
<bpmn:outgoing>f26</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:task id="Task_AllClearBroadcast" name="Dispatch all-clear broadcast">
<bpmn:incoming>f26</bpmn:incoming>
<bpmn:outgoing>f27</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Task_HandToInvestigation" name="Open field-response &amp; investigation case">
<bpmn:incoming>f27</bpmn:incoming>
<bpmn:outgoing>f28</bpmn:outgoing>
</bpmn:task>
<bpmn:endEvent id="End_Resolved" name="Incident resolved">
<bpmn:incoming>f28</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="f1" sourceRef="Start_Detect" targetRef="Task_Classify" />
<bpmn:sequenceFlow id="f2" sourceRef="Task_Classify" targetRef="BR_AssessThreat" />
<bpmn:sequenceFlow id="f3" sourceRef="BR_AssessThreat" targetRef="GW_ThreatConfirmed" />
<bpmn:sequenceFlow id="f4" name="No - not over LV territory" sourceRef="GW_ThreatConfirmed" targetRef="End_MonitorOnly" />
<bpmn:sequenceFlow id="f5" name="Yes - confirmed threat" sourceRef="GW_ThreatConfirmed" targetRef="BR_AlertScope" />
<bpmn:sequenceFlow id="f6" sourceRef="BR_AlertScope" targetRef="Task_RequestBroadcast" />
<bpmn:sequenceFlow id="f7" sourceRef="Task_RequestBroadcast" targetRef="GW_ParallelSplit" />
<bpmn:sequenceFlow id="f8" sourceRef="GW_ParallelSplit" targetRef="Task_CellBroadcast" />
<bpmn:sequenceFlow id="f9" sourceRef="GW_ParallelSplit" targetRef="Task_NotifyAgencies" />
<bpmn:sequenceFlow id="f10" sourceRef="GW_ParallelSplit" targetRef="BR_Interception" />
<bpmn:sequenceFlow id="f11" sourceRef="Task_CellBroadcast" targetRef="GW_ParallelJoin" />
<bpmn:sequenceFlow id="f12" sourceRef="Task_NotifyAgencies" targetRef="GW_ParallelJoin" />
<bpmn:sequenceFlow id="f13" sourceRef="BR_Interception" targetRef="Task_CoordBAP" />
<bpmn:sequenceFlow id="f14" sourceRef="Task_CoordBAP" targetRef="GW_ParallelJoin" />
<bpmn:sequenceFlow id="f15" sourceRef="GW_ParallelJoin" targetRef="Task_LocalResponse" />
<bpmn:sequenceFlow id="f16" sourceRef="Task_LocalResponse" targetRef="Task_AllClear" />
<bpmn:sequenceFlow id="f17" sourceRef="Task_AllClear" targetRef="Call_FieldResponse" />
<bpmn:sequenceFlow id="f18" sourceRef="Call_FieldResponse" targetRef="End_Closed" />
<bpmn:boundaryEvent id="Boundary_SlaBreach" name="Broadcast SLA breached" attachedToRef="Task_DispatchBroadcast" cancelActivity="false">
<bpmn:outgoing>fb</bpmn:outgoing>
<bpmn:timerEventDefinition id="ted_sla">
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">PT10M</bpmn:timeDuration>
</bpmn:timerEventDefinition>
</bpmn:boundaryEvent>
<bpmn:sequenceFlow id="f1" sourceRef="Start_Detection" targetRef="Task_TrackObject" />
<bpmn:sequenceFlow id="f2" sourceRef="Task_TrackObject" targetRef="Task_ClassifyObject" />
<bpmn:sequenceFlow id="f3" sourceRef="Task_ClassifyObject" targetRef="Task_AssessSeverity" />
<bpmn:sequenceFlow id="f4" sourceRef="Task_AssessSeverity" targetRef="GW_Threat" />
<bpmn:sequenceFlow id="f5" name="threatLevel in (none, low)" sourceRef="GW_Threat" targetRef="Task_LogAndMonitor" />
<bpmn:sequenceFlow id="f6" sourceRef="Task_LogAndMonitor" targetRef="End_NoThreat" />
<bpmn:sequenceFlow id="f7" name="threatLevel in (elevated, high, critical)" sourceRef="GW_Threat" targetRef="Task_DetermineUrgency" />
<bpmn:sequenceFlow id="f8" sourceRef="Task_DetermineUrgency" targetRef="Task_DetermineBroadcast" />
<bpmn:sequenceFlow id="f9" sourceRef="Task_DetermineBroadcast" targetRef="Task_AuthorizeBroadcast" />
<bpmn:sequenceFlow id="f10" sourceRef="Task_AuthorizeBroadcast" targetRef="GW_Fork" />
<bpmn:sequenceFlow id="f11" sourceRef="GW_Fork" targetRef="Task_DispatchBroadcast" />
<bpmn:sequenceFlow id="f12" sourceRef="GW_Fork" targetRef="Task_NotifyAgencies" />
<bpmn:sequenceFlow id="f13" sourceRef="GW_Fork" targetRef="Task_AuthorizeInterception" />
<bpmn:sequenceFlow id="f14" sourceRef="Task_DispatchBroadcast" targetRef="GW_Join" />
<bpmn:sequenceFlow id="f15" sourceRef="Task_NotifyAgencies" targetRef="GW_Join" />
<bpmn:sequenceFlow id="f16" sourceRef="Task_AuthorizeInterception" targetRef="GW_Interception" />
<bpmn:sequenceFlow id="f17" name="interceptionDecision = engage-ground" sourceRef="GW_Interception" targetRef="Task_GroundEngage" />
<bpmn:sequenceFlow id="f18" name="interceptionDecision = engage-bap" sourceRef="GW_Interception" targetRef="Task_RequestBAP" />
<bpmn:sequenceFlow id="f19" name="interceptionDecision = hold" sourceRef="GW_Interception" targetRef="Task_MaintainTrack" />
<bpmn:sequenceFlow id="f20" sourceRef="Task_GroundEngage" targetRef="GW_Join" />
<bpmn:sequenceFlow id="f21" sourceRef="Task_RequestBAP" targetRef="GW_Join" />
<bpmn:sequenceFlow id="f22" sourceRef="Task_MaintainTrack" targetRef="GW_Join" />
<bpmn:sequenceFlow id="f23" sourceRef="GW_Join" targetRef="Task_AssessStandDown" />
<bpmn:sequenceFlow id="f24" sourceRef="Task_AssessStandDown" targetRef="GW_StandDown" />
<bpmn:sequenceFlow id="f25" name="standDownDecision = maintain-alert" sourceRef="GW_StandDown" targetRef="Task_AssessStandDown" />
<bpmn:sequenceFlow id="f26" name="standDownDecision = all-clear" sourceRef="GW_StandDown" targetRef="Task_AllClearBroadcast" />
<bpmn:sequenceFlow id="f27" sourceRef="Task_AllClearBroadcast" targetRef="Task_HandToInvestigation" />
<bpmn:sequenceFlow id="f28" sourceRef="Task_HandToInvestigation" targetRef="End_Resolved" />
<bpmn:sequenceFlow id="fb" sourceRef="Boundary_SlaBreach" targetRef="Task_EscalateSla" />
<bpmn:sequenceFlow id="fb2" sourceRef="Task_EscalateSla" targetRef="End_SlaEscalated" />
</bpmn:process>
<bpmndi:BPMNDiagram id="Diagram_1">
<bpmndi:BPMNPlane id="Plane_1" bpmnElement="Process_DroneThreatPublicAddress">
<bpmndi:BPMNShape id="di_Start_Detect" bpmnElement="Start_Detect">
<dc:Bounds x="152" y="222" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="130" y="262" width="84" height="40" /></bpmndi:BPMNLabel>
<bpmndi:BPMNDiagram id="diag">
<bpmndi:BPMNPlane id="plane" bpmnElement="Collab_DroneThreat">
<bpmndi:BPMNShape id="di_Participant_Response" bpmnElement="Participant_Response" isHorizontal="true">
<dc:Bounds x="170" y="120" width="3460" height="900" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_Classify" bpmnElement="Task_Classify">
<dc:Bounds x="240" y="200" width="120" height="80" />
<bpmndi:BPMNShape id="di_Lane_Surveillance" bpmnElement="Lane_Surveillance" isHorizontal="true">
<dc:Bounds x="200" y="120" width="3430" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_BR_AssessThreat" bpmnElement="BR_AssessThreat">
<dc:Bounds x="410" y="200" width="120" height="80" />
<bpmndi:BPMNShape id="di_Lane_JointStaff" bpmnElement="Lane_JointStaff" isHorizontal="true">
<dc:Bounds x="200" y="270" width="3430" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_GW_ThreatConfirmed" bpmnElement="GW_ThreatConfirmed" isMarkerVisible="true">
<dc:Bounds x="585" y="215" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="570" y="175" width="82" height="40" /></bpmndi:BPMNLabel>
<bpmndi:BPMNShape id="di_Lane_VUGD" bpmnElement="Lane_VUGD" isHorizontal="true">
<dc:Bounds x="200" y="420" width="3430" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_End_MonitorOnly" bpmnElement="End_MonitorOnly">
<dc:Bounds x="592" y="362" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="568" y="402" width="84" height="27" /></bpmndi:BPMNLabel>
<bpmndi:BPMNShape id="di_Lane_AirDefence" bpmnElement="Lane_AirDefence" isHorizontal="true">
<dc:Bounds x="200" y="570" width="3430" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_BR_AlertScope" bpmnElement="BR_AlertScope">
<dc:Bounds x="690" y="200" width="120" height="80" />
<bpmndi:BPMNShape id="di_Lane_Field" bpmnElement="Lane_Field" isHorizontal="true">
<dc:Bounds x="200" y="720" width="3430" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_RequestBroadcast" bpmnElement="Task_RequestBroadcast">
<dc:Bounds x="860" y="200" width="120" height="80" />
<bpmndi:BPMNShape id="di_Lane_Command" bpmnElement="Lane_Command" isHorizontal="true">
<dc:Bounds x="200" y="870" width="3430" height="150" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_GW_ParallelSplit" bpmnElement="GW_ParallelSplit">
<dc:Bounds x="1035" y="215" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="1030" y="272" width="60" height="14" /></bpmndi:BPMNLabel>
<bpmndi:BPMNShape id="di_Participant_BAP" bpmnElement="Participant_BAP" isHorizontal="true">
<dc:Bounds x="170" y="1060" width="3460" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_CellBroadcast" bpmnElement="Task_CellBroadcast">
<dc:Bounds x="1150" y="80" width="150" height="80" />
<bpmndi:BPMNShape id="di_Start_Detection" bpmnElement="Start_Detection">
<dc:Bounds x="282" y="177" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="250" y="217" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_TrackObject" bpmnElement="Task_TrackObject">
<dc:Bounds x="405" y="152" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_ClassifyObject" bpmnElement="Task_ClassifyObject">
<dc:Bounds x="580" y="152" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_AssessSeverity" bpmnElement="Task_AssessSeverity">
<dc:Bounds x="755" y="302" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_GW_Threat" bpmnElement="GW_Threat">
<dc:Bounds x="975" y="320" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="950" y="374" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_LogAndMonitor" bpmnElement="Task_LogAndMonitor">
<dc:Bounds x="1105" y="152" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_End_NoThreat" bpmnElement="End_NoThreat">
<dc:Bounds x="1332" y="177" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1300" y="217" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_DetermineUrgency" bpmnElement="Task_DetermineUrgency">
<dc:Bounds x="1105" y="302" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_DetermineBroadcast" bpmnElement="Task_DetermineBroadcast">
<dc:Bounds x="1280" y="302" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_AuthorizeBroadcast" bpmnElement="Task_AuthorizeBroadcast">
<dc:Bounds x="1455" y="302" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_GW_Fork" bpmnElement="GW_Fork">
<dc:Bounds x="1675" y="320" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="1650" y="374" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_DispatchBroadcast" bpmnElement="Task_DispatchBroadcast">
<dc:Bounds x="1805" y="452" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_EscalateSla" bpmnElement="Task_EscalateSla">
<dc:Bounds x="1980" y="902" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_End_SlaEscalated" bpmnElement="End_SlaEscalated">
<dc:Bounds x="2207" y="927" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="2175" y="967" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_NotifyAgencies" bpmnElement="Task_NotifyAgencies">
<dc:Bounds x="1150" y="200" width="150" height="80" />
<dc:Bounds x="1805" y="302" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_BR_Interception" bpmnElement="BR_Interception">
<dc:Bounds x="1150" y="330" width="150" height="80" />
<bpmndi:BPMNShape id="di_Task_AuthorizeInterception" bpmnElement="Task_AuthorizeInterception">
<dc:Bounds x="1805" y="602" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_CoordBAP" bpmnElement="Task_CoordBAP">
<dc:Bounds x="1360" y="330" width="150" height="80" />
<bpmndi:BPMNShape id="di_GW_Interception" bpmnElement="GW_Interception">
<dc:Bounds x="2025" y="620" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="2000" y="674" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_GW_ParallelJoin" bpmnElement="GW_ParallelJoin">
<dc:Bounds x="1565" y="215" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="1564" y="272" width="52" height="14" /></bpmndi:BPMNLabel>
<bpmndi:BPMNShape id="di_Task_GroundEngage" bpmnElement="Task_GroundEngage">
<dc:Bounds x="2155" y="602" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_LocalResponse" bpmnElement="Task_LocalResponse">
<dc:Bounds x="1660" y="200" width="150" height="80" />
<bpmndi:BPMNShape id="di_Task_RequestBAP" bpmnElement="Task_RequestBAP">
<dc:Bounds x="2330" y="602" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_AllClear" bpmnElement="Task_AllClear">
<dc:Bounds x="1860" y="200" width="150" height="80" />
<bpmndi:BPMNShape id="di_Task_MaintainTrack" bpmnElement="Task_MaintainTrack">
<dc:Bounds x="2155" y="152" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Call_FieldResponse" bpmnElement="Call_FieldResponse">
<dc:Bounds x="2060" y="200" width="160" height="80" />
<bpmndi:BPMNShape id="di_GW_Join" bpmnElement="GW_Join">
<dc:Bounds x="2550" y="320" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="2525" y="374" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_End_Closed" bpmnElement="End_Closed">
<dc:Bounds x="2272" y="222" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="2250" y="262" width="84" height="40" /></bpmndi:BPMNLabel>
<bpmndi:BPMNShape id="di_Task_AssessStandDown" bpmnElement="Task_AssessStandDown">
<dc:Bounds x="2680" y="302" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_GW_StandDown" bpmnElement="GW_StandDown">
<dc:Bounds x="2900" y="320" width="50" height="50" />
<bpmndi:BPMNLabel><dc:Bounds x="2875" y="374" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_AllClearBroadcast" bpmnElement="Task_AllClearBroadcast">
<dc:Bounds x="3030" y="452" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Task_HandToInvestigation" bpmnElement="Task_HandToInvestigation">
<dc:Bounds x="3205" y="902" width="140" height="86" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_End_Resolved" bpmnElement="End_Resolved">
<dc:Bounds x="3432" y="927" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="3400" y="967" width="100" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="di_Boundary_SlaBreach" bpmnElement="Boundary_SlaBreach">
<dc:Bounds x="1857" y="520" width="36" height="36" />
<bpmndi:BPMNLabel><dc:Bounds x="1821" y="558" width="110" height="28" /></bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="di_f1" bpmnElement="f1">
<di:waypoint x="188" y="240" /><di:waypoint x="240" y="240" />
<di:waypoint x="300" y="195" />
<di:waypoint x="475" y="195" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f2" bpmnElement="f2">
<di:waypoint x="360" y="240" /><di:waypoint x="410" y="240" />
<di:waypoint x="475" y="195" />
<di:waypoint x="650" y="195" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f3" bpmnElement="f3">
<di:waypoint x="530" y="240" /><di:waypoint x="585" y="240" />
<di:waypoint x="650" y="195" />
<di:waypoint x="737" y="195" />
<di:waypoint x="737" y="345" />
<di:waypoint x="825" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f4" bpmnElement="f4">
<di:waypoint x="610" y="265" /><di:waypoint x="610" y="362" />
<bpmndi:BPMNLabel><dc:Bounds x="615" y="300" width="84" height="27" /></bpmndi:BPMNLabel>
<di:waypoint x="825" y="345" />
<di:waypoint x="1000" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f5" bpmnElement="f5">
<di:waypoint x="635" y="240" /><di:waypoint x="690" y="240" />
<bpmndi:BPMNLabel><dc:Bounds x="636" y="206" width="74" height="27" /></bpmndi:BPMNLabel>
<di:waypoint x="1000" y="345" />
<di:waypoint x="1087" y="345" />
<di:waypoint x="1087" y="195" />
<di:waypoint x="1175" y="195" />
<bpmndi:BPMNLabel><dc:Bounds x="1027" y="161" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f6" bpmnElement="f6">
<di:waypoint x="810" y="240" /><di:waypoint x="860" y="240" />
<di:waypoint x="1175" y="195" />
<di:waypoint x="1350" y="195" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f7" bpmnElement="f7">
<di:waypoint x="980" y="240" /><di:waypoint x="1035" y="240" />
<di:waypoint x="1000" y="345" />
<di:waypoint x="1175" y="345" />
<bpmndi:BPMNLabel><dc:Bounds x="1027" y="311" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f8" bpmnElement="f8">
<di:waypoint x="1060" y="215" /><di:waypoint x="1060" y="120" /><di:waypoint x="1150" y="120" />
<di:waypoint x="1175" y="345" />
<di:waypoint x="1350" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f9" bpmnElement="f9">
<di:waypoint x="1085" y="240" /><di:waypoint x="1150" y="240" />
<di:waypoint x="1350" y="345" />
<di:waypoint x="1525" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f10" bpmnElement="f10">
<di:waypoint x="1060" y="265" /><di:waypoint x="1060" y="370" /><di:waypoint x="1150" y="370" />
<di:waypoint x="1525" y="345" />
<di:waypoint x="1700" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f11" bpmnElement="f11">
<di:waypoint x="1300" y="120" /><di:waypoint x="1590" y="120" /><di:waypoint x="1590" y="215" />
<di:waypoint x="1700" y="345" />
<di:waypoint x="1787" y="345" />
<di:waypoint x="1787" y="495" />
<di:waypoint x="1875" y="495" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f12" bpmnElement="f12">
<di:waypoint x="1300" y="240" /><di:waypoint x="1565" y="240" />
<di:waypoint x="1700" y="345" />
<di:waypoint x="1875" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f13" bpmnElement="f13">
<di:waypoint x="1300" y="370" /><di:waypoint x="1360" y="370" />
<di:waypoint x="1700" y="345" />
<di:waypoint x="1787" y="345" />
<di:waypoint x="1787" y="645" />
<di:waypoint x="1875" y="645" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f14" bpmnElement="f14">
<di:waypoint x="1510" y="370" /><di:waypoint x="1590" y="370" /><di:waypoint x="1590" y="265" />
<di:waypoint x="1875" y="495" />
<di:waypoint x="2225" y="495" />
<di:waypoint x="2225" y="345" />
<di:waypoint x="2575" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f15" bpmnElement="f15">
<di:waypoint x="1615" y="240" /><di:waypoint x="1660" y="240" />
<di:waypoint x="1875" y="345" />
<di:waypoint x="2575" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f16" bpmnElement="f16">
<di:waypoint x="1810" y="240" /><di:waypoint x="1860" y="240" />
<di:waypoint x="1875" y="645" />
<di:waypoint x="2050" y="645" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f17" bpmnElement="f17">
<di:waypoint x="2010" y="240" /><di:waypoint x="2060" y="240" />
<di:waypoint x="2050" y="645" />
<di:waypoint x="2225" y="645" />
<bpmndi:BPMNLabel><dc:Bounds x="2077" y="611" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f18" bpmnElement="f18">
<di:waypoint x="2220" y="240" /><di:waypoint x="2272" y="240" />
<di:waypoint x="2050" y="645" />
<di:waypoint x="2400" y="645" />
<bpmndi:BPMNLabel><dc:Bounds x="2165" y="611" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f19" bpmnElement="f19">
<di:waypoint x="2050" y="645" />
<di:waypoint x="2137" y="645" />
<di:waypoint x="2137" y="195" />
<di:waypoint x="2225" y="195" />
<bpmndi:BPMNLabel><dc:Bounds x="2077" y="161" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f20" bpmnElement="f20">
<di:waypoint x="2225" y="645" />
<di:waypoint x="2400" y="645" />
<di:waypoint x="2400" y="345" />
<di:waypoint x="2575" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f21" bpmnElement="f21">
<di:waypoint x="2400" y="645" />
<di:waypoint x="2487" y="645" />
<di:waypoint x="2487" y="345" />
<di:waypoint x="2575" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f22" bpmnElement="f22">
<di:waypoint x="2225" y="195" />
<di:waypoint x="2400" y="195" />
<di:waypoint x="2400" y="345" />
<di:waypoint x="2575" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f23" bpmnElement="f23">
<di:waypoint x="2575" y="345" />
<di:waypoint x="2750" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f24" bpmnElement="f24">
<di:waypoint x="2750" y="345" />
<di:waypoint x="2925" y="345" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f25" bpmnElement="f25">
<di:waypoint x="2925" y="345" />
<di:waypoint x="2750" y="345" />
<bpmndi:BPMNLabel><dc:Bounds x="2777" y="311" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f26" bpmnElement="f26">
<di:waypoint x="2925" y="345" />
<di:waypoint x="3012" y="345" />
<di:waypoint x="3012" y="495" />
<di:waypoint x="3100" y="495" />
<bpmndi:BPMNLabel><dc:Bounds x="2952" y="311" width="120" height="30" /></bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f27" bpmnElement="f27">
<di:waypoint x="3100" y="495" />
<di:waypoint x="3187" y="495" />
<di:waypoint x="3187" y="945" />
<di:waypoint x="3275" y="945" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_f28" bpmnElement="f28">
<di:waypoint x="3275" y="945" />
<di:waypoint x="3450" y="945" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_fb" bpmnElement="fb">
<di:waypoint x="1875" y="538" />
<di:waypoint x="1962" y="538" />
<di:waypoint x="1962" y="945" />
<di:waypoint x="2050" y="945" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_fb2" bpmnElement="fb2">
<di:waypoint x="2050" y="945" />
<di:waypoint x="2225" y="945" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="di_mf_bap" bpmnElement="mf_bap">
<di:waypoint x="2400" y="688" />
<di:waypoint x="2400" y="1060" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>

View File

@@ -1,74 +1,142 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmmn:definitions xmlns:cmmn="http://www.omg.org/spec/CMMN/20151109/MODEL"
xmlns:cmmndi="http://www.omg.org/spec/CMMN/20151109/CMMNDI"
xmlns:dc="http://www.omg.org/spec/CMMN/20151109/DC"
xmlns:di="http://www.omg.org/spec/CMMN/20151109/DI"
id="defs_drone_field_response"
targetNamespace="http://uapf.dev/lv.civdef.drone-threat-public-address/cmmn">
<cmmn:case id="Case_DroneIncidentFieldResponse" name="Drone Incident Field Response &amp; Origin Investigation">
<cmmn:casePlanModel id="cpm_1" name="Field Response &amp; Investigation">
<cmmn:planItem id="pi_DebrisSearch" definitionRef="HT_DebrisSearch" />
<cmmn:planItem id="pi_FireSuppression" definitionRef="HT_FireSuppression" />
<cmmn:planItem id="pi_SceneSecurity" definitionRef="HT_SceneSecurity" />
<cmmn:planItem id="pi_Investigation" definitionRef="Stage_Investigation" />
<cmmn:planItem id="pi_MunicipalQA" definitionRef="HT_MunicipalQA" />
<cmmn:planningTable id="pt_case">
<cmmn:discretionaryItem id="di_Press" definitionRef="HT_Press" />
<cmmn:discretionaryItem id="di_AfterAction" definitionRef="HT_AfterAction" />
</cmmn:planningTable>
<cmmn:humanTask id="HT_DebrisSearch" name="Localise and search downed-drone crash sites" isBlocking="true" />
<cmmn:humanTask id="HT_FireSuppression" name="Site safety and fire suppression" isBlocking="true" />
<cmmn:humanTask id="HT_SceneSecurity" name="Scene security and access control" isBlocking="true" />
<cmmn:humanTask id="HT_MunicipalQA" name="Handle resident enquiries via municipal commissions" isBlocking="true" />
<cmmn:humanTask id="HT_Press" name="Press conference and public information update" isBlocking="true" />
<cmmn:humanTask id="HT_AfterAction" name="Cross-institutional after-action review and algorithm revision" isBlocking="true" />
<cmmn:stage id="Stage_Investigation" name="Origin attribution &amp; investigation">
<cmmn:planItem id="pi_TechExam" definitionRef="HT_TechExam" />
<cmmn:planItem id="pi_OriginAttribution" definitionRef="HT_OriginAttribution" />
<cmmn:planItem id="pi_DisinfoMonitor" definitionRef="HT_DisinfoMonitor" />
<cmmn:humanTask id="HT_TechExam" name="Technical examination of recovered debris" isBlocking="true" />
<cmmn:humanTask id="HT_OriginAttribution" name="Origin attribution and electronic-warfare diversion analysis" isBlocking="true" />
<cmmn:humanTask id="HT_DisinfoMonitor" name="Disinformation monitoring and correction" isBlocking="true" />
xmlns:cmmndi="http://www.omg.org/spec/CMMN/20151109/CMMNDI"
xmlns:dc="http://www.omg.org/spec/CMMN/20151109/DC"
xmlns:di="http://www.omg.org/spec/CMMN/20151109/DI"
id="defs_field_response" targetNamespace="http://uapf.dev/lv.civdef.drone-threat-public-address">
<cmmn:case id="Case_FieldResponseInvestigation" name="Field Response &amp; Drone-Origin Investigation">
<cmmn:casePlanModel id="CasePlan_1" name="Field response and investigation">
<cmmn:planItem id="pi_Stage_FieldResponse" definitionRef="Stage_FieldResponse" />
<cmmn:planItem id="pi_Stage_OriginInvestigation" definitionRef="Stage_OriginInvestigation">
<cmmn:entryCriterion id="ec_pi_Stage_OriginInvestigation" sentryRef="sentry_pi_Stage_OriginInvestigation" />
</cmmn:planItem>
<cmmn:planItem id="pi_Stage_PublicCommunication" definitionRef="Stage_PublicCommunication" />
<cmmn:planItem id="pi_MS_SiteSafe" definitionRef="MS_SiteSafe">
<cmmn:entryCriterion id="ec_pi_MS_SiteSafe" sentryRef="sentry_pi_MS_SiteSafe" />
</cmmn:planItem>
<cmmn:sentry id="sentry_pi_Stage_OriginInvestigation">
<cmmn:planItemOnPart id="op_pi_Stage_OriginInvestigation" sourceRef="pi_Stage_FieldResponse">
<cmmn:standardEvent>complete</cmmn:standardEvent>
</cmmn:planItemOnPart>
</cmmn:sentry>
<cmmn:sentry id="sentry_pi_MS_SiteSafe">
<cmmn:planItemOnPart id="op_pi_MS_SiteSafe" sourceRef="pi_Stage_FieldResponse">
<cmmn:standardEvent>complete</cmmn:standardEvent>
</cmmn:planItemOnPart>
</cmmn:sentry>
<cmmn:stage id="Stage_FieldResponse" name="Field response">
<cmmn:planItem id="pi_HT_DebrisLocalisation" definitionRef="HT_DebrisLocalisation" />
<cmmn:planItem id="pi_HT_FireSuppression" definitionRef="HT_FireSuppression" />
<cmmn:planItem id="pi_HT_SceneSecurity" definitionRef="HT_SceneSecurity" />
<cmmn:planItem id="pi_HT_CasualtyResponse" definitionRef="HT_CasualtyResponse" />
<cmmn:planItem id="pi_HT_MunicipalEnquiries" definitionRef="HT_MunicipalEnquiries" />
<cmmn:humanTask id="HT_DebrisLocalisation" name="Localise crash / debris site" />
<cmmn:humanTask id="HT_FireSuppression" name="Fire suppression at impact site" />
<cmmn:humanTask id="HT_SceneSecurity" name="Establish scene cordon &amp; security" />
<cmmn:humanTask id="HT_CasualtyResponse" name="Casualty assessment &amp; medical response" />
<cmmn:humanTask id="HT_MunicipalEnquiries" name="Handle resident enquiries (112 / municipal)" />
</cmmn:stage>
<cmmn:stage id="Stage_OriginInvestigation" name="Drone-origin investigation">
<cmmn:planItem id="pi_HT_DebrisCollection" definitionRef="HT_DebrisCollection" />
<cmmn:planItem id="pi_HT_TechnicalExam" definitionRef="HT_TechnicalExam" />
<cmmn:planItem id="pi_HT_OriginAttribution" definitionRef="HT_OriginAttribution" />
<cmmn:planItem id="pi_MS_AttributionComplete" definitionRef="MS_AttributionComplete">
<cmmn:entryCriterion id="ec_pi_MS_AttributionComplete" sentryRef="sentry_pi_MS_AttributionComplete" />
</cmmn:planItem>
<cmmn:sentry id="sentry_pi_MS_AttributionComplete">
<cmmn:planItemOnPart id="op_pi_MS_AttributionComplete" sourceRef="pi_HT_OriginAttribution">
<cmmn:standardEvent>complete</cmmn:standardEvent>
</cmmn:planItemOnPart>
</cmmn:sentry>
<cmmn:humanTask id="HT_DebrisCollection" name="Collect &amp; catalogue debris" />
<cmmn:humanTask id="HT_TechnicalExam" name="Technical examination of the UAV" />
<cmmn:humanTask id="HT_OriginAttribution" name="Origin attribution analysis" />
<cmmn:milestone id="MS_AttributionComplete" name="Origin attribution complete" />
</cmmn:stage>
<cmmn:stage id="Stage_PublicCommunication" name="Public communication &amp; after-action">
<cmmn:planItem id="pi_HT_DisinfoMonitor" definitionRef="HT_DisinfoMonitor" />
<cmmn:planItem id="pi_HT_PressBriefing" definitionRef="HT_PressBriefing" />
<cmmn:planItem id="pi_HT_AfterAction" definitionRef="HT_AfterAction" />
<cmmn:planItem id="pi_MS_CaseClosed" definitionRef="MS_CaseClosed">
<cmmn:entryCriterion id="ec_pi_MS_CaseClosed" sentryRef="sentry_pi_MS_CaseClosed" />
</cmmn:planItem>
<cmmn:sentry id="sentry_pi_MS_CaseClosed">
<cmmn:planItemOnPart id="op_pi_MS_CaseClosed" sourceRef="pi_HT_AfterAction">
<cmmn:standardEvent>complete</cmmn:standardEvent>
</cmmn:planItemOnPart>
</cmmn:sentry>
<cmmn:humanTask id="HT_DisinfoMonitor" name="Monitor &amp; counter disinformation" />
<cmmn:humanTask id="HT_PressBriefing" name="Public press briefing" />
<cmmn:humanTask id="HT_AfterAction" name="Inter-institutional after-action review" />
<cmmn:milestone id="MS_CaseClosed" name="Incident case closed" />
</cmmn:stage>
<cmmn:milestone id="MS_SiteSafe" name="Impact site declared safe" />
</cmmn:casePlanModel>
</cmmn:case>
<cmmndi:CMMNDI>
<cmmndi:CMMNDiagram id="cmmndi_1" name="Field Response &amp; Investigation">
<cmmndi:CMMNShape id="sh_cpm" cmmnElementRef="cpm_1">
<dc:Bounds x="60" y="40" width="900" height="420" />
<cmmndi:CMMNDiagram id="cmmndiag">
<cmmndi:CMMNShape id="di_CasePlan_1" cmmnElementRef="CasePlan_1">
<dc:Bounds x="30" y="40" width="1340" height="730" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_DebrisSearch" cmmnElementRef="pi_DebrisSearch">
<dc:Bounds x="100" y="100" width="160" height="80" />
<cmmndi:CMMNShape id="di_Stage_FieldResponse" cmmnElementRef="Stage_FieldResponse">
<dc:Bounds x="70" y="110" width="1260" height="190" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_FireSuppression" cmmnElementRef="pi_FireSuppression">
<dc:Bounds x="300" y="100" width="160" height="80" />
<cmmndi:CMMNShape id="di_HT_DebrisLocalisation" cmmnElementRef="HT_DebrisLocalisation">
<dc:Bounds x="110" y="180" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_SceneSecurity" cmmnElementRef="pi_SceneSecurity">
<dc:Bounds x="500" y="100" width="160" height="80" />
<cmmndi:CMMNShape id="di_HT_FireSuppression" cmmnElementRef="HT_FireSuppression">
<dc:Bounds x="346" y="180" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_MunicipalQA" cmmnElementRef="pi_MunicipalQA">
<dc:Bounds x="700" y="100" width="180" height="80" />
<cmmndi:CMMNShape id="di_HT_SceneSecurity" cmmnElementRef="HT_SceneSecurity">
<dc:Bounds x="582" y="180" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_Investigation" cmmnElementRef="pi_Investigation">
<dc:Bounds x="100" y="230" width="580" height="200" />
<cmmndi:CMMNShape id="di_HT_CasualtyResponse" cmmnElementRef="HT_CasualtyResponse">
<dc:Bounds x="818" y="180" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_TechExam" cmmnElementRef="pi_TechExam">
<dc:Bounds x="130" y="290" width="160" height="80" />
<cmmndi:CMMNShape id="di_HT_MunicipalEnquiries" cmmnElementRef="HT_MunicipalEnquiries">
<dc:Bounds x="1054" y="180" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_OriginAttribution" cmmnElementRef="pi_OriginAttribution">
<dc:Bounds x="320" y="290" width="160" height="80" />
<cmmndi:CMMNShape id="di_Stage_OriginInvestigation" cmmnElementRef="Stage_OriginInvestigation">
<dc:Bounds x="70" y="330" width="1260" height="190" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="sh_DisinfoMonitor" cmmnElementRef="pi_DisinfoMonitor">
<dc:Bounds x="510" y="290" width="150" height="80" />
<cmmndi:CMMNShape id="di_HT_DebrisCollection" cmmnElementRef="HT_DebrisCollection">
<dc:Bounds x="110" y="400" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_HT_TechnicalExam" cmmnElementRef="HT_TechnicalExam">
<dc:Bounds x="405" y="400" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_HT_OriginAttribution" cmmnElementRef="HT_OriginAttribution">
<dc:Bounds x="700" y="400" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_MS_AttributionComplete" cmmnElementRef="MS_AttributionComplete">
<dc:Bounds x="995" y="415" width="170" height="44" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_Stage_PublicCommunication" cmmnElementRef="Stage_PublicCommunication">
<dc:Bounds x="70" y="550" width="1260" height="190" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_HT_DisinfoMonitor" cmmnElementRef="HT_DisinfoMonitor">
<dc:Bounds x="110" y="620" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_HT_PressBriefing" cmmnElementRef="HT_PressBriefing">
<dc:Bounds x="405" y="620" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_HT_AfterAction" cmmnElementRef="HT_AfterAction">
<dc:Bounds x="700" y="620" width="200" height="74" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_MS_CaseClosed" cmmnElementRef="MS_CaseClosed">
<dc:Bounds x="995" y="635" width="170" height="44" />
</cmmndi:CMMNShape>
<cmmndi:CMMNShape id="di_MS_SiteSafe" cmmnElementRef="MS_SiteSafe">
<dc:Bounds x="1150" y="130" width="170" height="44" />
</cmmndi:CMMNShape>
<cmmndi:CMMNEdge id="edge_pi_MS_AttributionComplete" cmmnElementRef="ec_pi_MS_AttributionComplete">
<di:waypoint x="800" y="437" />
<di:waypoint x="1080" y="437" />
</cmmndi:CMMNEdge>
<cmmndi:CMMNEdge id="edge_pi_MS_CaseClosed" cmmnElementRef="ec_pi_MS_CaseClosed">
<di:waypoint x="800" y="657" />
<di:waypoint x="1080" y="657" />
</cmmndi:CMMNEdge>
</cmmndi:CMMNDiagram>
</cmmndi:CMMNDI>
</cmmn:definitions>

View File

@@ -3,93 +3,189 @@
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"
xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/"
id="defs_air_threat_decisions"
name="Air Threat Decisions"
id="defs_air_threat_decisions" name="Air Threat Decisions"
namespace="http://uapf.dev/lv.civdef.drone-threat-public-address/dmn">
<inputData id="In_ObjectType" name="Object type">
<variable id="v_objectType" name="objectType" typeRef="string" />
<inputData id="In_RadarCrossSection" name="Radar cross-section">
<variable id="v_radarCrossSection" name="radarCrossSection" typeRef="string" />
</inputData>
<inputData id="In_EmissionProfile" name="Emission profile">
<variable id="v_emissionProfile" name="emissionProfile" typeRef="string" />
</inputData>
<inputData id="In_VisualConfirmation" name="Visual confirmation">
<variable id="v_visualConfirmation" name="visualConfirmation" typeRef="string" />
</inputData>
<inputData id="In_AirspaceStatus" name="Airspace entry status">
<variable id="v_airspaceStatus" name="airspaceStatus" typeRef="string" />
</inputData>
<inputData id="In_TrajectoryToward" name="Trajectory toward populated area">
<variable id="v_trajectoryToward" name="trajectoryTowardPopulated" typeRef="boolean" />
<inputData id="In_TrajectoryTowardPop" name="Trajectory toward populated area">
<variable id="v_trajectoryTowardPopulated" name="trajectoryTowardPopulated" typeRef="boolean" />
</inputData>
<inputData id="In_DistanceKm" name="Distance to nearest populated area (km)">
<variable id="v_distanceKm" name="distanceToPopulatedKm" typeRef="number" />
<inputData id="In_DistanceToPopulatedKm" name="Distance to populated area (km)">
<variable id="v_distanceToPopulatedKm" name="distanceToPopulatedKm" typeRef="number" />
</inputData>
<inputData id="In_BorderTier" name="Border-proximity tier">
<variable id="v_borderTier" name="borderProximityTier" typeRef="string" />
<inputData id="In_EstimatedMinutesToPop" name="Est. minutes to populated area">
<variable id="v_estimatedMinutesToPopulated" name="estimatedMinutesToPopulated" typeRef="number" />
</inputData>
<inputData id="In_CorridorMunis" name="Predicted corridor municipalities">
<variable id="v_corridorMunis" name="corridorMunicipalities" typeRef="string" />
<inputData id="In_CorridorMunicipalities" name="Predicted corridor municipalities">
<variable id="v_corridorMunicipalities" name="corridorMunicipalities" typeRef="string" />
</inputData>
<inputData id="In_BorderProximityTier" name="Border-proximity tier">
<variable id="v_borderProximityTier" name="borderProximityTier" typeRef="string" />
</inputData>
<inputData id="In_PositiveHostileId" name="Positive hostile identification">
<variable id="v_posHostileId" name="positiveHostileId" typeRef="boolean" />
<variable id="v_positiveHostileId" name="positiveHostileId" typeRef="boolean" />
</inputData>
<inputData id="In_OverPopulated" name="Object currently over populated area">
<variable id="v_overPopulated" name="overPopulatedArea" typeRef="boolean" />
<inputData id="In_OverPopulatedArea" name="Object over populated area">
<variable id="v_overPopulatedArea" name="overPopulatedArea" typeRef="boolean" />
</inputData>
<inputData id="In_DebrisClear" name="Debris fall-zone clear">
<variable id="v_debrisClear" name="debrisZoneClear" typeRef="boolean" />
<inputData id="In_DebrisZoneClear" name="Debris fall-zone clear">
<variable id="v_debrisZoneClear" name="debrisZoneClear" typeRef="boolean" />
</inputData>
<inputData id="In_FiringReady" name="Ground firing position ready">
<variable id="v_firingReady" name="firingPositionReady" typeRef="boolean" />
<inputData id="In_GroundFiringReady" name="Ground firing position ready">
<variable id="v_groundFiringReady" name="groundFiringReady" typeRef="boolean" />
</inputData>
<inputData id="In_BapOnStation" name="NATO BAP on station">
<variable id="v_bapOnStation" name="bapOnStation" typeRef="boolean" />
</inputData>
<inputData id="In_ObjectNeutralized" name="Object neutralized / landed">
<variable id="v_objectNeutralized" name="objectNeutralized" typeRef="boolean" />
</inputData>
<inputData id="In_ActiveTracksRemain" name="Active tracks remain">
<variable id="v_activeTracksRemain" name="activeTracksRemain" typeRef="boolean" />
</inputData>
<decision id="Decision_AirThreatSeverity" name="Air threat severity">
<variable id="v_threatLevel" name="threatLevel" typeRef="string" />
<informationRequirement id="ir_d1_1"><requiredInput href="#In_ObjectType" /></informationRequirement>
<informationRequirement id="ir_d1_2"><requiredInput href="#In_AirspaceStatus" /></informationRequirement>
<informationRequirement id="ir_d1_3"><requiredInput href="#In_TrajectoryToward" /></informationRequirement>
<informationRequirement id="ir_d1_4"><requiredInput href="#In_DistanceKm" /></informationRequirement>
<decisionTable id="dt_d1" hitPolicy="FIRST">
<input id="d1_i1" label="Object type">
<inputExpression typeRef="string"><text>objectType</text></inputExpression>
<decision id="Decision_ObjectClassification" name="Object classification &amp; confidence">
<description>Classifies the detected airborne object and assigns a confidence level by fusing radar cross-section, emission profile and visual confirmation. Determines whether the object is treated as a potential civil-defence threat at all.</description>
<variable id="v_objectClass" name="objectClass" typeRef="string" />
<informationRequirement id="ir_Decision_ObjectClassification_0"><requiredInput href="#In_RadarCrossSection" /></informationRequirement>
<informationRequirement id="ir_Decision_ObjectClassification_1"><requiredInput href="#In_EmissionProfile" /></informationRequirement>
<informationRequirement id="ir_Decision_ObjectClassification_2"><requiredInput href="#In_VisualConfirmation" /></informationRequirement>
<decisionTable id="dt_Decision_ObjectClassification" hitPolicy="FIRST">
<input id="Decision_ObjectClassification_i0" label="Radar cross-section">
<inputExpression id="Decision_ObjectClassification_ie0" typeRef="string"><text>radarCrossSection</text></inputExpression>
</input>
<input id="d1_i2" label="Airspace status">
<inputExpression typeRef="string"><text>airspaceStatus</text></inputExpression>
<input id="Decision_ObjectClassification_i1" label="Emission profile">
<inputExpression id="Decision_ObjectClassification_ie1" typeRef="string"><text>emissionProfile</text></inputExpression>
</input>
<input id="d1_i3" label="Toward populated area">
<inputExpression typeRef="boolean"><text>trajectoryTowardPopulated</text></inputExpression>
<input id="Decision_ObjectClassification_i2" label="Visual confirmation">
<inputExpression id="Decision_ObjectClassification_ie2" typeRef="string"><text>visualConfirmation</text></inputExpression>
</input>
<input id="d1_i4" label="Distance km">
<inputExpression typeRef="number"><text>distanceToPopulatedKm</text></inputExpression>
</input>
<output id="d1_o1" label="Threat level" name="threatLevel" typeRef="string" />
<rule id="d1_r1">
<inputEntry><text>"unknown","drone"</text></inputEntry>
<inputEntry><text>"crossed","inside"</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>&lt;= 15</text></inputEntry>
<output id="Decision_ObjectClassification_o0" label="Object class" name="objectClass" typeRef="string" />
<output id="Decision_ObjectClassification_o1" label="Classification confidence" name="classificationConfidence" typeRef="string" />
<rule id="Decision_ObjectClassification_r0">
<description>Positive visual plus a military or EW emission signature: treat as a likely-hostile drone.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>"ew-jamming","military-radar"</text></inputEntry>
<inputEntry><text>"positive"</text></inputEntry>
<outputEntry><text>"drone-hostile-likely"</text></outputEntry>
<outputEntry><text>"high"</text></outputEntry>
</rule>
<rule id="d1_r2">
<inputEntry><text>"unknown","drone"</text></inputEntry>
<rule id="Decision_ObjectClassification_r1">
<description>Small radar return carrying a comms or EW emission is characteristic of a controlled UAV.</description>
<inputEntry><text>"micro","small"</text></inputEntry>
<inputEntry><text>"comms","ew-jamming"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"drone"</text></outputEntry>
<outputEntry><text>"high"</text></outputEntry>
</rule>
<rule id="Decision_ObjectClassification_r2">
<description>Small, slow, emission-silent and visually unconfirmed: treat as a suspected drone pending confirmation.</description>
<inputEntry><text>"micro","small"</text></inputEntry>
<inputEntry><text>"none"</text></inputEntry>
<inputEntry><text>"none","partial"</text></inputEntry>
<outputEntry><text>"drone-suspected"</text></outputEntry>
<outputEntry><text>"medium"</text></outputEntry>
</rule>
<rule id="Decision_ObjectClassification_r3">
<description>Medium/large return with a military-radar emission is an identified military aircraft.</description>
<inputEntry><text>"medium","large"</text></inputEntry>
<inputEntry><text>"military-radar"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"military-aircraft"</text></outputEntry>
<outputEntry><text>"high"</text></outputEntry>
</rule>
<rule id="Decision_ObjectClassification_r4">
<description>Micro return with no emission and no visual is most likely a bird or radar clutter.</description>
<inputEntry><text>"micro"</text></inputEntry>
<inputEntry><text>"none"</text></inputEntry>
<inputEntry><text>"none"</text></inputEntry>
<outputEntry><text>"bird-or-clutter"</text></outputEntry>
<outputEntry><text>"low"</text></outputEntry>
</rule>
<rule id="Decision_ObjectClassification_r5">
<description>Fallback: object cannot be classified with available data.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"unknown"</text></outputEntry>
<outputEntry><text>"low"</text></outputEntry>
</rule>
</decisionTable>
</decision>
<decision id="Decision_AirThreatSeverity" name="Air-threat severity">
<description>Determines the civil-defence threat level from the classified object, its airspace behaviour and its proximity to people. This is the pivot decision the rest of the model depends on.</description>
<variable id="v_threatLevel" name="threatLevel" typeRef="string" />
<informationRequirement id="ir_Decision_AirThreatSeverity_0"><requiredDecision href="#Decision_ObjectClassification" /></informationRequirement>
<informationRequirement id="ir_Decision_AirThreatSeverity_1"><requiredInput href="#In_AirspaceStatus" /></informationRequirement>
<informationRequirement id="ir_Decision_AirThreatSeverity_2"><requiredInput href="#In_TrajectoryTowardPop" /></informationRequirement>
<informationRequirement id="ir_Decision_AirThreatSeverity_3"><requiredInput href="#In_DistanceToPopulatedKm" /></informationRequirement>
<decisionTable id="dt_Decision_AirThreatSeverity" hitPolicy="FIRST">
<input id="Decision_AirThreatSeverity_i0" label="Object class">
<inputExpression id="Decision_AirThreatSeverity_ie0" typeRef="string"><text>objectClass</text></inputExpression>
</input>
<input id="Decision_AirThreatSeverity_i1" label="Airspace status">
<inputExpression id="Decision_AirThreatSeverity_ie1" typeRef="string"><text>airspaceStatus</text></inputExpression>
</input>
<input id="Decision_AirThreatSeverity_i2" label="Toward populated area">
<inputExpression id="Decision_AirThreatSeverity_ie2" typeRef="boolean"><text>trajectoryTowardPopulated</text></inputExpression>
</input>
<input id="Decision_AirThreatSeverity_i3" label="Distance to populated (km)">
<inputExpression id="Decision_AirThreatSeverity_ie3" typeRef="number"><text>distanceToPopulatedKm</text></inputExpression>
</input>
<output id="Decision_AirThreatSeverity_o0" label="Threat level" name="threatLevel" typeRef="string" />
<rule id="Decision_AirThreatSeverity_r0">
<description>Drone confirmed inside national airspace, closing on people within 10 km: critical.</description>
<inputEntry><text>"drone","drone-hostile-likely"</text></inputEntry>
<inputEntry><text>"inside"</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>&lt;= 10</text></inputEntry>
<outputEntry><text>"critical"</text></outputEntry>
</rule>
<rule id="Decision_AirThreatSeverity_r1">
<description>Drone inside or having crossed the border, on a trajectory toward people within 25 km: high.</description>
<inputEntry><text>"drone","drone-hostile-likely"</text></inputEntry>
<inputEntry><text>"crossed","inside"</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>&gt; 15</text></inputEntry>
<outputEntry><text>"elevated"</text></outputEntry>
<inputEntry><text>&lt;= 25</text></inputEntry>
<outputEntry><text>"high"</text></outputEntry>
</rule>
<rule id="d1_r3">
<inputEntry><text>"unknown","drone"</text></inputEntry>
<rule id="Decision_AirThreatSeverity_r2">
<description>Drone present in airspace but not tracking toward a populated area: elevated.</description>
<inputEntry><text>"drone","drone-suspected","drone-hostile-likely"</text></inputEntry>
<inputEntry><text>"crossed","inside"</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"elevated"</text></outputEntry>
</rule>
<rule id="d1_r4">
<inputEntry><text>"unknown","drone"</text></inputEntry>
<rule id="Decision_AirThreatSeverity_r3">
<description>Drone still approaching the border: low — monitor, no public alert yet.</description>
<inputEntry><text>"drone","drone-suspected"</text></inputEntry>
<inputEntry><text>"approaching"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"low"</text></outputEntry>
</rule>
<rule id="d1_r5">
<rule id="Decision_AirThreatSeverity_r4">
<description>Identified military aircraft is handled through air-policing channels, not civil-defence broadcast.</description>
<inputEntry><text>"military-aircraft"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"low"</text></outputEntry>
</rule>
<rule id="Decision_AirThreatSeverity_r5">
<description>Fallback: no civil-defence air threat.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
@@ -98,81 +194,166 @@
</rule>
</decisionTable>
</decision>
<decision id="Decision_CellBroadcastScope" name="Cell-broadcast scope">
<variable id="v_broadcastScope" name="broadcastScope" typeRef="string" />
<informationRequirement id="ir_d2_1"><requiredDecision href="#Decision_AirThreatSeverity" /></informationRequirement>
<informationRequirement id="ir_d2_2"><requiredInput href="#In_BorderTier" /></informationRequirement>
<informationRequirement id="ir_d2_3"><requiredInput href="#In_CorridorMunis" /></informationRequirement>
<decisionTable id="dt_d2" hitPolicy="FIRST">
<input id="d2_i1" label="Threat level">
<inputExpression typeRef="string"><text>threatLevel</text></inputExpression>
<decision id="Decision_NotificationUrgency" name="Notification urgency &amp; SLA">
<description>Sets how fast a public cell-broadcast must be dispatched. The broadcastSlaSeconds output is the contractual deadline whose 40-minute breach in the 7 May 2026 Rezekne incident this whole package exists to prevent.</description>
<variable id="v_notificationTier" name="notificationTier" typeRef="string" />
<informationRequirement id="ir_Decision_NotificationUrgency_0"><requiredDecision href="#Decision_AirThreatSeverity" /></informationRequirement>
<informationRequirement id="ir_Decision_NotificationUrgency_1"><requiredInput href="#In_EstimatedMinutesToPop" /></informationRequirement>
<decisionTable id="dt_Decision_NotificationUrgency" hitPolicy="FIRST">
<input id="Decision_NotificationUrgency_i0" label="Threat level">
<inputExpression id="Decision_NotificationUrgency_ie0" typeRef="string"><text>threatLevel</text></inputExpression>
</input>
<input id="d2_i2" label="Border-proximity tier">
<inputExpression typeRef="string"><text>borderProximityTier</text></inputExpression>
<input id="Decision_NotificationUrgency_i1" label="Est. minutes to populated area">
<inputExpression id="Decision_NotificationUrgency_ie1" typeRef="number"><text>estimatedMinutesToPopulated</text></inputExpression>
</input>
<output id="d2_o1" label="Alert municipalities" name="alertMunicipalities" typeRef="string" />
<output id="d2_o2" label="Message template" name="messageTemplate" typeRef="string" />
<rule id="d2_r1">
<inputEntry><text>"high"</text></inputEntry>
<output id="Decision_NotificationUrgency_o0" label="Notification tier" name="notificationTier" typeRef="string" />
<output id="Decision_NotificationUrgency_o1" label="Broadcast SLA (seconds)" name="broadcastSlaSeconds" typeRef="number" />
<rule id="Decision_NotificationUrgency_r0">
<description>Critical threat: public broadcast must leave within 2 minutes.</description>
<inputEntry><text>"critical"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"corridorMunicipalities + all tier-1 border municipalities"</text></outputEntry>
<outputEntry><text>"MSG_DRONE_IMMINENT"</text></outputEntry>
<outputEntry><text>"immediate"</text></outputEntry>
<outputEntry><text>120</text></outputEntry>
</rule>
<rule id="d2_r2">
<rule id="Decision_NotificationUrgency_r1">
<description>High threat with people reachable within 15 minutes: broadcast within 3 minutes.</description>
<inputEntry><text>"high"</text></inputEntry>
<inputEntry><text>&lt;= 15</text></inputEntry>
<outputEntry><text>"immediate"</text></outputEntry>
<outputEntry><text>180</text></outputEntry>
</rule>
<rule id="Decision_NotificationUrgency_r2">
<description>High threat with more lead time: broadcast within 5 minutes.</description>
<inputEntry><text>"high"</text></inputEntry>
<inputEntry><text>&gt; 15</text></inputEntry>
<outputEntry><text>"priority"</text></outputEntry>
<outputEntry><text>300</text></outputEntry>
</rule>
<rule id="Decision_NotificationUrgency_r3">
<description>Elevated threat: broadcast within 10 minutes.</description>
<inputEntry><text>"elevated"</text></inputEntry>
<inputEntry><text>"tier1","tier2"</text></inputEntry>
<outputEntry><text>"corridorMunicipalities"</text></outputEntry>
<outputEntry><text>"MSG_DRONE_POSSIBLE"</text></outputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"priority"</text></outputEntry>
<outputEntry><text>600</text></outputEntry>
</rule>
<rule id="d2_r3">
<inputEntry><text>"elevated"</text></inputEntry>
<inputEntry><text>"tier3"</text></inputEntry>
<outputEntry><text>"corridorMunicipalities"</text></outputEntry>
<outputEntry><text>"MSG_AIRSPACE_MONITORING"</text></outputEntry>
</rule>
<rule id="d2_r4">
<rule id="Decision_NotificationUrgency_r4">
<description>Low threat: standard 30-minute advisory window.</description>
<inputEntry><text>"low"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"none - municipal commissions informed only"</text></outputEntry>
<outputEntry><text>"MSG_NONE"</text></outputEntry>
<outputEntry><text>"standard"</text></outputEntry>
<outputEntry><text>1800</text></outputEntry>
</rule>
<rule id="d2_r5">
<inputEntry><text>"none"</text></inputEntry>
<rule id="Decision_NotificationUrgency_r5">
<description>No threat: no public broadcast.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"none"</text></outputEntry>
<outputEntry><text>"MSG_NONE"</text></outputEntry>
<outputEntry><text>0</text></outputEntry>
</rule>
</decisionTable>
</decision>
<decision id="Decision_CellBroadcastScope" name="Cell-broadcast scope &amp; message">
<description>Selects which municipalities receive the public alert, which message template is used, and the repeat interval. The alert footprint is built explicitly from the predicted corridor so it matches the threat's path rather than a fixed region.</description>
<variable id="v_alertMunicipalities" name="alertMunicipalities" typeRef="string" />
<informationRequirement id="ir_Decision_CellBroadcastScope_0"><requiredDecision href="#Decision_AirThreatSeverity" /></informationRequirement>
<informationRequirement id="ir_Decision_CellBroadcastScope_1"><requiredInput href="#In_CorridorMunicipalities" /></informationRequirement>
<informationRequirement id="ir_Decision_CellBroadcastScope_2"><requiredInput href="#In_BorderProximityTier" /></informationRequirement>
<decisionTable id="dt_Decision_CellBroadcastScope" hitPolicy="FIRST">
<input id="Decision_CellBroadcastScope_i0" label="Threat level">
<inputExpression id="Decision_CellBroadcastScope_ie0" typeRef="string"><text>threatLevel</text></inputExpression>
</input>
<input id="Decision_CellBroadcastScope_i1" label="Border-proximity tier">
<inputExpression id="Decision_CellBroadcastScope_ie1" typeRef="string"><text>borderProximityTier</text></inputExpression>
</input>
<output id="Decision_CellBroadcastScope_o0" label="Alert municipalities" name="alertMunicipalities" typeRef="string" />
<output id="Decision_CellBroadcastScope_o1" label="Message template" name="messageTemplate" typeRef="string" />
<output id="Decision_CellBroadcastScope_o2" label="Repeat interval (seconds)" name="repeatIntervalSeconds" typeRef="number" />
<rule id="Decision_CellBroadcastScope_r0">
<description>Critical: alert the predicted corridor plus every tier-1 border municipality; repeat every 2 min.</description>
<inputEntry><text>"critical"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>corridorMunicipalities + ",ALL_TIER1_BORDER"</text></outputEntry>
<outputEntry><text>"MSG_DRONE_IMMINENT"</text></outputEntry>
<outputEntry><text>120</text></outputEntry>
</rule>
<rule id="Decision_CellBroadcastScope_r1">
<description>High: alert the predicted corridor; repeat every 3 min.</description>
<inputEntry><text>"high"</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>corridorMunicipalities</text></outputEntry>
<outputEntry><text>"MSG_DRONE_IMMINENT"</text></outputEntry>
<outputEntry><text>180</text></outputEntry>
</rule>
<rule id="Decision_CellBroadcastScope_r2">
<description>Elevated near the border (tier 1-2): possible-drone advisory to the corridor.</description>
<inputEntry><text>"elevated"</text></inputEntry>
<inputEntry><text>"tier1","tier2"</text></inputEntry>
<outputEntry><text>corridorMunicipalities</text></outputEntry>
<outputEntry><text>"MSG_DRONE_POSSIBLE"</text></outputEntry>
<outputEntry><text>300</text></outputEntry>
</rule>
<rule id="Decision_CellBroadcastScope_r3">
<description>Elevated further inland (tier 3): lighter monitoring advisory to the corridor.</description>
<inputEntry><text>"elevated"</text></inputEntry>
<inputEntry><text>"tier3"</text></inputEntry>
<outputEntry><text>corridorMunicipalities</text></outputEntry>
<outputEntry><text>"MSG_AIRSPACE_MONITORING"</text></outputEntry>
<outputEntry><text>600</text></outputEntry>
</rule>
<rule id="Decision_CellBroadcastScope_r4">
<description>Low or no threat: no public broadcast; municipal commissions informed through other channels.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"none"</text></outputEntry>
<outputEntry><text>"MSG_NONE"</text></outputEntry>
<outputEntry><text>0</text></outputEntry>
</rule>
</decisionTable>
</decision>
<decision id="Decision_InterceptionAuthorization" name="Interception authorization">
<variable id="v_interception" name="interception" typeRef="string" />
<informationRequirement id="ir_d3_1"><requiredDecision href="#Decision_AirThreatSeverity" /></informationRequirement>
<informationRequirement id="ir_d3_2"><requiredInput href="#In_PositiveHostileId" /></informationRequirement>
<informationRequirement id="ir_d3_3"><requiredInput href="#In_OverPopulated" /></informationRequirement>
<informationRequirement id="ir_d3_4"><requiredInput href="#In_DebrisClear" /></informationRequirement>
<informationRequirement id="ir_d3_5"><requiredInput href="#In_FiringReady" /></informationRequirement>
<informationRequirement id="ir_d3_6"><requiredInput href="#In_BapOnStation" /></informationRequirement>
<decisionTable id="dt_d3" hitPolicy="FIRST">
<input id="d3_i1" label="Threat level">
<inputExpression typeRef="string"><text>threatLevel</text></inputExpression>
<description>Authorises or withholds kinetic interception. Engagement is gated first on positive hostile identification and then on civilian and debris safety: absence of a positive hostile ID always yields hold, regardless of threat level.</description>
<variable id="v_interceptionDecision" name="interceptionDecision" typeRef="string" />
<informationRequirement id="ir_Decision_InterceptionAuthorization_0"><requiredDecision href="#Decision_AirThreatSeverity" /></informationRequirement>
<informationRequirement id="ir_Decision_InterceptionAuthorization_1"><requiredInput href="#In_PositiveHostileId" /></informationRequirement>
<informationRequirement id="ir_Decision_InterceptionAuthorization_2"><requiredInput href="#In_OverPopulatedArea" /></informationRequirement>
<informationRequirement id="ir_Decision_InterceptionAuthorization_3"><requiredInput href="#In_DebrisZoneClear" /></informationRequirement>
<informationRequirement id="ir_Decision_InterceptionAuthorization_4"><requiredInput href="#In_GroundFiringReady" /></informationRequirement>
<informationRequirement id="ir_Decision_InterceptionAuthorization_5"><requiredInput href="#In_BapOnStation" /></informationRequirement>
<decisionTable id="dt_Decision_InterceptionAuthorization" hitPolicy="FIRST">
<input id="Decision_InterceptionAuthorization_i0" label="Threat level">
<inputExpression id="Decision_InterceptionAuthorization_ie0" typeRef="string"><text>threatLevel</text></inputExpression>
</input>
<input id="d3_i2" label="Over populated area">
<inputExpression typeRef="boolean"><text>overPopulatedArea</text></inputExpression>
<input id="Decision_InterceptionAuthorization_i1" label="Positive hostile ID">
<inputExpression id="Decision_InterceptionAuthorization_ie1" typeRef="boolean"><text>positiveHostileId</text></inputExpression>
</input>
<input id="d3_i3" label="Debris zone clear">
<inputExpression typeRef="boolean"><text>debrisZoneClear</text></inputExpression>
<input id="Decision_InterceptionAuthorization_i2" label="Over populated area">
<inputExpression id="Decision_InterceptionAuthorization_ie2" typeRef="boolean"><text>overPopulatedArea</text></inputExpression>
</input>
<input id="d3_i4" label="Firing position ready">
<inputExpression typeRef="boolean"><text>firingPositionReady</text></inputExpression>
<input id="Decision_InterceptionAuthorization_i3" label="Debris zone clear">
<inputExpression id="Decision_InterceptionAuthorization_ie3" typeRef="boolean"><text>debrisZoneClear</text></inputExpression>
</input>
<input id="d3_i5" label="BAP on station">
<inputExpression typeRef="boolean"><text>bapOnStation</text></inputExpression>
<input id="Decision_InterceptionAuthorization_i4" label="Ground firing ready">
<inputExpression id="Decision_InterceptionAuthorization_ie4" typeRef="boolean"><text>groundFiringReady</text></inputExpression>
</input>
<output id="d3_o1" label="Interception decision" name="interceptionDecision" typeRef="string" />
<output id="d3_o2" label="Rationale code" name="rationaleCode" typeRef="string" />
<rule id="d3_r1">
<input id="Decision_InterceptionAuthorization_i5" label="BAP on station">
<inputExpression id="Decision_InterceptionAuthorization_ie5" typeRef="boolean"><text>bapOnStation</text></inputExpression>
</input>
<output id="Decision_InterceptionAuthorization_o0" label="Interception decision" name="interceptionDecision" typeRef="string" />
<output id="Decision_InterceptionAuthorization_o1" label="Rationale code" name="rationaleCode" typeRef="string" />
<rule id="Decision_InterceptionAuthorization_r0">
<description>No positive hostile identification: engagement is never authorised.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"hold"</text></outputEntry>
<outputEntry><text>"R_NO_HOSTILE_ID"</text></outputEntry>
</rule>
<rule id="Decision_InterceptionAuthorization_r1">
<description>Object over a populated area: kinetic engagement withheld to avoid civilian casualties.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
@@ -181,34 +362,42 @@
<outputEntry><text>"hold"</text></outputEntry>
<outputEntry><text>"R_CIVILIAN_RISK"</text></outputEntry>
</rule>
<rule id="d3_r2">
<rule id="Decision_InterceptionAuthorization_r2">
<description>Debris fall-zone not confirmed clear: engagement withheld.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"hold"</text></outputEntry>
<outputEntry><text>"R_DEBRIS_RISK"</text></outputEntry>
</rule>
<rule id="d3_r3">
<inputEntry><text>"high","elevated"</text></inputEntry>
<rule id="Decision_InterceptionAuthorization_r3">
<description>High/critical threat, hostile-confirmed, safe, ground firing position ready: engage from the ground.</description>
<inputEntry><text>"high","critical"</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"engage"</text></outputEntry>
<outputEntry><text>"engage-ground"</text></outputEntry>
<outputEntry><text>"R_GROUND_PGA"</text></outputEntry>
</rule>
<rule id="d3_r4">
<inputEntry><text>"high","elevated"</text></inputEntry>
<rule id="Decision_InterceptionAuthorization_r4">
<description>High/critical threat, hostile-confirmed, safe, no ground option but BAP on station: hand to NATO BAP.</description>
<inputEntry><text>"high","critical"</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<outputEntry><text>"engage"</text></outputEntry>
<outputEntry><text>"engage-bap"</text></outputEntry>
<outputEntry><text>"R_BAP_AIR"</text></outputEntry>
</rule>
<rule id="d3_r5">
<rule id="Decision_InterceptionAuthorization_r5">
<description>Fallback: interception criteria not met.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
@@ -219,61 +408,192 @@
</rule>
</decisionTable>
</decision>
<decision id="Decision_StandDownCriteria" name="Stand-down &amp; all-clear">
<description>Determines when the public alert can be lifted and an all-clear cell-broadcast issued. Requires the object to be resolved and no further tracks in the area.</description>
<variable id="v_standDownDecision" name="standDownDecision" typeRef="string" />
<informationRequirement id="ir_Decision_StandDownCriteria_0"><requiredInput href="#In_ObjectNeutralized" /></informationRequirement>
<informationRequirement id="ir_Decision_StandDownCriteria_1"><requiredInput href="#In_ActiveTracksRemain" /></informationRequirement>
<decisionTable id="dt_Decision_StandDownCriteria" hitPolicy="FIRST">
<input id="Decision_StandDownCriteria_i0" label="Object neutralized / landed">
<inputExpression id="Decision_StandDownCriteria_ie0" typeRef="boolean"><text>objectNeutralized</text></inputExpression>
</input>
<input id="Decision_StandDownCriteria_i1" label="Active tracks remain">
<inputExpression id="Decision_StandDownCriteria_ie1" typeRef="boolean"><text>activeTracksRemain</text></inputExpression>
</input>
<output id="Decision_StandDownCriteria_o0" label="Stand-down decision" name="standDownDecision" typeRef="string" />
<output id="Decision_StandDownCriteria_o1" label="All-clear message" name="allClearMessage" typeRef="string" />
<rule id="Decision_StandDownCriteria_r0">
<description>Object resolved and no further tracks: issue the all-clear.</description>
<inputEntry><text>true</text></inputEntry>
<inputEntry><text>false</text></inputEntry>
<outputEntry><text>"all-clear"</text></outputEntry>
<outputEntry><text>"MSG_ALL_CLEAR"</text></outputEntry>
</rule>
<rule id="Decision_StandDownCriteria_r1">
<description>Tracks still active in the area: maintain the public alert.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>true</text></inputEntry>
<outputEntry><text>"maintain-alert"</text></outputEntry>
<outputEntry><text>"MSG_NONE"</text></outputEntry>
</rule>
<rule id="Decision_StandDownCriteria_r2">
<description>Object not yet resolved: maintain the public alert.</description>
<inputEntry><text>-</text></inputEntry>
<inputEntry><text>-</text></inputEntry>
<outputEntry><text>"maintain-alert"</text></outputEntry>
<outputEntry><text>"MSG_NONE"</text></outputEntry>
</rule>
</decisionTable>
</decision>
<dmndi:DMNDI>
<dmndi:DMNDiagram id="drd_1">
<dmndi:DMNShape id="s_d1" dmnElementRef="Decision_AirThreatSeverity">
<dc:Bounds x="360" y="80" width="180" height="80" />
<dmndi:DMNDiagram id="drd_air_threat">
<dmndi:DMNShape id="s_Decision_ObjectClassification" dmnElementRef="Decision_ObjectClassification">
<dc:Bounds x="120" y="250" width="200" height="90" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_d2" dmnElementRef="Decision_CellBroadcastScope">
<dc:Bounds x="180" y="240" width="180" height="80" />
<dmndi:DMNShape id="s_Decision_AirThreatSeverity" dmnElementRef="Decision_AirThreatSeverity">
<dc:Bounds x="470" y="250" width="200" height="90" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_d3" dmnElementRef="Decision_InterceptionAuthorization">
<dc:Bounds x="540" y="240" width="180" height="80" />
<dmndi:DMNShape id="s_Decision_NotificationUrgency" dmnElementRef="Decision_NotificationUrgency">
<dc:Bounds x="820" y="120" width="200" height="90" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_objtype" dmnElementRef="In_ObjectType">
<dc:Bounds x="120" y="-40" width="140" height="50" />
<dmndi:DMNShape id="s_Decision_CellBroadcastScope" dmnElementRef="Decision_CellBroadcastScope">
<dc:Bounds x="1170" y="120" width="200" height="90" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_airspace" dmnElementRef="In_AirspaceStatus">
<dc:Bounds x="290" y="-40" width="140" height="50" />
<dmndi:DMNShape id="s_Decision_InterceptionAuthorization" dmnElementRef="Decision_InterceptionAuthorization">
<dc:Bounds x="820" y="440" width="200" height="90" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_traj" dmnElementRef="In_TrajectoryToward">
<dc:Bounds x="460" y="-40" width="140" height="50" />
<dmndi:DMNShape id="s_Decision_StandDownCriteria" dmnElementRef="Decision_StandDownCriteria">
<dc:Bounds x="1170" y="440" width="200" height="90" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_dist" dmnElementRef="In_DistanceKm">
<dc:Bounds x="630" y="-40" width="140" height="50" />
<dmndi:DMNShape id="s_In_RadarCrossSection" dmnElementRef="In_RadarCrossSection">
<dc:Bounds x="40" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_tier" dmnElementRef="In_BorderTier">
<dc:Bounds x="0" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_EmissionProfile" dmnElementRef="In_EmissionProfile">
<dc:Bounds x="210" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_corr" dmnElementRef="In_CorridorMunis">
<dc:Bounds x="160" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_VisualConfirmation" dmnElementRef="In_VisualConfirmation">
<dc:Bounds x="380" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_phid" dmnElementRef="In_PositiveHostileId">
<dc:Bounds x="340" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_AirspaceStatus" dmnElementRef="In_AirspaceStatus">
<dc:Bounds x="550" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_overpop" dmnElementRef="In_OverPopulated">
<dc:Bounds x="500" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_TrajectoryTowardPop" dmnElementRef="In_TrajectoryTowardPop">
<dc:Bounds x="720" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_debris" dmnElementRef="In_DebrisClear">
<dc:Bounds x="660" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_DistanceToPopulatedKm" dmnElementRef="In_DistanceToPopulatedKm">
<dc:Bounds x="890" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_firing" dmnElementRef="In_FiringReady">
<dc:Bounds x="820" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_EstimatedMinutesToPop" dmnElementRef="In_EstimatedMinutesToPop">
<dc:Bounds x="1060" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_in_bap" dmnElementRef="In_BapOnStation">
<dc:Bounds x="980" y="380" width="140" height="50" />
<dmndi:DMNShape id="s_In_CorridorMunicipalities" dmnElementRef="In_CorridorMunicipalities">
<dc:Bounds x="1230" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNEdge id="e_ir_d1_1" dmnElementRef="ir_d1_1">
<di:waypoint x="190" y="10" /><di:waypoint x="420" y="80" />
<dmndi:DMNShape id="s_In_BorderProximityTier" dmnElementRef="In_BorderProximityTier">
<dc:Bounds x="1400" y="40" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_PositiveHostileId" dmnElementRef="In_PositiveHostileId">
<dc:Bounds x="40" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_OverPopulatedArea" dmnElementRef="In_OverPopulatedArea">
<dc:Bounds x="210" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_DebrisZoneClear" dmnElementRef="In_DebrisZoneClear">
<dc:Bounds x="380" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_GroundFiringReady" dmnElementRef="In_GroundFiringReady">
<dc:Bounds x="550" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_BapOnStation" dmnElementRef="In_BapOnStation">
<dc:Bounds x="720" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_ObjectNeutralized" dmnElementRef="In_ObjectNeutralized">
<dc:Bounds x="1060" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNShape id="s_In_ActiveTracksRemain" dmnElementRef="In_ActiveTracksRemain">
<dc:Bounds x="1230" y="620" width="150" height="55" />
</dmndi:DMNShape>
<dmndi:DMNEdge id="e_ir_Decision_ObjectClassification_0" dmnElementRef="ir_Decision_ObjectClassification_0">
<di:waypoint x="115" y="67" />
<di:waypoint x="220" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_d2_1" dmnElementRef="ir_d2_1">
<di:waypoint x="400" y="160" /><di:waypoint x="290" y="240" />
<dmndi:DMNEdge id="e_ir_Decision_ObjectClassification_1" dmnElementRef="ir_Decision_ObjectClassification_1">
<di:waypoint x="285" y="67" />
<di:waypoint x="220" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_d3_1" dmnElementRef="ir_d3_1">
<di:waypoint x="480" y="160" /><di:waypoint x="610" y="240" />
<dmndi:DMNEdge id="e_ir_Decision_ObjectClassification_2" dmnElementRef="ir_Decision_ObjectClassification_2">
<di:waypoint x="455" y="67" />
<di:waypoint x="220" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_AirThreatSeverity_0" dmnElementRef="ir_Decision_AirThreatSeverity_0">
<di:waypoint x="220" y="295" />
<di:waypoint x="570" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_AirThreatSeverity_1" dmnElementRef="ir_Decision_AirThreatSeverity_1">
<di:waypoint x="625" y="67" />
<di:waypoint x="570" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_AirThreatSeverity_2" dmnElementRef="ir_Decision_AirThreatSeverity_2">
<di:waypoint x="795" y="67" />
<di:waypoint x="570" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_AirThreatSeverity_3" dmnElementRef="ir_Decision_AirThreatSeverity_3">
<di:waypoint x="965" y="67" />
<di:waypoint x="570" y="295" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_NotificationUrgency_0" dmnElementRef="ir_Decision_NotificationUrgency_0">
<di:waypoint x="570" y="295" />
<di:waypoint x="920" y="165" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_NotificationUrgency_1" dmnElementRef="ir_Decision_NotificationUrgency_1">
<di:waypoint x="1135" y="67" />
<di:waypoint x="920" y="165" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_CellBroadcastScope_0" dmnElementRef="ir_Decision_CellBroadcastScope_0">
<di:waypoint x="570" y="295" />
<di:waypoint x="1270" y="165" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_CellBroadcastScope_1" dmnElementRef="ir_Decision_CellBroadcastScope_1">
<di:waypoint x="1305" y="67" />
<di:waypoint x="1270" y="165" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_CellBroadcastScope_2" dmnElementRef="ir_Decision_CellBroadcastScope_2">
<di:waypoint x="1475" y="67" />
<di:waypoint x="1270" y="165" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_InterceptionAuthorization_0" dmnElementRef="ir_Decision_InterceptionAuthorization_0">
<di:waypoint x="570" y="295" />
<di:waypoint x="920" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_InterceptionAuthorization_1" dmnElementRef="ir_Decision_InterceptionAuthorization_1">
<di:waypoint x="115" y="647" />
<di:waypoint x="920" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_InterceptionAuthorization_2" dmnElementRef="ir_Decision_InterceptionAuthorization_2">
<di:waypoint x="285" y="647" />
<di:waypoint x="920" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_InterceptionAuthorization_3" dmnElementRef="ir_Decision_InterceptionAuthorization_3">
<di:waypoint x="455" y="647" />
<di:waypoint x="920" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_InterceptionAuthorization_4" dmnElementRef="ir_Decision_InterceptionAuthorization_4">
<di:waypoint x="625" y="647" />
<di:waypoint x="920" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_InterceptionAuthorization_5" dmnElementRef="ir_Decision_InterceptionAuthorization_5">
<di:waypoint x="795" y="647" />
<di:waypoint x="920" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_StandDownCriteria_0" dmnElementRef="ir_Decision_StandDownCriteria_0">
<di:waypoint x="1135" y="647" />
<di:waypoint x="1270" y="485" />
</dmndi:DMNEdge>
<dmndi:DMNEdge id="e_ir_Decision_StandDownCriteria_1" dmnElementRef="ir_Decision_StandDownCriteria_1">
<di:waypoint x="1305" y="647" />
<di:waypoint x="1270" y="485" />
</dmndi:DMNEdge>
</dmndi:DMNDiagram>
</dmndi:DMNDI>
</definitions>

View File

@@ -1,60 +1,33 @@
# 00 — Incident Chronology: Rēzekne Drone Incident, 7 May 2026
# 00 — Incident Chronology (7 May 2026, Rezekne)
> Non-normative supporting document. Compiled from public reporting
> (LSM / eng.lsm.lv, Apollo, TV3, Meduza, Defense News, The Globe and Mail,
> Wikipedia "2026 Ukrainian drone incursions into Baltic states"). Times are
> local (EEST) and approximate where the public record is approximate.
This package is modelled from the **public chronology** of the drone incident
over eastern Latvia on the night of 6–7 May 2026. No classified or operational
source was used.
## Summary
## Public-source timeline
During the night of 6–7 May 2026, several unmanned aerial vehicles entered
Latvian airspace from the direction of Russia. Two drones came down on Latvian
territory; one exploded at a fuel-storage facility in Rēzekne (~40 km from the
Russian border), damaging four empty oil tanks. No casualties. The drones are
assessed as stray Ukrainian long-range drones diverted off course — Ukraine's
foreign minister later linked the diversion to Russian electronic-warfare
jamming. The incident triggered a political crisis: the Defence Minister and,
days later, the Prime Minister resigned.
| Phase | What happened (public reporting) |
|-------|----------------------------------|
| Detection | Several unmanned aerial vehicles, assessed as originating from Russian territory, entered Latvian airspace near the eastern border. |
| Tracking | NBS surveillance tracked the objects; at least two drones came down on Latvian territory, one near Rezekne. |
| Impact | A drone struck near a fuel-storage facility in the Rezekne area; no casualties were publicly reported. |
| Public notification | The public cell-broadcast early-warning message reached the Rezekne population **approximately 40 minutes** after the threat was apparent — the central failure this package addresses. |
| Aftermath | The Ministry of Defence publicly committed to **revising the inter-institutional notification algorithms** so that a public alert is issued without comparable delay. |
## Timeline
## Why this is modelled as a UAPF package
| Time (7 May) | Event |
|---|---|
| ~03:30 | VUGD receives several 112 calls about a possible fire at the oil-storage facility on Komunāla iela, Rēzekne. |
| 04:09 | Cell-broadcast warning issued to residents of Ludza and Balvi districts, at NBS request. |
| 04:43 | Cell-broadcast warning issued to Rēzekne district — roughly 40 minutes after Ludza/Balvi. Rēzekne city residents report having already heard/seen drones overhead about an hour before receiving the alert. |
| ~05:30 | NBS announces that two UAVs have crashed on Latvian territory; NBS, State Police and VUGD units deploy to the sites. |
| Morning | One crash site confirmed at the Rēzekne oil-storage base. A second crash site is not yet identified (later associated with the Viļāni area, west of Rēzekne). A possible third drone is believed to have exited Latvian airspace. |
| Daytime | Flights restricted up to ~6 km altitude in the eastern border region; commercial aviation unaffected. Schools closed in Rēzekne and Ludza; remote learning in Balvi. French NATO Baltic Air Policing jets scrambled during the alert. |
| ~08:20–08:51 | NBS declares the air-threat alert ended for Balvi, Ludza and Rēzekne districts. |
| 12:00 | Press conference in Rēzekne (AM / NBS / State Police). |
| ~18:00 | Eastern-region flight restrictions lifted. |
| Daytime | Government Crisis Management Council convenes. PM Siliņa states the threat is "a consequence of Russia's war in Ukraine" and asks the Ministry of Defence to clarify why cell-broadcast warnings were issued only after the crash was reported. |
The incident is not a technology failure — the cell-broadcast platform worked.
It is a **process and decision-rights failure**: the algorithm that converts
"NBS sees a threat" into "VUGD dispatches a public broadcast" was slow and
under-specified. That is exactly the class of problem UAPF exists to make
explicit, inspectable and improvable: a BPMN process, the DMN decisions inside
it, the CMMN follow-up case, and the resource bindings that say who does what.
## Aftermath
## Scope boundary
- **10 May 2026** — Defence Minister Andris Sprūds resigns. He had already
survived an April Saeima no-confidence-style vote (43 for dismissal, 50
against).
- **~14 May 2026** — Prime Minister Evika Siliņa resigns; the government falls.
- The Foreign Ministry summoned Russia's chargé d'affaires; Ukraine's foreign
minister later acknowledged the drones were Ukrainian and attributed the
diversion to Russian electronic warfare.
- The Ministry of Defence committed to **review and improve the public
notification / inter-institutional information-exchange algorithms**. The
Rēzekne incident was designated a central scenario for the "Pilskalns" civil
protection exercise.
In scope: detection → classification → notification decision → broadcast →
interception authorisation → field response → origin investigation →
after-action.
## Prior incidents in the same series (context)
- **7 September 2024** — A Russian "Shahed"-type drone fell in Gaigalava
parish, Rēzekne district. After-action commitments were made then to speed
up public notification.
- **25 March 2026** — A stray Ukrainian drone crashed in Krāslava district
(Dobročina); a parallel drone struck a power-station chimney in Estonia.
- **3 May 2026** — Air-threat cell broadcasts in Alūksne, Balvi, Ludza,
Rēzekne and Krāslava (~3.5 h); no drone crossed the border.
The 7 May incident is therefore the **fourth comparable event in ~20 months**,
which is why the failure is framed publicly as an algorithm/process failure
rather than a one-off.
Out of scope: NBS internal sensor doctrine, NATO BAP internal procedures,
and the criminal investigation, which are referenced only as handoffs.

View File

@@ -1,51 +1,24 @@
# 01 — Institutional Gap Analysis (AS-IS) and TO-BE Targets
# 01 — Institutional Gap Analysis
> Non-normative supporting document. This is the analytical core of the package:
> it maps each publicly-reported coordination failure to a specific element of
> the BPMN / DMN / CMMN models, so the revised algorithm can be designed against
> a concrete baseline.
Gaps identified in the **as-is** algorithm, derived from the public chronology.
Each gap is addressed by a specific element of this package and is referenced
from `resources/mappings.yaml` and the diagrams.
## Why this package exists
| ID | Gap (as-is) | Addressed by (to-be) |
|----|-------------|----------------------|
| **G1** | No explicit object-classification step — "is it a drone, and how sure are we?" was implicit. | `Decision_ObjectClassification` makes class **and confidence** explicit before any threat call. |
| **G2** | Public-broadcast authority was a **single point of failure**: one request from NBS Joint Staff was the only trigger, with no timed fallback. | `Task_AuthorizeBroadcast` carries a 3-minute timeout with a proposed escalation to the Crisis Management Centre (KVC). *Not yet institutionally agreed.* |
| **G3** | Message wording was composed under time pressure. | `Decision_CellBroadcastScope` selects a **pre-approved template** (`MSG_*`); guardrail GR-4 forbids free-text public messaging. |
| **G4** | No bounded, threat-graded **time target** for dispatch — the 40-minute delay had no SLA to breach. | `Decision_NotificationUrgency` outputs `broadcastSlaSeconds`; see `03-notification-timing-sla.md`. |
| **G5** | No automatic detection that the SLA had been missed. | Non-interrupting **SLA-breach boundary timer** on `Task_DispatchBroadcast``Task_EscalateSla`. |
| **G6** | Alert footprint was coarse — not matched to the drones' predicted path. | `Decision_CellBroadcastScope` builds the footprint from `corridorMunicipalities`. |
| **G7** | Interception safety criteria were not written down or inspectable. | `Decision_InterceptionAuthorization` gates engagement on positive hostile ID, over-populated-area and debris-zone-clear, in that priority order. |
| **G8** | Follow-on civil decisions (school closures, resident enquiries) had no owner. | CMMN stage `Stage_FieldResponse` (`HT_MunicipalEnquiries`); IZM recorded as a consulted party in `02-raci.md`. |
After the 7 May 2026 Rēzekne incident the Ministry of Defence stated publicly
that the inter-institutional **information / notification algorithms** must be
reviewed and improved. The problem reported by municipalities and crisis-management
officials was not a single mistake but a **structural misalignment**: no single,
shared, machine-checkable description of who decides what, when, and on which
inputs. UAPF exists precisely to hold that description as versioned, reviewable
artifacts. This package is the AS-IS baseline.
## Residual / open
## Gap register
| # | Reported gap (public record) | Where it lives in the model | TO-BE target |
|---|---|---|---|
| G1 | Cell-broadcast reached Rēzekne city only after residents had already seen/heard the drones; ~40-min lag vs Ludza/Balvi. | `Task_RequestBroadcast``Task_CellBroadcast` | Tighten the trigger so the request is driven by the **predicted corridor**, not by confirmed overflight. `Decision_CellBroadcastScope` already takes `corridorMunicipalities` — make corridor pre-alerting mandatory at `threatLevel = elevated`. |
| G2 | Single point of failure: the alert fires only on an explicit NBS request. NBS stated the alert was not sent to Rēzekne because the "incident duration was too short"; the Interior Minister stated VUGD was ready but "a clear algorithm was not triggered". | `Task_RequestBroadcast` (documented GAP) | Define an explicit fallback authority and a time-boxed escalation: if NBS does not issue / decline a request within N minutes of a confirmed corridor, a named role (KVC duty) may trigger. Model as a boundary timer event on `Task_RequestBroadcast` in v0.2. |
| G3 | Message content too thin — "possible threat" with no nature-of-threat detail; residents phoned municipalities asking whether tanks or drones were coming. | `Decision_CellBroadcastScope` output `messageTemplate` | Replace generic text with typed templates (`MSG_DRONE_IMMINENT`, `MSG_DRONE_POSSIBLE`, `MSG_AIRSPACE_MONITORING`) carrying threat type, recommended action and an information URL. Templates are an output column in the DMN table. |
| G4 | No unified action algorithm across institutions; municipalities reported missing communication with state institutions and unclear ownership (AM vs VARAM vs IZM). | `Task_NotifyAgencies`; `resources/mappings.yaml` | A single resource mapping with explicit RACI per element (this package), reviewed jointly. Notification to KVC, IeM and municipal commissions modelled as a **parallel** branch so it cannot be skipped. |
| G5 | Information on number/origin/landing sites of the drones was unavailable for ~5 hours. | CMMN `Stage_Investigation` (`HT_TechExam`, `HT_OriginAttribution`) | Make investigation a first-class case stage with explicit milestones and an information-publishing cadence, not an ad-hoc activity. |
| G6 | ~3-day delay before clear public acknowledgement of the drones' (Ukrainian) origin created a perception of concealment. | CMMN `HT_OriginAttribution`, `HT_DisinfoMonitor`, `HT_Press` | Decouple "confirm origin" from "inform public": publish what is known on a fixed cadence; disinformation monitoring runs in parallel from the start. |
| G7 | Interception not attempted; criteria ("all safety criteria") were not transparent or pre-agreed. | `Decision_InterceptionAuthorization` | Make the safety criteria an explicit, inspectable DMN table (civilian risk, debris fall-zone, positive ID, firing-position readiness, BAP availability) rather than a verbal judgement. |
| G8 | School-closure and resident-guidance decisions lacked timely recommendations from IZM. | `Task_LocalResponse` (IZM consulted) | Bind IZM as a consulted resource on `Task_LocalResponse` with a pre-agreed guidance template issued automatically at `threatLevel >= elevated`. |
## Modelling stance
- The BPMN / DMN / CMMN in v0.1.0 deliberately model the **AS-IS** algorithm
*plus* the minimum corrections needed for it to be internally consistent
(parallel notification, typed messages, explicit interception table).
- Items requiring a **policy decision** — notably G2 (fallback trigger
authority) — are flagged in `docs/02-raci.md` and left as open questions for
v0.2; they must not be silently encoded by a process author.
- Nothing here is operationally approved. Lifecycle status is `draft`.
## Open questions for the institutional steward
1. **G2** — Who is the named fallback authority if NBS does not act within the
escalation window, and what is the window length?
2. Should cell-broadcast corridor pre-alerting be automatic at
`threatLevel = elevated`, or remain a human decision?
3. Is the cell-broadcast platform owned operationally by VUGD only, or jointly
with VARAM for the early-warning evolution? This changes the `Task_CellBroadcast`
binding.
4. What is the mandated public-information cadence during an active incident
(G5/G6)?
- **G2 escalation authority** is a *proposal*. Whether KVC may authorise a
public broadcast when NBS Joint Staff is unreachable is an institutional and
legal question, not a modelling one, and is flagged for review.
- SLA values in `03-notification-timing-sla.md` are **proposed defaults** for
validation against NBS/VUGD operational reality.

View File

@@ -1,66 +1,26 @@
# 02 — RACI Matrix
> Non-normative supporting document. Human-readable view of the bindings in
> `resources/mappings.yaml`. R = Responsible, A = Accountable, C = Consulted,
> I = Informed. The machine-readable source of truth is the resources cornerstone.
R = Responsible, A = Accountable, C = Consulted, I = Informed.
Bindings in `resources/mappings.yaml` express the **R** column; this matrix
adds the A/C/I context that a single-target binding cannot.
## Actors
| Activity | NBS Joint Staff | NBS Air Def. | VUGD | State Police | NMPD | Municipal | MoD | KVC | IeM / IZM |
|----------|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| Classify & assess threat | R/A | I | I | – | – | I | I | C | – |
| Determine notification & scope | R/A | – | C | – | – | I | I | C | – |
| Authorise public broadcast | R/A | – | I | – | – | I | I | C* | I |
| Dispatch cell-broadcast | A | – | R | – | – | I | I | I | I |
| Escalate SLA breach | C | – | I | – | – | I | I | R/A | I |
| Authorise interception | R/A | C | – | – | – | – | C | I | – |
| Execute interception | A | R | – | – | – | – | I | I | – |
| Field response | C | – | R | R | R | R | I | A | I |
| Origin investigation | R | – | – | C | – | – | A/C | I | I |
| Public communication | C | – | – | – | – | I | R/A | C | I |
| After-action review | C | C | C | C | C | C | A | R | C |
| Code | Institution / system |
|---|---|
| NBS-SURV | NBS air surveillance and radar network |
| NBS-JS | NBS Joint Staff, operational duty |
| NBS-AD | NBS air-defence units (pretgaisa aizsardzība) |
| NATO-BAP | NATO Baltic Air Policing mission |
| VUGD | VUGD operational duty / 112 |
| CB-SYS | Cell-broadcast system (operated by VUGD) |
| VP | State Police operational duty |
| KVC | Crisis Management Centre |
| AM | Ministry of Defence |
| IeM | Ministry of the Interior |
| VARAM | Ministry of Smart Administration and Regional Development |
| IZM | Ministry of Education and Science |
| MUN-CP | Municipal civil-protection commissions |
| GOV-CC | Government Crisis Management Council |
\* KVC as Consulted today; the proposed G2 fallback would make KVC **R** for
authorising the broadcast on NBS Joint Staff timeout.
## Process steps (BPMN)
| Step | A | R | C | I |
|---|---|---|---|---|
| Classify object & track trajectory | NBS-JS | NBS-SURV | — | — |
| Assess air threat severity | NBS-JS | — | — | — |
| Determine cell-broadcast scope & message | NBS-JS | — | KVC, VARAM | — |
| Issue cell-broadcast request to VUGD | NBS-JS | — | — | — |
| Trigger cell broadcast | VUGD | CB-SYS | — | — |
| Notify KVC, IeM & municipal commissions | — | NBS-JS | — | KVC, IeM, MUN-CP |
| Evaluate interception | NBS-JS | — | AM, NBS-AD, NATO-BAP | — |
| Coordinate interception (BAP / PGA) | — | NBS-AD, NATO-BAP | — | — |
| Activate local civil-protection response | MUN-CP | VP | IZM | — |
| Declare threat ended / all-clear | NBS-JS | CB-SYS | — | — |
| Field response & origin investigation (case) | KVC | — | — | — |
## Case tasks (CMMN)
| Task | A | R | C |
|---|---|---|---|
| Localise & search crash sites | — | NBS-JS | VP |
| Site safety & fire suppression | — | VUGD | — |
| Scene security & access control | — | VP | — |
| Resident enquiries via municipal commissions | — | MUN-CP | — |
| Technical examination of debris | — | NBS-JS | — |
| Origin attribution & EW-diversion analysis | NBS-JS | — | AM |
| Disinformation monitoring & correction | — | AM | — |
| Press conference / public information | AM | — | KVC |
| Cross-institutional after-action review | AM | KVC | — (GOV-CC informed) |
## Known accountability ambiguities (do not resolve in a process draft)
- **Cell-broadcast trigger:** "A" sits with NBS-JS for the *request*, with VUGD
for *execution*. The public failure (G2) is the gap *between* these two "A"s.
A revised algorithm needs an explicit fallback "A" — currently unassigned.
- **Cell-broadcast platform stewardship:** assigned here to VUGD; VARAM may hold
a co-stewardship role for the early-warning system evolution. Confirm before
v0.2.
- **Public-information tempo:** "A" for `HT_Press` is AM, but during the 7 May
incident the perceived delay (G6) suggests the cadence itself needs an owner
and a mandated interval.
**Consulted parties not in `mappings.yaml`:** VARAM (cell-broadcast platform
policy), IZM (school-closure guidance), the State Border Guard, and the
Government Crisis Management Council (informed at national level).

View File

@@ -0,0 +1,46 @@
# 03 — Notification Timing & SLA Model
The 7 May 2026 incident's defining failure was a **~40-minute** gap between a
visible air threat and the public cell-broadcast reaching Rezekne. This package
treats notification speed as a **first-class, modelled quantity** rather than an
implicit expectation.
## The SLA chain
1. `Decision_NotificationUrgency` takes `threatLevel` and the estimated minutes
until the object could reach people, and outputs:
- `notificationTier``immediate | priority | standard | none`
- `broadcastSlaSeconds` — the **maximum** time allowed from authorisation to
confirmed dispatch.
2. `Task_DispatchBroadcast` (VUGD) carries a **non-interrupting boundary timer**
armed at `broadcastSlaSeconds`.
3. If dispatch is not confirmed before the timer fires, `Task_EscalateSla`
runs **in parallel** — it does not cancel the broadcast, it escalates the
delay to the Crisis Management Centre so a human intervenes.
## Proposed SLA defaults
| Threat level | Lead time | Tier | `broadcastSlaSeconds` | Rationale |
|--------------|-----------|------|----------------------:|-----------|
| critical | any | immediate | 120 | Object inside airspace, closing on people. |
| high | ≤ 15 min | immediate | 180 | Little lead time; alert must precede impact. |
| high | > 15 min | priority | 300 | Lead time exists; brief verification window. |
| elevated | any | priority | 600 | Threat present, not yet tracking toward people. |
| low | any | standard | 1800 | Advisory only. |
| none | – | none | 0 | No public broadcast. |
Against these defaults, the Rezekne broadcast (~2400 s) breached even the most
lenient non-zero SLA **by an order of magnitude**. Under this model the boundary
timer would have fired at 120–180 s and escalated to KVC ~38 minutes earlier.
## Guardrail
`broadcastSlaSeconds` is a **hard floor for escalation, not a target for
dispatch** (guardrail GR-3). Dispatch should normally be far faster; the SLA is
the line past which the absence of a broadcast becomes its own incident.
## Open for validation
The table values are **modelling proposals**. They need calibration against
real NBS classification timelines and VUGD cell-broadcast dispatch latencies
before the package can leave `draft`.

View File

@@ -0,0 +1,50 @@
# 04 — UAPF-IP Integration
How a UAPF-IP (Integration Profile) host runs this package.
## Profiles
The manifest declares `uapf-ip-orchestrated` and `uapf-ip-sync-decision`:
- **orchestrated** — the host executes the BPMN process, calling host
capabilities (`task.assign`, `task.complete`, `task.escalate`, `event.emit`,
`timer.schedule`) and evaluating DMN decisions at each business-rule task.
- **sync-decision** — any of the six decisions can be evaluated standalone, as
a synchronous request/response, without running the process.
## Exposed entrypoints
`exposure.mcp.exposedEntrypoints` maps the process and each decision to an MCP
tool name, e.g. `interception_authorization.evaluate`. A UAPF-IP host with MCP
exposure enabled publishes these as callable tools. `runnable: true` permits
process execution, not only inspection.
## Required capabilities
`requires_capabilities` lists what the host must provide. Beyond the generic
task/event capabilities, this package needs:
- `timer.schedule@1+` — to arm the SLA-breach boundary timer.
- `ai.classify@1+`, `ai.complete@1+` — for the advisory threat-assessment agent.
- `lv.gov.civdef.air_surveillance_feed@1+`, `lv.gov.civdef.cell_broadcast@1+`
domain capabilities that wrap the NBS surveillance feed and the VUGD
cell-broadcast platform.
A host missing a required capability must refuse to load the package rather
than degrade silently.
## Guardrail enforcement
Every capability call is checked against `resources/guardrails.yaml` before and
after execution. The load-bearing guardrails: AI is advisory only (GR-1), no
autonomous use of force (GR-2), the SLA boundary timer may not be disabled
(GR-3), and public messaging is human-authored from templates (GR-4). A
violation **blocks** the call and is written to the audit trail.
## Decision/process boundary
The host owns orchestration, capability brokering, audit and guardrail
enforcement. The package owns **only** the logic — process shape, decision
tables, case structure and resource bindings. The package contains no
credentials; the placeholders in `resources/mappings.yaml` are resolved by the
host from its own secret store.

View File

@@ -0,0 +1,42 @@
# 05 — Validation Report
Package: `lv.civdef.drone-threat-public-address` v0.3.0
Date: 2026-05-18 · Tool: `validate.py`
## Result: 19 / 19 checks passed
### Structural
- All three cornerstone files (BPMN, DMN, CMMN) are well-formed XML.
- All six YAML files parse.
- `uapf.yaml` validates against `uapf-manifest.schema.json` (UAPF v2.2.0).
### Model integrity
- BPMN: 26 flow nodes; every `sequenceFlow` source/target resolves.
- DMN: exactly 6 decisions; every `informationRequirement` href resolves.
- CMMN: 11 human tasks across 3 stages.
### Quality gates added in v0.3.0 (these are the v0.2.0 defects)
- **Every DMN decision carries a `<description>`.** v0.2.0 had none.
- **No declared-but-unused decision inputs.** Every `requiredInput` of every
decision is used as a decision-table input column or in an output
expression. This is the check that proves the v0.2.0 interception defect —
`positiveHostileId` declared but never tested — is fixed.
- **Every `mappings.yaml` binding resolves to a real diagram element**, and
every `targetId` resolves to a declared target. The resource↔process linkage
is now machine-checkable.
## What is *not* validated here
- **Semantic correctness of the modelled algorithm** — whether these are the
right institutions, thresholds and SLAs — is an institutional review
question, tracked in `01-institutional-gap-analysis.md`.
- **DMN completeness/overlap** of `FIRST`-hit tables is not formally verified;
each table ends with a catch-all rule so no input is left without an output.
- Diagram interchange (DI) renders cleanly in `dmn-js` / `bpmn-js` / `cmmn-js`;
visual review in the target viewer is still recommended.
## Reproduce
```
python3 validate.py # exits non-zero on any failure
```

View File

@@ -1,19 +1,37 @@
kind: uapf.metadata.lifecycle
status: draft
created: "2026-05-17T00:00:00Z"
lastModified: "2026-05-17T00:00:00Z"
changeHistory:
- version: "0.2.0"
date: "2026-05-17"
summary: >-
Rebuilt against UAPF specification v2.2.0 SSOT. Corrected cornerstone
file extensions, resource-mapping schema, ownership/lifecycle metadata;
added policies, UAPF-IP guardrails, MCP exposure and workspace index.
author: rihards.gailums
version: "0.3.0"
package: lv.civdef.drone-threat-public-address
state: draft
history:
- version: "0.1.0"
date: "2026-05-17"
summary: >-
Initial draft modelling the AS-IS notification algorithm and its
identified gaps from the public chronology of the 7 May 2026 Rezekne
drone incident.
author: rihards.gailums
state: draft
note: Initial Level-4 package skeleton (BPMN + 3-decision DMN + CMMN).
- version: "0.2.0"
date: "2026-05-17"
state: draft
note: UAPF v2.2.0 manifest alignment; portable .uapf packaging.
- version: "0.3.0"
date: "2026-05-18"
state: draft
note: >-
Deep rebuild. DMN expanded to 6 decisions with descriptions and a clean
DRD; declared-but-unused decision inputs removed (interception now gated
on positive hostile ID). BPMN expanded to six institution lanes with a
non-interrupting SLA-breach boundary timer. CMMN deepened to three
stages. Resource mappings given an element-level legend.
transitions:
draft -> review:
requires:
- Institutional review of the modelled algorithm by NBS Joint Staff.
- Confirmation of the GAP G2 escalation authority (Task_AuthorizeBroadcast).
review -> approved:
requires:
- Sign-off by the Ministry of Defence algorithm-governance authority.
review:
next_review_due: "2026-08-18"
open_gaps_ref: docs/01-institutional-gap-analysis.md

View File

@@ -1,12 +1,37 @@
kind: uapf.metadata.ownership
version: "0.3.0"
package: lv.civdef.drone-threat-public-address
owners:
- type: person
id: rihards.gailums
name: Rihards Gailums
role: package-author
contact: rihards.gailums@gmail.com
role: owner
approvers:
- rihards.gailums
escalation:
primary: rihards.gailums
sla_hours: 72
stewards:
- type: role
id: nbs.joint-staff
role: process-owner
note: >-
Accountable for the modelled algorithm in operation. Placeholder pending
formal institutional assignment.
- type: role
id: am.algorithm-governance
role: governance-authority
note: >-
Ministry of Defence — owns revision of the inter-institutional
notification algorithm per the public 7 May 2026 commitment.
classification: OFFICIAL
distribution: >-
Draft modelling artefact derived entirely from public-source reporting and
open civil-protection legislation. Contains no classified or operational
data. Endpoints and credentials in resources/ are illustrative placeholders.
provenance:
derived_from: public chronology of the 7 May 2026 Rezekne drone incident
not_an_official: >-
This package is an independent UAPF modelling demonstrator. It is not an
official algorithm of the NBS, VUGD, the Ministry of Defence or any other
Latvian state institution.

View File

@@ -1,22 +1,29 @@
kind: uapf.policies
classification:
level: restricted
dataCategories:
- civil-defence
- national-security
- public-warning
execution:
requiresApproval: true
approvalRoles:
- aizsardzibas-ministrija
- krizes-vadibas-centrs
auditRequired: true
maxConcurrentExecutions: 1
allowedEnvironments:
- development
- staging
requiredClaims:
- type: civil-defence-operator
delegation:
allowAgentDelegation: false
maxDelegationDepth: 0
kind: uapf.metadata.policies
version: "0.3.0"
package: lv.civdef.drone-threat-public-address
audit:
decision_logging: required
retention: P3Y
records:
- decision inputs, matched rule id and outputs
- actor identity and timestamp for every manual authorisation
- SLA timer arm / fire / clear events
data_protection:
regime: GDPR + Latvian civil-protection law
personal_data:
- 112 caller data is processed by VUGD under existing emergency-service basis.
- OSINT disinformation monitoring is restricted to public posts (guardrail GR-6).
data_boundary: EU
access:
package_visibility: OFFICIAL
decision_evaluation: NBS Joint Staff and bound targets only
amendment_authority: Ministry of Defence algorithm governance
compliance_refs:
- Civil Protection and Disaster Management Law (Latvia)
- Cabinet regulations on the early-warning cell-broadcast system
- NATO Baltic Air Policing arrangements (interception execution)

View File

@@ -1,37 +1,61 @@
# UAPF-IP guardrails policy for the Drone Threat Public Address process.
# Loaded by the runtime at session start as an immutable policy snapshot;
# enforced by the host before every capability invocation (see UAPF-IP SPEC §10).
kind: uapf.guardrails
version: "0.3.0"
scope:
domain: civil-defence
classification: restricted
legal_basis: national-civil-protection-law
# UAPF-IP guardrails enforced at every capability call made by a UAPF-IP host
# running this package. Guardrails are evaluated before and after capability
# execution; a violation blocks the call and is logged to the audit trail.
ai:
allowed_models:
- claude-opus-4-7
- claude-sonnet-4-6
forbidden_inputs:
- classified-radar-tracks
- personal-data-of-residents
- source-identifying-osint
pii_redactor: required
# AI may never autonomously complete a step in a national public-warning
# process; a confidence ceiling of 0 forces human confirmation every time.
max_confidence_for_autocomplete: 0.0
decisions_ai_may_make_unattended: []
decisions_ai_may_recommend:
- air_threat_severity
- disinformation_classification
principles:
- id: GR-1
name: AI is advisory, never authoritative
rule: >-
AI agents and MCP tools (ai.classify, ai.complete) may only produce
recommendations. Object classification, threat severity, public-broadcast
authorisation, interception authorisation and origin attribution must be
confirmed by an accountable human role before any downstream effect.
appliesTo: [Decision_ObjectClassification, Decision_AirThreatSeverity,
Decision_InterceptionAuthorization, HT_OriginAttribution]
human_oversight:
required_for:
- cell_broadcast_dispatch
- interception_authorization
- public_communication
- incident_closure
reviewer_role: nbs-joint-staff-duty-officer
- id: GR-2
name: No autonomous use of force
rule: >-
No capability may move the process to an interception "engage" outcome
without a recorded manual authorisation by NBS Joint Staff. The
Decision_InterceptionAuthorization table is decision support only.
appliesTo: [Task_AuthorizeInterception, Task_GroundEngage, Task_RequestBAP]
audit:
vc_signature_per_step: required
retention_years: 10
- id: GR-3
name: Notification SLA is a hard floor
rule: >-
broadcastSlaSeconds from Decision_NotificationUrgency is a maximum, not a
target. The SLA-breach boundary timer must remain enabled; disabling it
is a safeguard removal and must be recorded.
appliesTo: [Task_DispatchBroadcast, Boundary_SlaBreach]
- id: GR-4
name: Public messaging is human-authored
rule: >-
Cell-broadcast and all-clear messages are selected from pre-approved,
human-authored templates (MSG_*). Free-text generation of public alert
content by an AI agent is prohibited.
appliesTo: [Task_DispatchBroadcast, Task_AllClearBroadcast, HT_PressBriefing]
- id: GR-5
name: Auditability
rule: >-
Every decision evaluation records its inputs, the matched rule id and the
output, with actor identity and timestamp, retained per metadata/policies.yaml.
appliesTo: ["*"]
- id: GR-6
name: Data minimisation in disinformation monitoring
rule: >-
The OSINT monitoring tool processes only public posts; it must not ingest
or store personal data of identifiable citizens beyond what is required
to classify a post.
appliesTo: [HT_DisinfoMonitor]
enforcement:
onViolation: block
audit: required
reviewAuthority: "Ministry of Defence (algorithm governance)"

View File

@@ -1,268 +1,347 @@
kind: uapf.resources.mapping
version: "0.3.0"
# ===========================================================================
# HOW TO READ THIS FILE
# ---------------------------------------------------------------------------
# Targets — the institutions, systems and agents that execute work in this
# process. Only primary binding targets are listed; consulted/informed parties
# (VARAM, IZM, NATO Baltic Air Policing, the Government Crisis Management
# Council) are recorded in binding `notes` and in docs/02-raci.md.
# Endpoints and credentials below are ILLUSTRATIVE placeholders for a draft.
# UAPF separates the *logic* of a process (the BPMN / DMN / CMMN cornerstones)
# from the *resources* that execute it (institutions, systems, AI agents).
# This file is that binding layer.
#
# targets - every institution, system or agent that can do work here.
# bindings - one row per executable element in the three cornerstones.
# Each row names the element, says which target performs it,
# and in which execution mode.
#
# Each binding carries:
# element - "<cornerstone>.<kind>:<id>" e.g. bpmn.task:Task_DispatchBroadcast
# label - the human label as it appears in the diagram, so a reader can
# point at a box on the canvas and find its row here.
# targetId - the single primary target that performs the element.
# mode - manual : a person performs it, no automation
# assisted : a system/AI proposes, a person approves
# supervised : a system performs it, a person monitors
# autonomous : a system performs it without per-call review
#
# Consulted / informed parties (RACI C and I) are NOT bindings; they are in
# docs/02-raci.md. Endpoints and credentials below are ILLUSTRATIVE draft
# placeholders.
# ===========================================================================
legend:
cornerstones:
bpmn: bpmn/drone-threat-public-address.bpmn
dmn: dmn/air-threat-decisions.dmn
cmmn: cmmn/field-response-investigation.cmmn
element_kinds:
bpmn.task: A BPMN activity (plain, business-rule or user task).
dmn.decision: A DMN decision evaluated by a BPMN business-rule task.
cmmn.humanTask: A discretionary human task inside the investigation case.
modes: [manual, assisted, supervised, autonomous]
# ---------------------------------------------------------------------------
targets:
- id: nbs.air-surveillance
type: system_api
name: NBS air surveillance and radar network
name: NBS air-surveillance & radar network
description: Detection and tracking feed for airborne objects near the eastern border.
capabilities:
- lv.gov.civdef.air_surveillance_feed
capabilities: [lv.gov.civdef.air_surveillance_feed]
endpoint: "https://surveillance.mil.lv/api/v1"
authentication:
method: mtls
availability:
schedule: always
timezone: Europe/Riga
authentication: {method: mtls}
availability: {schedule: always, timezone: Europe/Riga}
- id: nbs.joint-staff
type: human_role
name: NBS Joint Staff (Apvienotais stabs), operational duty
description: Holds threat-classification and notification-request authority.
availability:
schedule: always
timezone: Europe/Riga
description: >-
Holds air-threat classification, public-notification request and
interception authorisation authority. The decision owner of this process.
availability: {schedule: always, timezone: Europe/Riga}
- id: nbs.air-defence
type: human_role
name: NBS air-defence units (pretgaisa aizsardziba)
description: Ground air-defence; coordinates interception, including with NATO Baltic Air Policing.
description: Ground-based air defence; executes or coordinates interception.
- id: vugd.duty
type: human_role
name: VUGD operational duty / 112 (State Fire and Rescue Service)
description: Receives 112 calls and executes site fire and rescue response.
description: Receives 112 calls; executes site fire and rescue response.
- id: vugd.cell-broadcast
type: system_api
name: Cell-broadcast system (sunu apraide), operated by VUGD
description: Public early-warning cell-broadcast platform.
capabilities:
- lv.gov.civdef.cell_broadcast
description: >-
Public early-warning cell-broadcast platform. The 40-minute dispatch
delay to Rezekne on 7 May 2026 is the failure this package addresses.
capabilities: [lv.gov.civdef.cell_broadcast]
endpoint: "https://cb.vugd.gov.lv/api/v1"
authentication:
method: api_key
configRef: secrets/vugd-cell-broadcast
availability:
schedule: always
timezone: Europe/Riga
authentication: {method: api_key, configRef: secrets/vugd-cell-broadcast}
availability: {schedule: always, timezone: Europe/Riga}
- id: vp.duty
type: human_role
name: State Police (Valsts policija) operational duty
description: Scene security, access control and public order at incident sites.
description: Scene security, cordon and public order at incident sites.
- id: nmpd.duty
type: human_role
name: Emergency Medical Service (NMPD) operational duty
description: Casualty assessment and pre-hospital medical response.
- id: kvc
type: human_role
name: Crisis Management Centre (Krizes vadibas centrs)
description: Cross-institutional crisis coordination and after-action review.
description: Cross-institutional crisis coordination, escalation and after-action review.
- id: iem.duty
type: human_role
name: Ministry of the Interior (Iekslietu ministrija) duty
description: Interior-sector coordination across VP, VUGD and the State Border Guard.
- id: am
type: human_role
name: Ministry of Defence (Aizsardzibas ministrija)
description: Public communication, origin attribution oversight and algorithm governance.
description: Public communication, origin attribution oversight, algorithm governance.
- id: municipal.civil-protection
type: human_role
name: Municipal civil-protection commissions (cooperation territories)
description: Local civil-protection response and resident enquiry handling.
- id: nato.bap
type: external_party
name: NATO Baltic Air Policing
description: Allied air-policing detachment; executes air interception when tasked.
- id: agent.threat-assessment
type: ai_agent
name: Civil-defence threat-assessment assistant
description: AI assistant that recommends air-threat severity; advisory only.
capabilities:
- ai.classify
- ai.complete
description: >-
AI assistant that recommends object classification and air-threat
severity. Advisory only; never authorises action (see guardrails).
capabilities: [ai.classify, ai.complete]
endpoint: "mcp://agents/civdef-threat-assessment"
authentication:
method: did
authentication: {method: did}
- id: mcp.osint-monitor
type: mcp_tool
name: OSINT / disinformation monitoring MCP tool
description: MCP tool that surfaces and classifies disinformation about the incident.
capabilities:
- ai.classify
description: Surfaces and classifies disinformation about the incident.
capabilities: [ai.classify]
endpoint: "mcp://lv-civdef/osint-monitor"
authentication:
method: oauth2
configRef: secrets/osint-monitor-oauth
authentication: {method: oauth2, configRef: secrets/osint-monitor-oauth}
# ---------------------------------------------------------------------------
# Bindings — each process / decision / case element bound to exactly one
# primary target. mode: manual = human only, assisted = AI suggests / human
# approves, autonomous = system executes, supervised = system executes with
# monitoring.
# ---------------------------------------------------------------------------
bindings:
# --- BPMN process tasks ---
- source:
type: bpmn.task
ref: "Task_Classify"
# ---- BPMN process tasks ----
- element: "bpmn.task:Task_TrackObject"
label: "Establish & maintain object track"
targetId: nbs.air-surveillance
mode: supervised
requiredCapabilities:
- lv.gov.civdef.air_surveillance_feed
contract:
timeout: "60s"
notes: "NBS Joint Staff supervises classification of the surveillance feed."
requiredCapabilities: [lv.gov.civdef.air_surveillance_feed]
contract: {timeout: "continuous"}
- source:
type: bpmn.task
ref: "Task_RequestBroadcast"
targetId: nbs.joint-staff
mode: manual
contract:
timeout: "5m"
fallback:
escalationPath:
- kvc
onTimeout: escalate
notes: >-
GAP G2: in the AS-IS algorithm this request is the single trigger. The
escalation path to KVC is a proposed v0.3 fallback authority, not yet
institutionally agreed.
- source:
type: bpmn.task
ref: "Task_CellBroadcast"
targetId: vugd.cell-broadcast
mode: autonomous
requiredCapabilities:
- lv.gov.civdef.cell_broadcast
contract:
timeout: "30s"
retries:
maxAttempts: 2
backoffMs: 2000
notes: "VUGD operational duty owns the platform; dispatch is automated on request."
- source:
type: bpmn.task
ref: "Task_NotifyAgencies"
targetId: nbs.joint-staff
mode: assisted
notes: >-
Parallel notification to KVC, IeM and municipal civil-protection
commissions. KVC, IeM and municipalities are informed parties.
- source:
type: bpmn.task
ref: "Task_CoordBAP"
targetId: nbs.air-defence
mode: manual
notes: >-
NBS air-defence coordinates the response; air interception is executed by
NATO Baltic Air Policing per Decision_InterceptionAuthorization rationale
R_BAP_AIR. NATO BAP is an external party reached through this binding.
- source:
type: bpmn.task
ref: "Task_LocalResponse"
targetId: municipal.civil-protection
mode: manual
notes: >-
State Police support scene response; the Ministry of Education and
Science (IZM) is consulted for school-closure guidance (GAP G8).
- source:
type: bpmn.task
ref: "Task_AllClear"
targetId: vugd.cell-broadcast
mode: autonomous
contract:
timeout: "30s"
notes: "All-clear broadcast issued on NBS Joint Staff declaration."
# --- DMN decisions ---
- source:
type: dmn.decision
ref: "Decision_AirThreatSeverity"
- element: "bpmn.task:Task_ClassifyObject"
label: "Classify object [Object classification]"
targetId: agent.threat-assessment
mode: assisted
requiredCapabilities:
- ai.classify
notes: "AI recommends severity; NBS Joint Staff confirms. Advisory only per guardrails."
requiredCapabilities: [ai.classify]
notes: "AI proposes the object class; NBS Air Surveillance confirms."
- source:
type: dmn.decision
ref: "Decision_CellBroadcastScope"
- element: "bpmn.task:Task_AssessSeverity"
label: "Assess air-threat severity [Air-threat severity]"
targetId: nbs.joint-staff
mode: assisted
notes: "AI severity recommendation; NBS Joint Staff confirms the threat level."
- element: "bpmn.task:Task_LogAndMonitor"
label: "Log & monitor (no public alert)"
targetId: nbs.air-surveillance
mode: supervised
- element: "bpmn.task:Task_DetermineUrgency"
label: "Determine notification urgency & SLA [Notification urgency]"
targetId: nbs.joint-staff
mode: assisted
notes: "Output broadcastSlaSeconds becomes the timer on Task_DispatchBroadcast."
- element: "bpmn.task:Task_DetermineBroadcast"
label: "Determine cell-broadcast scope [Cell-broadcast scope]"
targetId: nbs.joint-staff
mode: assisted
notes: "VARAM consulted on the cell-broadcast platform; templates are pre-typed (GAP G3)."
- element: "bpmn.task:Task_AuthorizeBroadcast"
label: "Authorize public broadcast"
targetId: nbs.joint-staff
mode: manual
notes: "VARAM consulted on the cell-broadcast platform; message templates are typed (GAP G3)."
contract: {timeout: "PT3M"}
fallback: {escalationPath: [kvc], onTimeout: escalate}
notes: >-
GAP G2: in the AS-IS algorithm this authority is the single point of
failure. The KVC escalation path is a proposed v0.3 fallback authority,
not yet institutionally agreed.
- source:
type: dmn.decision
ref: "Decision_InterceptionAuthorization"
- element: "bpmn.task:Task_DispatchBroadcast"
label: "Dispatch public cell-broadcast"
targetId: vugd.cell-broadcast
mode: autonomous
requiredCapabilities: [lv.gov.civdef.cell_broadcast]
contract:
timeout: "from-decision:broadcastSlaSeconds"
retries: {maxAttempts: 2, backoffMs: 2000}
notes: >-
The non-interrupting SLA-breach boundary timer fires if dispatch is not
confirmed within broadcastSlaSeconds and triggers Task_EscalateSla.
- element: "bpmn.task:Task_EscalateSla"
label: "Escalate SLA breach to Crisis Mgmt"
targetId: kvc
mode: manual
notes: "Runs only when the SLA boundary timer fires; this is the Rezekne safeguard."
- element: "bpmn.task:Task_NotifyAgencies"
label: "Notify KVC, IeM & municipal commissions"
targetId: nbs.joint-staff
mode: assisted
notes: "KVC, IeM and municipal commissions are informed parties."
- element: "bpmn.task:Task_AuthorizeInterception"
label: "Authorize interception [Interception authorization]"
targetId: nbs.joint-staff
mode: manual
notes: "Safety criteria made explicit and inspectable (GAP G7)."
notes: "Decision logic gates engagement on positive hostile ID and safety (GAP G7)."
# --- CMMN case human tasks ---
- source:
type: cmmn.humanTask
ref: "HT_DebrisSearch"
- element: "bpmn.task:Task_GroundEngage"
label: "Ground air-defence engagement"
targetId: nbs.air-defence
mode: manual
- element: "bpmn.task:Task_RequestBAP"
label: "Request NATO BAP engagement"
targetId: nato.bap
mode: manual
notes: "Cross-pool message flow; NATO BAP executes air interception when tasked."
- element: "bpmn.task:Task_MaintainTrack"
label: "Maintain track & monitor"
targetId: nbs.air-surveillance
mode: supervised
- element: "bpmn.task:Task_AssessStandDown"
label: "Assess stand-down criteria [Stand-down & all-clear]"
targetId: nbs.joint-staff
mode: assisted
- element: "bpmn.task:Task_AllClearBroadcast"
label: "Dispatch all-clear broadcast"
targetId: vugd.cell-broadcast
mode: autonomous
requiredCapabilities: [lv.gov.civdef.cell_broadcast]
contract: {timeout: "PT30S"}
- element: "bpmn.task:Task_HandToInvestigation"
label: "Open field-response & investigation case"
targetId: kvc
mode: manual
notes: "Instantiates the CMMN case Case_FieldResponseInvestigation."
# ---- DMN decisions ----
- element: "dmn.decision:Decision_ObjectClassification"
label: "Object classification & confidence"
targetId: agent.threat-assessment
mode: assisted
requiredCapabilities: [ai.classify]
- element: "dmn.decision:Decision_AirThreatSeverity"
label: "Air-threat severity"
targetId: nbs.joint-staff
mode: assisted
- element: "dmn.decision:Decision_NotificationUrgency"
label: "Notification urgency & SLA"
targetId: nbs.joint-staff
mode: supervised
notes: "Deterministic table; NBS Joint Staff may override the SLA tier upward."
- element: "dmn.decision:Decision_CellBroadcastScope"
label: "Cell-broadcast scope & message"
targetId: nbs.joint-staff
mode: supervised
- element: "dmn.decision:Decision_InterceptionAuthorization"
label: "Interception authorization"
targetId: nbs.joint-staff
mode: manual
notes: "State Police support crash-site localisation."
notes: "Evaluated as decision support; the engage outcome still requires manual command authority."
- source:
type: cmmn.humanTask
ref: "HT_FireSuppression"
- element: "dmn.decision:Decision_StandDownCriteria"
label: "Stand-down & all-clear"
targetId: nbs.joint-staff
mode: supervised
# ---- CMMN case human tasks ----
- element: "cmmn.humanTask:HT_DebrisLocalisation"
label: "Localise crash / debris site"
targetId: nbs.joint-staff
mode: manual
notes: "State Police and municipal commissions support localisation."
- element: "cmmn.humanTask:HT_FireSuppression"
label: "Fire suppression at impact site"
targetId: vugd.duty
mode: manual
- source:
type: cmmn.humanTask
ref: "HT_SceneSecurity"
- element: "cmmn.humanTask:HT_SceneSecurity"
label: "Establish scene cordon & security"
targetId: vp.duty
mode: manual
- source:
type: cmmn.humanTask
ref: "HT_MunicipalQA"
- element: "cmmn.humanTask:HT_CasualtyResponse"
label: "Casualty assessment & medical response"
targetId: nmpd.duty
mode: manual
- element: "cmmn.humanTask:HT_MunicipalEnquiries"
label: "Handle resident enquiries (112 / municipal)"
targetId: municipal.civil-protection
mode: manual
- source:
type: cmmn.humanTask
ref: "HT_TechExam"
- element: "cmmn.humanTask:HT_DebrisCollection"
label: "Collect & catalogue debris"
targetId: nbs.joint-staff
mode: manual
- source:
type: cmmn.humanTask
ref: "HT_OriginAttribution"
- element: "cmmn.humanTask:HT_TechnicalExam"
label: "Technical examination of the UAV"
targetId: nbs.joint-staff
mode: assisted
notes: "Ministry of Defence consulted; AI may assist analysis but not attribute autonomously."
requiredCapabilities: [ai.classify]
notes: "AI may assist component analysis; conclusions are human-confirmed."
- source:
type: cmmn.humanTask
ref: "HT_DisinfoMonitor"
- element: "cmmn.humanTask:HT_OriginAttribution"
label: "Origin attribution analysis"
targetId: nbs.joint-staff
mode: assisted
notes: "Ministry of Defence consulted; AI may assist but never attributes autonomously."
- element: "cmmn.humanTask:HT_DisinfoMonitor"
label: "Monitor & counter disinformation"
targetId: mcp.osint-monitor
mode: assisted
requiredCapabilities:
- ai.classify
notes: "Disinformation surfaced and classified via MCP tool; human reviews before correction."
requiredCapabilities: [ai.classify]
notes: "Disinformation surfaced via MCP tool; a human reviews before any correction."
- source:
type: cmmn.humanTask
ref: "HT_Press"
- element: "cmmn.humanTask:HT_PressBriefing"
label: "Public press briefing"
targetId: am
mode: manual
notes: "KVC consulted; public communication requires human oversight per guardrails."
notes: "KVC consulted; public communication requires human authorship per guardrails."
- source:
type: cmmn.humanTask
ref: "HT_AfterAction"
- element: "cmmn.humanTask:HT_AfterAction"
label: "Inter-institutional after-action review"
targetId: kvc
mode: manual
notes: "Ministry of Defence accountable; Government Crisis Management Council informed."
notes: "Ministry of Defence accountable; feeds algorithm revision."

View File

@@ -2,56 +2,85 @@ kind: uapf.package
id: lv.civdef.drone-threat-public-address
name: Drone Threat Public Address & Citizen Notification
description: >-
Level-4 process package modelling the cross-institutional algorithm for
detecting an unmanned-aerial-vehicle (drone) threat over Latvian airspace,
deciding on and triggering public cell-broadcast notification, coordinating
interception, and conducting field response and origin investigation.
Derived from the public chronology of the 7 May 2026 Rezekne drone incident
and the Ministry of Defence commitment to revise the inter-institutional
notification algorithms.
Level-4 UAPF process package modelling the cross-institutional algorithm by
which Latvia detects an unmanned-aerial-vehicle (drone) threat over national
airspace, decides on and dispatches a public cell-broadcast within a bounded
notification SLA, authorises and coordinates interception, and conducts field
response and drone-origin investigation. Derived from the public chronology
of the 7 May 2026 Rezekne drone incident and the Ministry of Defence
commitment to revise the inter-institutional notification algorithms. This is
an independent modelling demonstrator, not an official state algorithm.
level: 4
version: "0.2.0"
version: "0.3.0"
includes: []
dependencies: {}
cornerstones:
bpmn: true
dmn: true
cmmn: true
resources: true
paths:
bpmn: bpmn
dmn: dmn
cmmn: cmmn
resources: resources
metadata: metadata
artifacts:
bpmn:
- path: bpmn/drone-threat-public-address.bpmn
role: primary-process
description: End-to-end detection, notification, interception and field-response flow.
description: >-
End-to-end detection, classification, public notification, interception
and field-response flow across six institution lanes, with a
non-interrupting SLA-breach boundary timer on the cell-broadcast task.
dmn:
- path: dmn/air-threat-decisions.dmn
role: decision-model
description: Three decisions — air-threat severity, cell-broadcast scope, interception authorization.
description: >-
Six chained, individually documented decisions — object classification,
air-threat severity, notification urgency & SLA, cell-broadcast scope,
interception authorization, and stand-down criteria.
cmmn:
- path: cmmn/field-response-investigation.cmmn
role: case-model
description: Discretionary field response and drone-origin investigation case.
description: >-
Discretionary field-response, drone-origin investigation and public
communication case, structured as three stages with entry sentries.
resources:
- path: resources/mappings.yaml
role: resource-mapping
description: Institution and system targets bound to process, decision and case elements.
description: >-
Every process, decision and case element bound to a primary executing
target, with an element-level legend for tracing bindings to diagrams.
- path: resources/guardrails.yaml
role: ip-guardrails
description: UAPF-IP guardrails policy snapshot enforced at every capability call.
description: UAPF-IP guardrail policy enforced at every capability call.
inputs:
- airborneObjectTrack
- objectClassification
- radarCrossSection
- emissionProfile
- visualConfirmation
- airspaceStatus
- trajectoryTowardPopulated
- distanceToPopulatedKm
- estimatedMinutesToPopulated
- borderProximityTier
- corridorMunicipalities
- positiveHostileId
outputs:
- threatLevel
- notificationTier
- broadcastSlaSeconds
- cellBroadcastDispatch
- interceptionDecision
- incidentReport
- standDownDecision
- incidentCaseRef
exposure:
mcp:
enabled: true
@@ -59,33 +88,45 @@ exposure:
exposedEntrypoints:
- process: Process_DroneThreatPublicAddress
tool: drone_threat_public_address.run
- decision: Decision_ObjectClassification
tool: object_classification.evaluate
- decision: Decision_AirThreatSeverity
tool: air_threat_severity.evaluate
- decision: Decision_NotificationUrgency
tool: notification_urgency.evaluate
- decision: Decision_CellBroadcastScope
tool: cell_broadcast_scope.evaluate
- decision: Decision_InterceptionAuthorization
tool: interception_authorization.evaluate
- decision: Decision_StandDownCriteria
tool: stand_down_criteria.evaluate
exposedArtifacts:
- manifest
- bpmn
- dmn
- cmmn
- docs
requires_capabilities:
- task.assign@1+
- task.complete@1+
- task.escalate@1+
- event.emit@1+
- timer.schedule@1+
- ai.classify@1+
- ai.complete@1+
- lv.gov.civdef.air_surveillance_feed@1+
- lv.gov.civdef.cell_broadcast@1+
profiles_supported:
- uapf-ip-orchestrated
- uapf-ip-sync-decision
guardrails: resources/guardrails.yaml
owners:
- type: person
id: rihards.gailums
contact: rihards.gailums@gmail.com
lifecycle: draft