You've already forked lv-civdef-drone-threat-public-address
Import UAPF package
Import UAPF package: lv-civdef-drone-threat-public-address (1).uapf
This commit is contained in:
87
README.md
Normal file
87
README.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# lv.civdef.drone-threat-public-address
|
||||
|
||||
**UAPF Level-4 process package — v0.2.0 (draft)**
|
||||
**Conformant to UAPF specification v2.2.0** — see `docs/04-validation-report.md`.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
## 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.
|
||||
|
||||
## UAPF-IP & MCP
|
||||
|
||||
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`.
|
||||
|
||||
## Validation
|
||||
|
||||
```
|
||||
python3 ../../validate.py ../.. <path-to-UAPF-specification-repo>
|
||||
```
|
||||
|
||||
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`.
|
||||
|
||||
## Intended steward
|
||||
|
||||
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`.
|
||||
246
bpmn/drone-threat-public-address.bpmn
Normal file
246
bpmn/drone-threat-public-address.bpmn
Normal file
@@ -0,0 +1,246 @@
|
||||
<?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">
|
||||
<bpmn:process id="Process_DroneThreatPublicAddress" name="Drone Threat Public Address & Citizen Notification" isExecutable="false">
|
||||
|
||||
<bpmn:startEvent id="Start_Detect" name="Unidentified airborne object detected near eastern border">
|
||||
<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: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:incoming>f2</bpmn:incoming>
|
||||
<bpmn:outgoing>f3</bpmn:outgoing>
|
||||
</bpmn:businessRuleTask>
|
||||
|
||||
<bpmn:exclusiveGateway id="GW_ThreatConfirmed" name="Confirmed threat over LV territory?">
|
||||
<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: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: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: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: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>
|
||||
|
||||
<bpmn:task id="Task_AllClear" name="Declare threat ended and issue all-clear broadcast">
|
||||
<bpmn:incoming>f16</bpmn:incoming>
|
||||
<bpmn:outgoing>f17</bpmn:outgoing>
|
||||
</bpmn:task>
|
||||
|
||||
<bpmn:callActivity id="Call_FieldResponse" name="Field response & 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:incoming>f18</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: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:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_Task_Classify" bpmnElement="Task_Classify">
|
||||
<dc:Bounds x="240" y="200" width="120" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_BR_AssessThreat" bpmnElement="BR_AssessThreat">
|
||||
<dc:Bounds x="410" y="200" width="120" height="80" />
|
||||
</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>
|
||||
<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>
|
||||
<bpmndi:BPMNShape id="di_BR_AlertScope" bpmnElement="BR_AlertScope">
|
||||
<dc:Bounds x="690" y="200" width="120" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_Task_RequestBroadcast" bpmnElement="Task_RequestBroadcast">
|
||||
<dc:Bounds x="860" y="200" width="120" height="80" />
|
||||
</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>
|
||||
<bpmndi:BPMNShape id="di_Task_CellBroadcast" bpmnElement="Task_CellBroadcast">
|
||||
<dc:Bounds x="1150" y="80" width="150" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_Task_NotifyAgencies" bpmnElement="Task_NotifyAgencies">
|
||||
<dc:Bounds x="1150" y="200" width="150" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_BR_Interception" bpmnElement="BR_Interception">
|
||||
<dc:Bounds x="1150" y="330" width="150" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_Task_CoordBAP" bpmnElement="Task_CoordBAP">
|
||||
<dc:Bounds x="1360" y="330" width="150" height="80" />
|
||||
</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>
|
||||
<bpmndi:BPMNShape id="di_Task_LocalResponse" bpmnElement="Task_LocalResponse">
|
||||
<dc:Bounds x="1660" y="200" width="150" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_Task_AllClear" bpmnElement="Task_AllClear">
|
||||
<dc:Bounds x="1860" y="200" width="150" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="di_Call_FieldResponse" bpmnElement="Call_FieldResponse">
|
||||
<dc:Bounds x="2060" y="200" width="160" height="80" />
|
||||
</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>
|
||||
|
||||
<bpmndi:BPMNEdge id="di_f1" bpmnElement="f1">
|
||||
<di:waypoint x="188" y="240" /><di:waypoint x="240" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f2" bpmnElement="f2">
|
||||
<di:waypoint x="360" y="240" /><di:waypoint x="410" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f3" bpmnElement="f3">
|
||||
<di:waypoint x="530" y="240" /><di:waypoint x="585" y="240" />
|
||||
</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>
|
||||
</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>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f6" bpmnElement="f6">
|
||||
<di:waypoint x="810" y="240" /><di:waypoint x="860" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f7" bpmnElement="f7">
|
||||
<di:waypoint x="980" y="240" /><di:waypoint x="1035" y="240" />
|
||||
</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" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f9" bpmnElement="f9">
|
||||
<di:waypoint x="1085" y="240" /><di:waypoint x="1150" y="240" />
|
||||
</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" />
|
||||
</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" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f12" bpmnElement="f12">
|
||||
<di:waypoint x="1300" y="240" /><di:waypoint x="1565" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f13" bpmnElement="f13">
|
||||
<di:waypoint x="1300" y="370" /><di:waypoint x="1360" y="370" />
|
||||
</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" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f15" bpmnElement="f15">
|
||||
<di:waypoint x="1615" y="240" /><di:waypoint x="1660" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f16" bpmnElement="f16">
|
||||
<di:waypoint x="1810" y="240" /><di:waypoint x="1860" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f17" bpmnElement="f17">
|
||||
<di:waypoint x="2010" y="240" /><di:waypoint x="2060" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="di_f18" bpmnElement="f18">
|
||||
<di:waypoint x="2220" y="240" /><di:waypoint x="2272" y="240" />
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn:definitions>
|
||||
74
cmmn/field-response-investigation.cmmn
Normal file
74
cmmn/field-response-investigation.cmmn
Normal file
@@ -0,0 +1,74 @@
|
||||
<?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 & Origin Investigation">
|
||||
<cmmn:casePlanModel id="cpm_1" name="Field Response & 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 & 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" />
|
||||
</cmmn:stage>
|
||||
|
||||
</cmmn:casePlanModel>
|
||||
</cmmn:case>
|
||||
|
||||
<cmmndi:CMMNDI>
|
||||
<cmmndi:CMMNDiagram id="cmmndi_1" name="Field Response & Investigation">
|
||||
<cmmndi:CMMNShape id="sh_cpm" cmmnElementRef="cpm_1">
|
||||
<dc:Bounds x="60" y="40" width="900" height="420" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_DebrisSearch" cmmnElementRef="pi_DebrisSearch">
|
||||
<dc:Bounds x="100" y="100" width="160" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_FireSuppression" cmmnElementRef="pi_FireSuppression">
|
||||
<dc:Bounds x="300" y="100" width="160" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_SceneSecurity" cmmnElementRef="pi_SceneSecurity">
|
||||
<dc:Bounds x="500" y="100" width="160" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_MunicipalQA" cmmnElementRef="pi_MunicipalQA">
|
||||
<dc:Bounds x="700" y="100" width="180" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_Investigation" cmmnElementRef="pi_Investigation">
|
||||
<dc:Bounds x="100" y="230" width="580" height="200" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_TechExam" cmmnElementRef="pi_TechExam">
|
||||
<dc:Bounds x="130" y="290" width="160" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_OriginAttribution" cmmnElementRef="pi_OriginAttribution">
|
||||
<dc:Bounds x="320" y="290" width="160" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
<cmmndi:CMMNShape id="sh_DisinfoMonitor" cmmnElementRef="pi_DisinfoMonitor">
|
||||
<dc:Bounds x="510" y="290" width="150" height="80" />
|
||||
</cmmndi:CMMNShape>
|
||||
</cmmndi:CMMNDiagram>
|
||||
</cmmndi:CMMNDI>
|
||||
|
||||
</cmmn:definitions>
|
||||
279
dmn/air-threat-decisions.dmn
Normal file
279
dmn/air-threat-decisions.dmn
Normal file
@@ -0,0 +1,279 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/"
|
||||
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"
|
||||
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>
|
||||
<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>
|
||||
<inputData id="In_DistanceKm" name="Distance to nearest populated area (km)">
|
||||
<variable id="v_distanceKm" name="distanceToPopulatedKm" typeRef="number" />
|
||||
</inputData>
|
||||
<inputData id="In_BorderTier" name="Border-proximity tier">
|
||||
<variable id="v_borderTier" name="borderProximityTier" typeRef="string" />
|
||||
</inputData>
|
||||
<inputData id="In_CorridorMunis" name="Predicted corridor municipalities">
|
||||
<variable id="v_corridorMunis" name="corridorMunicipalities" typeRef="string" />
|
||||
</inputData>
|
||||
<inputData id="In_PositiveHostileId" name="Positive hostile identification">
|
||||
<variable id="v_posHostileId" name="positiveHostileId" typeRef="boolean" />
|
||||
</inputData>
|
||||
<inputData id="In_OverPopulated" name="Object currently over populated area">
|
||||
<variable id="v_overPopulated" name="overPopulatedArea" typeRef="boolean" />
|
||||
</inputData>
|
||||
<inputData id="In_DebrisClear" name="Debris fall-zone clear">
|
||||
<variable id="v_debrisClear" name="debrisZoneClear" typeRef="boolean" />
|
||||
</inputData>
|
||||
<inputData id="In_FiringReady" name="Ground firing position ready">
|
||||
<variable id="v_firingReady" name="firingPositionReady" typeRef="boolean" />
|
||||
</inputData>
|
||||
<inputData id="In_BapOnStation" name="NATO BAP on station">
|
||||
<variable id="v_bapOnStation" name="bapOnStation" 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>
|
||||
</input>
|
||||
<input id="d1_i2" label="Airspace status">
|
||||
<inputExpression typeRef="string"><text>airspaceStatus</text></inputExpression>
|
||||
</input>
|
||||
<input id="d1_i3" label="Toward populated area">
|
||||
<inputExpression typeRef="boolean"><text>trajectoryTowardPopulated</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><= 15</text></inputEntry>
|
||||
<outputEntry><text>"high"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d1_r2">
|
||||
<inputEntry><text>"unknown","drone"</text></inputEntry>
|
||||
<inputEntry><text>"crossed","inside"</text></inputEntry>
|
||||
<inputEntry><text>true</text></inputEntry>
|
||||
<inputEntry><text>> 15</text></inputEntry>
|
||||
<outputEntry><text>"elevated"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d1_r3">
|
||||
<inputEntry><text>"unknown","drone"</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>
|
||||
<inputEntry><text>"approaching"</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"low"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d1_r5">
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"none"</text></outputEntry>
|
||||
</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>
|
||||
</input>
|
||||
<input id="d2_i2" label="Border-proximity tier">
|
||||
<inputExpression typeRef="string"><text>borderProximityTier</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>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"corridorMunicipalities + all tier-1 border municipalities"</text></outputEntry>
|
||||
<outputEntry><text>"MSG_DRONE_IMMINENT"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d2_r2">
|
||||
<inputEntry><text>"elevated"</text></inputEntry>
|
||||
<inputEntry><text>"tier1","tier2"</text></inputEntry>
|
||||
<outputEntry><text>"corridorMunicipalities"</text></outputEntry>
|
||||
<outputEntry><text>"MSG_DRONE_POSSIBLE"</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">
|
||||
<inputEntry><text>"low"</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"none - municipal commissions informed only"</text></outputEntry>
|
||||
<outputEntry><text>"MSG_NONE"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d2_r5">
|
||||
<inputEntry><text>"none"</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"none"</text></outputEntry>
|
||||
<outputEntry><text>"MSG_NONE"</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>
|
||||
</input>
|
||||
<input id="d3_i2" label="Over populated area">
|
||||
<inputExpression typeRef="boolean"><text>overPopulatedArea</text></inputExpression>
|
||||
</input>
|
||||
<input id="d3_i3" label="Debris zone clear">
|
||||
<inputExpression typeRef="boolean"><text>debrisZoneClear</text></inputExpression>
|
||||
</input>
|
||||
<input id="d3_i4" label="Firing position ready">
|
||||
<inputExpression typeRef="boolean"><text>firingPositionReady</text></inputExpression>
|
||||
</input>
|
||||
<input id="d3_i5" label="BAP on station">
|
||||
<inputExpression typeRef="boolean"><text>bapOnStation</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">
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>true</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"hold"</text></outputEntry>
|
||||
<outputEntry><text>"R_CIVILIAN_RISK"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d3_r2">
|
||||
<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>
|
||||
<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>"R_GROUND_PGA"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d3_r4">
|
||||
<inputEntry><text>"high","elevated"</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>"R_BAP_AIR"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="d3_r5">
|
||||
<inputEntry><text>-</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_CRITERIA_NOT_MET"</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:DMNShape>
|
||||
<dmndi:DMNShape id="s_d2" dmnElementRef="Decision_CellBroadcastScope">
|
||||
<dc:Bounds x="180" y="240" width="180" height="80" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_d3" dmnElementRef="Decision_InterceptionAuthorization">
|
||||
<dc:Bounds x="540" y="240" width="180" height="80" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_objtype" dmnElementRef="In_ObjectType">
|
||||
<dc:Bounds x="120" y="-40" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_airspace" dmnElementRef="In_AirspaceStatus">
|
||||
<dc:Bounds x="290" y="-40" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_traj" dmnElementRef="In_TrajectoryToward">
|
||||
<dc:Bounds x="460" y="-40" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_dist" dmnElementRef="In_DistanceKm">
|
||||
<dc:Bounds x="630" y="-40" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_tier" dmnElementRef="In_BorderTier">
|
||||
<dc:Bounds x="0" y="380" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_corr" dmnElementRef="In_CorridorMunis">
|
||||
<dc:Bounds x="160" y="380" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_phid" dmnElementRef="In_PositiveHostileId">
|
||||
<dc:Bounds x="340" y="380" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_overpop" dmnElementRef="In_OverPopulated">
|
||||
<dc:Bounds x="500" y="380" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_debris" dmnElementRef="In_DebrisClear">
|
||||
<dc:Bounds x="660" y="380" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_firing" dmnElementRef="In_FiringReady">
|
||||
<dc:Bounds x="820" y="380" width="140" height="50" />
|
||||
</dmndi:DMNShape>
|
||||
<dmndi:DMNShape id="s_in_bap" dmnElementRef="In_BapOnStation">
|
||||
<dc:Bounds x="980" y="380" width="140" height="50" />
|
||||
</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: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>
|
||||
<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>
|
||||
</dmndi:DMNDiagram>
|
||||
</dmndi:DMNDI>
|
||||
|
||||
</definitions>
|
||||
60
docs/00-incident-chronology.md
Normal file
60
docs/00-incident-chronology.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# 00 — Incident Chronology: Rēzekne Drone Incident, 7 May 2026
|
||||
|
||||
> 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.
|
||||
|
||||
## Summary
|
||||
|
||||
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.
|
||||
|
||||
## Timeline
|
||||
|
||||
| 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. |
|
||||
|
||||
## Aftermath
|
||||
|
||||
- **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.
|
||||
|
||||
## 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.
|
||||
51
docs/01-institutional-gap-analysis.md
Normal file
51
docs/01-institutional-gap-analysis.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# 01 — Institutional Gap Analysis (AS-IS) and TO-BE Targets
|
||||
|
||||
> 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.
|
||||
|
||||
## Why this package exists
|
||||
|
||||
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.
|
||||
|
||||
## 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)?
|
||||
66
docs/02-raci.md
Normal file
66
docs/02-raci.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# 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.
|
||||
|
||||
## Actors
|
||||
|
||||
| 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 |
|
||||
|
||||
## 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.
|
||||
114
docs/03-uapf-ip-integration.md
Normal file
114
docs/03-uapf-ip-integration.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# 03 — UAPF-IP Integration
|
||||
|
||||
> Non-normative supporting document. Explains how this package binds to a
|
||||
> UAPF-IP host/runtime and to an MCP surface. The normative integration
|
||||
> contract lives in the manifest (`uapf.yaml`) and `resources/guardrails.yaml`.
|
||||
> Reference: UAPF-IP `SPEC.md` v0.1 and `specification/06-mcp-integration.md`.
|
||||
|
||||
## 1. How this package plugs into a runtime
|
||||
|
||||
UAPF-IP separates the **runtime** (loads this package, orchestrates the flow)
|
||||
from the **host** (provides the capabilities the flow needs). At session start
|
||||
the runtime reads `requires_capabilities` from the manifest and verifies the
|
||||
host can fulfil every one; if not, the session is refused.
|
||||
|
||||
### Capabilities this package requires
|
||||
|
||||
Declared in `uapf.yaml` under `requires_capabilities`:
|
||||
|
||||
| Capability | Namespace | Used for |
|
||||
|---|---|---|
|
||||
| `task.assign@1+` | reserved | Assigning field-response and case work items |
|
||||
| `task.complete@1+` | reserved | Closing assigned work items |
|
||||
| `task.escalate@1+` | reserved | Escalating the broadcast request (GAP G2 fallback) |
|
||||
| `event.emit@1+` | reserved | Emitting incident domain events for audit |
|
||||
| `ai.classify@1+` | reserved | Air-threat severity recommendation; disinfo classification |
|
||||
| `ai.complete@1+` | reserved | Origin-attribution analysis assistance |
|
||||
| `lv.gov.civdef.air_surveillance_feed@1+` | user-defined | Reading the radar/track feed |
|
||||
| `lv.gov.civdef.cell_broadcast@1+` | user-defined | Triggering the public cell broadcast |
|
||||
|
||||
`task.*`, `event.*` and `ai.*` are reserved UAPF-IP v0.1 namespaces. The two
|
||||
`lv.gov.civdef.*` capabilities are **user-defined** (reverse-DNS root, per the
|
||||
UAPF-IP namespace rules) because no reserved namespace covers a national
|
||||
cell-broadcast or a military surveillance feed. A host that operates the VUGD
|
||||
cell-broadcast platform would publish the `lv.gov.civdef.cell_broadcast` schema
|
||||
alongside it. (`notify.*` is reserved for UAPF-IP v0.2 but not yet specified, so
|
||||
the cell broadcast cannot use it today.)
|
||||
|
||||
### Profiles
|
||||
|
||||
`profiles_supported` declares two UAPF-IP v0.1 profiles:
|
||||
|
||||
- **`uapf-ip-orchestrated`** — the BPMN flow with human tasks, parallel
|
||||
branches and the field-response case is an orchestrated process.
|
||||
- **`uapf-ip-sync-decision`** — each DMN decision (`Decision_AirThreatSeverity`,
|
||||
`Decision_CellBroadcastScope`, `Decision_InterceptionAuthorization`) can be
|
||||
evaluated synchronously in a single round-trip, independent of the flow.
|
||||
|
||||
## 2. Guardrails
|
||||
|
||||
`resources/guardrails.yaml` is the policy snapshot the runtime attaches to every
|
||||
session (immutable for the session lifetime, UAPF-IP SPEC §6/§10). It is
|
||||
referenced from the manifest via `guardrails: resources/guardrails.yaml`.
|
||||
|
||||
Key constraints, and why:
|
||||
|
||||
- `max_confidence_for_autocomplete: 0.0` — the AI may **never** autonomously
|
||||
complete a step. In a national public-warning process every AI output is a
|
||||
recommendation a human confirms. This is reinforced by
|
||||
`metadata/policies.yaml` (`delegation.allowAgentDelegation: false`).
|
||||
- `human_oversight.required_for` — cell-broadcast dispatch, interception
|
||||
authorization, public communication and incident closure all require a human
|
||||
(the NBS Joint Staff duty officer).
|
||||
- `ai.forbidden_inputs` — classified radar tracks, residents' personal data and
|
||||
source-identifying OSINT must never reach a model; `pii_redactor: required`.
|
||||
- `audit.vc_signature_per_step: required`, `retention_years: 10` — every step
|
||||
emits a DID-VC-signed CloudEvents record (UAPF-IP SPEC §7).
|
||||
|
||||
## 3. MCP endpoint
|
||||
|
||||
Per `specification/06-mcp-integration.md`, a UAPF package is exportable to an
|
||||
MCP surface in **Package → MCP** mode. This package declares its MCP exposure in
|
||||
the manifest under `exposure.mcp`:
|
||||
|
||||
```yaml
|
||||
exposure:
|
||||
mcp:
|
||||
enabled: true
|
||||
runnable: true
|
||||
exposedEntrypoints:
|
||||
- { process: Process_DroneThreatPublicAddress, tool: drone_threat_public_address.run }
|
||||
- { decision: Decision_AirThreatSeverity, tool: air_threat_severity.evaluate }
|
||||
- { decision: Decision_CellBroadcastScope, tool: cell_broadcast_scope.evaluate }
|
||||
- { decision: Decision_InterceptionAuthorization, tool: interception_authorization.evaluate }
|
||||
exposedArtifacts: [manifest, bpmn, dmn, cmmn, docs]
|
||||
```
|
||||
|
||||
A conforming UAPF→MCP implementation importing this `.uapf` package MUST expose
|
||||
the standard tool set — `uapf.describe`, `uapf.list`, `uapf.run_process`,
|
||||
`uapf.evaluate_decision`, `uapf.resolve_resources`, `uapf.get_artifact`,
|
||||
`uapf.validate` — and the standard resources `uapf://manifest/...`,
|
||||
`uapf://bpmn/...`, `uapf://dmn/...`, `uapf://cmmn/...`, `uapf://policies/...`,
|
||||
`uapf://bindings/...`.
|
||||
|
||||
The four `exposedEntrypoints` become directly runnable/evaluable tools:
|
||||
`uapf.run_process` against `Process_DroneThreatPublicAddress`, and
|
||||
`uapf.evaluate_decision` against each of the three decisions.
|
||||
|
||||
### MCP-reachable resource targets
|
||||
|
||||
Two binding targets in `resources/mappings.yaml` are themselves reached over
|
||||
MCP, so the process composes with other MCP services:
|
||||
|
||||
- `agent.threat-assessment` — `type: ai_agent`, `endpoint: mcp://agents/civdef-threat-assessment`
|
||||
- `mcp.osint-monitor` — `type: mcp_tool`, `endpoint: mcp://lv-civdef/osint-monitor`
|
||||
|
||||
All endpoints and `configRef` credential references in the mapping are
|
||||
illustrative placeholders for this draft and must be set to real values before
|
||||
any non-development use.
|
||||
|
||||
## 4. Status
|
||||
|
||||
The integration surface is declared but not deployed. `metadata/policies.yaml`
|
||||
restricts `allowedEnvironments` to development and staging, and lifecycle status
|
||||
is `draft`.
|
||||
83
docs/04-validation-report.md
Normal file
83
docs/04-validation-report.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# 04 — Validation Report
|
||||
|
||||
> Records the conformance status of this package against UAPF specification
|
||||
> **v2.2.0** (repo `UAPFormat/UAPF-specification`, `VERSION` = 2.2.0).
|
||||
|
||||
## Result
|
||||
|
||||
```
|
||||
BPMN tasks: 11 | DMN decisions: 3 | CMMN tasks: 9 | targets: 11 | bindings: 19
|
||||
ERRORS: 0
|
||||
WARNINGS: 0
|
||||
RESULT: PASS — package is UAPF v2.2.0 conformant
|
||||
```
|
||||
|
||||
## What was validated
|
||||
|
||||
Schema validation (`schemas/**`, JSON Schema draft 2020-12):
|
||||
|
||||
- `uapf.yaml` against `uapf-manifest.schema.json` — PASS
|
||||
- `resources/mappings.yaml` against `resource-mapping.schema.json` — PASS
|
||||
- `metadata/ownership.yaml` against `ownership.schema.json` — PASS
|
||||
- `metadata/lifecycle.yaml` against `lifecycle.schema.json` — PASS
|
||||
- `metadata/policies.yaml` against `policies.schema.json` — PASS
|
||||
- `enterprise/enterprise.yaml` against `enterprise-index.schema.json` — PASS
|
||||
|
||||
Structural checks (`07-package-format.md`, `04-folder-structure.md`):
|
||||
|
||||
- Level-4 package has ≥1 `.bpmn` file, `resources/mappings.yaml`, and both
|
||||
mandatory metadata files — PASS
|
||||
|
||||
Semantic rules (`11-semantic-validation.md`):
|
||||
|
||||
- SEM-001 BPMN/CMMN element references resolve — PASS
|
||||
- SEM-002 DMN decision references resolve — PASS
|
||||
- SEM-003 binding `targetId` values exist in `targets` — PASS
|
||||
- SEM-009 no duplicate binding for the same source — PASS
|
||||
- SEM-011 every cornerstone carries OMG diagram interchange (BPMNDI / DMNDI /
|
||||
CMMNDI) — PASS
|
||||
- SEM-004/005/006/010 (warnings) — none raised: every user task is bound, no
|
||||
unused targets, declared `requiredCapabilities` match target capabilities,
|
||||
all fallback targets resolve
|
||||
|
||||
YAML safety (`12-yaml-guidelines.md`): manifest `version` is a quoted string.
|
||||
|
||||
## How to re-validate
|
||||
|
||||
```
|
||||
python3 validate.py <workspace-root> <path-to-UAPF-specification-repo>
|
||||
```
|
||||
|
||||
`validate.py` is included at the workspace root. It loads the schemas directly
|
||||
from a checkout of `UAPFormat/UAPF-specification` and implements the schema,
|
||||
structural and SEM-001..011 rules.
|
||||
|
||||
## Two upstream issues found in the specification repository
|
||||
|
||||
This package follows the **normative specification text**, which
|
||||
`specification/00-ssot.md` declares authoritative over any tool or example.
|
||||
While validating, two defects were found in the spec repo itself — neither is a
|
||||
defect in this package, but both are worth reporting to `UAPFormat`:
|
||||
|
||||
1. **Stale reference CLI.** `tools/uapf-cli/uapf.py` checks for `*.bpmn.xml`
|
||||
files, but `specification/07-package-format.md` ("File naming") normatively
|
||||
requires the `.bpmn` / `.dmn` / `.cmmn` extensions, and the canonical
|
||||
examples (`examples/minimal-l4-package/bpmn/process.bpmn`,
|
||||
`examples/approve-expense-l4/bpmn/approve-expense.bpmn`) use `.bpmn`.
|
||||
Consequently the reference CLI wrongly rejects a spec-conformant Level-4
|
||||
package with: `ERROR: Level 4 requires at least one *.bpmn.xml file`.
|
||||
This package uses `.bpmn` / `.dmn` / `.cmmn` per the normative text.
|
||||
|
||||
2. **Malformed schema JSON.** `schemas/enterprise-index.schema.json` contains
|
||||
regex patterns with raw `\.` and `\s` escapes that are not valid JSON
|
||||
string escapes, so a strict JSON parser fails to load it
|
||||
(`Invalid \escape: line 28`). The bundled `validate.py` works around this by
|
||||
repairing the escapes on load; the upstream schema file should be fixed
|
||||
(double the backslashes).
|
||||
|
||||
## Status
|
||||
|
||||
`lifecycle.status: draft`. Conformance is structural and semantic only — it
|
||||
does **not** mean the modelled algorithm is operationally approved. The
|
||||
institutional gaps and open policy questions in `01-institutional-gap-analysis.md`
|
||||
must be resolved before any change to `approved`.
|
||||
19
metadata/lifecycle.yaml
Normal file
19
metadata/lifecycle.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
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.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
|
||||
12
metadata/ownership.yaml
Normal file
12
metadata/ownership.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
kind: uapf.metadata.ownership
|
||||
owners:
|
||||
- type: person
|
||||
id: rihards.gailums
|
||||
name: Rihards Gailums
|
||||
contact: rihards.gailums@gmail.com
|
||||
role: owner
|
||||
approvers:
|
||||
- rihards.gailums
|
||||
escalation:
|
||||
primary: rihards.gailums
|
||||
sla_hours: 72
|
||||
22
metadata/policies.yaml
Normal file
22
metadata/policies.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
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
|
||||
37
resources/guardrails.yaml
Normal file
37
resources/guardrails.yaml
Normal file
@@ -0,0 +1,37 @@
|
||||
# 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).
|
||||
|
||||
scope:
|
||||
domain: civil-defence
|
||||
classification: restricted
|
||||
legal_basis: national-civil-protection-law
|
||||
|
||||
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
|
||||
|
||||
human_oversight:
|
||||
required_for:
|
||||
- cell_broadcast_dispatch
|
||||
- interception_authorization
|
||||
- public_communication
|
||||
- incident_closure
|
||||
reviewer_role: nbs-joint-staff-duty-officer
|
||||
|
||||
audit:
|
||||
vc_signature_per_step: required
|
||||
retention_years: 10
|
||||
268
resources/mappings.yaml
Normal file
268
resources/mappings.yaml
Normal file
@@ -0,0 +1,268 @@
|
||||
kind: uapf.resources.mapping
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 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.
|
||||
# ---------------------------------------------------------------------------
|
||||
targets:
|
||||
- id: nbs.air-surveillance
|
||||
type: system_api
|
||||
name: NBS air surveillance and radar network
|
||||
description: Detection and tracking feed for airborne objects near the eastern border.
|
||||
capabilities:
|
||||
- lv.gov.civdef.air_surveillance_feed
|
||||
endpoint: "https://surveillance.mil.lv/api/v1"
|
||||
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
|
||||
|
||||
- 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.
|
||||
|
||||
- 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.
|
||||
|
||||
- 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
|
||||
endpoint: "https://cb.vugd.gov.lv/api/v1"
|
||||
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.
|
||||
|
||||
- id: kvc
|
||||
type: human_role
|
||||
name: Crisis Management Centre (Krizes vadibas centrs)
|
||||
description: Cross-institutional crisis coordination and after-action review.
|
||||
|
||||
- id: am
|
||||
type: human_role
|
||||
name: Ministry of Defence (Aizsardzibas ministrija)
|
||||
description: Public communication, origin attribution oversight and 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: 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
|
||||
endpoint: "mcp://agents/civdef-threat-assessment"
|
||||
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
|
||||
endpoint: "mcp://lv-civdef/osint-monitor"
|
||||
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"
|
||||
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."
|
||||
|
||||
- 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"
|
||||
targetId: agent.threat-assessment
|
||||
mode: assisted
|
||||
requiredCapabilities:
|
||||
- ai.classify
|
||||
notes: "AI recommends severity; NBS Joint Staff confirms. Advisory only per guardrails."
|
||||
|
||||
- source:
|
||||
type: dmn.decision
|
||||
ref: "Decision_CellBroadcastScope"
|
||||
targetId: nbs.joint-staff
|
||||
mode: manual
|
||||
notes: "VARAM consulted on the cell-broadcast platform; message templates are typed (GAP G3)."
|
||||
|
||||
- source:
|
||||
type: dmn.decision
|
||||
ref: "Decision_InterceptionAuthorization"
|
||||
targetId: nbs.joint-staff
|
||||
mode: manual
|
||||
notes: "Safety criteria made explicit and inspectable (GAP G7)."
|
||||
|
||||
# --- CMMN case human tasks ---
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_DebrisSearch"
|
||||
targetId: nbs.joint-staff
|
||||
mode: manual
|
||||
notes: "State Police support crash-site localisation."
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_FireSuppression"
|
||||
targetId: vugd.duty
|
||||
mode: manual
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_SceneSecurity"
|
||||
targetId: vp.duty
|
||||
mode: manual
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_MunicipalQA"
|
||||
targetId: municipal.civil-protection
|
||||
mode: manual
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_TechExam"
|
||||
targetId: nbs.joint-staff
|
||||
mode: manual
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_OriginAttribution"
|
||||
targetId: nbs.joint-staff
|
||||
mode: assisted
|
||||
notes: "Ministry of Defence consulted; AI may assist analysis but not attribute autonomously."
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_DisinfoMonitor"
|
||||
targetId: mcp.osint-monitor
|
||||
mode: assisted
|
||||
requiredCapabilities:
|
||||
- ai.classify
|
||||
notes: "Disinformation surfaced and classified via MCP tool; human reviews before correction."
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_Press"
|
||||
targetId: am
|
||||
mode: manual
|
||||
notes: "KVC consulted; public communication requires human oversight per guardrails."
|
||||
|
||||
- source:
|
||||
type: cmmn.humanTask
|
||||
ref: "HT_AfterAction"
|
||||
targetId: kvc
|
||||
mode: manual
|
||||
notes: "Ministry of Defence accountable; Government Crisis Management Council informed."
|
||||
91
uapf.yaml
Normal file
91
uapf.yaml
Normal file
@@ -0,0 +1,91 @@
|
||||
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
|
||||
version: "0.2.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.
|
||||
dmn:
|
||||
- path: dmn/air-threat-decisions.dmn
|
||||
role: decision-model
|
||||
description: Three decisions — air-threat severity, cell-broadcast scope, interception authorization.
|
||||
cmmn:
|
||||
- path: cmmn/field-response-investigation.cmmn
|
||||
role: case-model
|
||||
description: Discretionary field response and drone-origin investigation case.
|
||||
resources:
|
||||
- path: resources/mappings.yaml
|
||||
role: resource-mapping
|
||||
description: Institution and system targets bound to process, decision and case elements.
|
||||
- path: resources/guardrails.yaml
|
||||
role: ip-guardrails
|
||||
description: UAPF-IP guardrails policy snapshot enforced at every capability call.
|
||||
inputs:
|
||||
- airborneObjectTrack
|
||||
- objectClassification
|
||||
- borderProximityTier
|
||||
outputs:
|
||||
- cellBroadcastDispatch
|
||||
- interceptionDecision
|
||||
- incidentReport
|
||||
exposure:
|
||||
mcp:
|
||||
enabled: true
|
||||
runnable: true
|
||||
exposedEntrypoints:
|
||||
- process: Process_DroneThreatPublicAddress
|
||||
tool: drone_threat_public_address.run
|
||||
- decision: Decision_AirThreatSeverity
|
||||
tool: air_threat_severity.evaluate
|
||||
- decision: Decision_CellBroadcastScope
|
||||
tool: cell_broadcast_scope.evaluate
|
||||
- decision: Decision_InterceptionAuthorization
|
||||
tool: interception_authorization.evaluate
|
||||
exposedArtifacts:
|
||||
- manifest
|
||||
- bpmn
|
||||
- dmn
|
||||
- cmmn
|
||||
- docs
|
||||
requires_capabilities:
|
||||
- task.assign@1+
|
||||
- task.complete@1+
|
||||
- task.escalate@1+
|
||||
- event.emit@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
|
||||
Reference in New Issue
Block a user