Embargo Management Behavior Tree
Requirements
The Requirements Catalog and Architecture Specifications specify the behavioral requirements for this tree:
- EMB-10 — Enter EM Proposed
- EMB-11 — Enter EM Active
- EMB-12 — Enter EM Revise
- EMB-13 — Enter EM Exited
- EMB-16 — CS Public/Exploit/Attacks Detected While EM Proposed
- EMB-18 — EM Write-Boundary Consolidation
Implementation approach
The behavior tree diagram below illustrates one conformant implementation of these requirements. Implementations are not required to use behavior trees — any approach that satisfies the requirements above is conformant.
Legacy design diagram
The diagram on this page reflects the simulator-era design from vultron/bt/ and may not match the current implementation in vultron/core/behaviors/.
See the Behaviors Reference for auto-generated documentation from the current implementation.
The figure below shows the Embargo Management Behavior Tree. It follows the state transition function in the Embargo Management Process Model. Remember that the EM process starts in the \(q^{em} \in N\) state and ends in one of two states:
- in the eXited (\(q^{em} \in X\)) state, after the Participants establish an Active embargo
- in the None (\(q^{em} \in N\)) state, after all attempts to reach an agreement fail
---
title: Embargo Management Behavior Tree
---
flowchart LR
fb[?]
rm_s_or_c(["RM S or C?"])
fb -->|A| rm_s_or_c
em_x(["EM X?"])
fb -->|B| em_x
seq1["→"]
fb -->|C| seq1
cs_not_pxa(["CS not in pxa?"])
seq1 --> cs_not_pxa
em_none(["EM N?"])
seq1 --> em_none
n_seq["→"]
fb -->|D| n_seq
n_em_none(["EM N?"])
n_seq --> n_em_none
n_fb[?]
n_seq --> n_fb
n_stop_trying(["stop trying?"])
n_fb --> n_stop_trying
n_propose(["propose"])
n_fb --> n_propose
p_seq["→"]
fb -->|E| p_seq
p_em_prop(["EM P?"])
p_seq --> p_em_prop
p_fb[?]
p_seq --> p_fb
p_terminate["terminate"]
p_fb --> p_terminate
p_jump["evaluate"]
p_fb --> p_jump
p_fb_seq["→"]
p_fb --> p_fb_seq
p_reject["reject"]
p_fb_seq --> p_reject
p_em_to_n["EM P → N<br/>(emit ER)"]
p_fb_seq --> p_em_to_n
a_seq["→"]
fb -->|F| a_seq
a_em_a(["EM A?"])
a_seq --> a_em_a
a_fb[?]
a_seq --> a_fb
a_terminate["terminate"]
a_fb --> a_terminate
a_current_terms(["current terms ok?"])
a_fb --> a_current_terms
a_propose["propose"]
a_fb --> a_propose
r_seq["→"]
fb -->|G| r_seq
r_em_r(["EM R?"])
r_seq --> r_em_r
r_fb[?]
r_seq --> r_fb
r_terminate["terminate"]
r_fb --> r_terminate
r_jump["evaluate"]
r_fb --> r_jump
r_fb_seq["→"]
r_fb --> r_fb_seq
r_reject["reject"]
r_fb_seq --> r_reject
r_em_to_a["EM R → A<br/>(emit EJ)"]
r_fb_seq --> r_em_to_a
(A) The tree first checks whether no report has arrived or the report is already Closed (\(q^{rm} \in \{S{,}C\}\)). If either condition is true, no more effort is necessary, and the tree succeeds.
(B) Next, the tree checks whether the embargo is already eXited (\(q^{em} \in X\)). If it is, the tree succeeds.
(C) If that check fails, the tree checks whether the case is outside the embargo "habitable zone". The \({q^{cs}\not\in\cdot\cdot\cdot pxa}\) condition is true in three situations: someone has observed attacks, an exploit is public, or information about the vulnerability is public. If one of these conditions is true and the EM state is None (\(q^{em} \in N\)), the check returns Success. The tree then stops, as Negotiating Embargoes describes.
See also
Otherwise, the tree goes through each of the remaining EM states.
(D) When there is no embargo and no open proposal (\(q^{em} \in N\)), the tree has only two options. It can stop trying, or it can propose a new embargo. Each Participant decides when to stop trying to get an embargo. Negotiating Embargoes gives some guidance about this decision.
(E) When there is an open embargo proposal (\(q^{em} \in P\)), the tree first tries the terminate task. This task returns Success if there is a reason for \({q^{em} \in P \xrightarrow{r} N}\).
If there is no reason to terminate, the tree goes to the evaluate task, which is described below. The evaluate task returns Success if the Participant accepts the proposal or makes a counterproposal.
If neither of these succeeds, the tree rejects the proposal. It returns to \(q^{em} \in N\) and emits a related \(ER\) message.
(F) The process in the Active (\(q^{em} \in A\)) state is also simple. If there is a reason to terminate the embargo, the tree terminates it. Otherwise, the tree checks whether the Active Embargo's terms are acceptable. If they are not, the tree proposes a new embargo.
(G) Last, the tree handles the Revise EM state (\(q^{em} \in R\)). This branch has the same structure as the Proposed branch above. Again, the tree checks whether there is a reason to terminate, and terminates if necessary.
If termination is not necessary, the tree goes to evaluate the proposed revision. The Participant then accepts the proposal or makes a counterproposal. If neither of these succeeds, the tree rejects the revision. The EM state then returns to \(q^{em} \in A\), and the original embargo terms do not change. An \(EJ\) message gives this information to the other Participants.