@nanobpm/nano-workforce 0.200.7 → 0.200.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/SPEC.md +41 -0
- package/app/agentSla.test.ts +48 -0
- package/app/agentSla.ts +36 -11
- package/app/agentic/vocab/agent-sla-boundary.test.ts +170 -0
- package/app/agentic/vocab/job-types.ts +60 -0
- package/app/conformance.test.ts +114 -0
- package/app/conformance.ts +72 -0
- package/app/contracts.ts +2 -2
- package/app/deliveryRunner.ts +5 -0
- package/app/feature.ts +5 -0
- package/app/implementEscalationReason.test.ts +216 -0
- package/app/implementEscalationReason.ts +213 -0
- package/app/implementReconcile.test.ts +168 -11
- package/app/implementReconcile.ts +112 -18
- package/app/plan.ts +12 -0
- package/app/retro.test.ts +5 -0
- package/app/retro.ts +4 -0
- package/app/service.ts +27 -8
- package/e2e/agent-sla-boundary.e2e.ts +598 -0
- package/e2e/feature-run.e2e.ts +8 -1
- package/e2e/plan-fanout.e2e.ts +75 -2
- package/e2e/support/pin-agent-sla.ts +47 -0
- package/package.json +1 -1
- package/resources/processes/feature.bpmn +1 -0
- package/resources/processes/implement-cell.bpmn +122 -47
- package/resources/processes/merge-cell.bpmn +60 -12
- package/resources/processes/plan-fanout.bpmn +237 -211
- package/resources/processes/retro.bpmn +100 -3
- package/resources/prompts/feature.md +16 -1
- package/test/derivation-parity/derivation-parity.test.ts +35 -11
- package/test/derivation-parity/flows.ts +14 -1
- package/workers/conformance-record/worker.test.ts +87 -1
- package/workers/conformance-record/worker.ts +34 -7
- package/workers/reconcile-implement/worker.test.ts +31 -3
- package/workers/reconcile-implement/worker.ts +5 -0
- package/workers/record-feature-escalation/worker.test.ts +58 -3
- package/workers/record-feature-escalation/worker.ts +24 -10
package/e2e/plan-fanout.e2e.ts
CHANGED
|
@@ -587,11 +587,84 @@ describe("plan-fanout escalations (U2 — task + plan-review + trial-merge → u
|
|
|
587
587
|
|
|
588
588
|
const answered = takenFlows(app);
|
|
589
589
|
assert.ok(
|
|
590
|
-
answered.includes("w_gw_answer->
|
|
591
|
-
|
|
590
|
+
answered.includes("w_gw_answer->record-task-implementing") &&
|
|
591
|
+
answered.includes("record-task-implementing->implement-cell-call") &&
|
|
592
|
+
answered.includes("Start->implement-task"),
|
|
593
|
+
`answering the caps escalation reset the stale question and released the barrier into the implement cell (flows: ${answered.join(", ")})`,
|
|
592
594
|
);
|
|
593
595
|
assert.equal(featureRan, true, "the agent was dispatched once the operator answered the caps escalation");
|
|
594
596
|
},
|
|
595
597
|
);
|
|
596
598
|
});
|
|
599
|
+
|
|
600
|
+
// Regression (review: "Reset stale result fields on initial implementation entry"). The capability
|
|
601
|
+
// barrier's timeout seeds an operator `question` (`wait-caps-timeout`), and answering the
|
|
602
|
+
// `feature-escalation` loops back into the implement cell (`w_answerLoop`). The cell's
|
|
603
|
+
// `record-implementing` reset clears the result fields only on its OWN retry/answer re-entry — the
|
|
604
|
+
// INITIAL `Start -> implement-task` entry bypasses it, so the inherited caps-timeout question would
|
|
605
|
+
// still be in scope. If the agent then returns an off-vocabulary `completed` (no PR delivered), a
|
|
606
|
+
// stale question makes `shouldReconcileImplement` honour it as a genuine escalation — skipping the
|
|
607
|
+
// auto-retry and re-escalating the ALREADY-ANSWERED caps question. The fix clears `question` on the
|
|
608
|
+
// plan-fanout answer loop-back, so the cell is entered clean and the claimed completion auto-retries.
|
|
609
|
+
test("capability edge: an answered caps escalation enters the cell clean — a claimed completion auto-retries, not re-escalates the stale question", async () => {
|
|
610
|
+
const capTaskPlan: Stub = () => ({
|
|
611
|
+
tasks: [
|
|
612
|
+
{
|
|
613
|
+
id: "t1",
|
|
614
|
+
title: "T1",
|
|
615
|
+
prompt: "do t1",
|
|
616
|
+
// A bare handle names no owner/repo releases source — unresolvable, so the barrier times out.
|
|
617
|
+
needs: [{ capabilityRef: "#274", package: "@nanobpm/urban" }],
|
|
618
|
+
},
|
|
619
|
+
],
|
|
620
|
+
});
|
|
621
|
+
let featureCalls = 0;
|
|
622
|
+
await withApp(
|
|
623
|
+
{
|
|
624
|
+
"senior:plan": capTaskPlan,
|
|
625
|
+
"senior:plan-review": approveReview,
|
|
626
|
+
// The implement agent claims completion WITHOUT opening a PR (the github stub lists none) — the
|
|
627
|
+
// #865 claimed-completion-without-delivery the reconcile step auto-retries ONCE.
|
|
628
|
+
"senior:feature": () => {
|
|
629
|
+
featureCalls += 1;
|
|
630
|
+
return { status: "completed", summary: "done, no PR" };
|
|
631
|
+
},
|
|
632
|
+
},
|
|
633
|
+
async ({ app, processKey }) => {
|
|
634
|
+
// Let the unresolvable barrier time out into the operator escalation.
|
|
635
|
+
await advancePastTimer(app, 25 * 60 * 60 * 1000);
|
|
636
|
+
const task = await openTask(app, processKey, "feature-escalation");
|
|
637
|
+
await app.engine.completeUserTask(task.userTaskKey, { resolution: "answer", answer: "shipped it manually" });
|
|
638
|
+
await settleFully(app);
|
|
639
|
+
|
|
640
|
+
// The answered barrier released the token through the answer loop-back's reset into the
|
|
641
|
+
// implement cell, and the agent ran.
|
|
642
|
+
const entered = takenFlows(app);
|
|
643
|
+
assert.ok(
|
|
644
|
+
entered.includes("w_gw_answer->record-task-implementing") &&
|
|
645
|
+
entered.includes("record-task-implementing->implement-cell-call") &&
|
|
646
|
+
entered.includes("Start->implement-task"),
|
|
647
|
+
`answering the caps escalation reset the stale question and released the barrier into the implement cell (flows: ${entered.join(", ")})`,
|
|
648
|
+
);
|
|
649
|
+
|
|
650
|
+
// With the stale caps-timeout question cleared on cell entry, the off-vocabulary `completed`
|
|
651
|
+
// (no adoptable PR) takes the reconcile AUTO-RETRY arm — re-dispatching the agent once — rather
|
|
652
|
+
// than re-escalating the ALREADY-ANSWERED caps question. `settleFully` above drove the whole
|
|
653
|
+
// loop to quiescence: the agent ran exactly TWICE (the initial dispatch + the one bounded
|
|
654
|
+
// auto-retry), and only then — the retry consumed — did the cell escalate (the bounded
|
|
655
|
+
// claimed-completion behaviour of #865). The retry is the proof the stale question was cleared:
|
|
656
|
+
// an inherited question would have routed the FIRST `completed` straight to escalation.
|
|
657
|
+
const flows = takenFlows(app);
|
|
658
|
+
assert.ok(
|
|
659
|
+
flows.includes("ic_reconcile_gw->record-implementing"),
|
|
660
|
+
`the claimed completion auto-retried through the cell's reset (flows: ${flows.join(", ")})`,
|
|
661
|
+
);
|
|
662
|
+
assert.ok(
|
|
663
|
+
flows.includes("record-implementing->implement-task"),
|
|
664
|
+
`the retry re-entered the implement task (flows: ${flows.join(", ")})`,
|
|
665
|
+
);
|
|
666
|
+
assert.equal(featureCalls, 2, "the auto-retry re-dispatched the implement agent exactly once");
|
|
667
|
+
},
|
|
668
|
+
);
|
|
669
|
+
});
|
|
597
670
|
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Isolate the agent-SLA e2e suite from ambient `NANO_PR_AGENT_SLA_TIMEOUT`.
|
|
2
|
+
//
|
|
3
|
+
// `app/agentSla.ts` resolves its `AGENT_SLA_TIMEOUT` constant ONCE, at import time, from the ambient
|
|
4
|
+
// `NANO_PR_AGENT_SLA_TIMEOUT` env (through the typed env schema). That frozen constant is what every
|
|
5
|
+
// process start seeds as the `agentSlaTimeout` process variable — including the app-booted feature
|
|
6
|
+
// run, whose `app/feature.ts` imports the same const. So the SLA the boundary fires on is whatever
|
|
7
|
+
// env was present when the module graph loaded, NOT a value the test can set in a `before` hook.
|
|
8
|
+
//
|
|
9
|
+
// If a CI box or a developer shell exports e.g. `NANO_PR_AGENT_SLA_TIMEOUT=PT30M`, the suite's
|
|
10
|
+
// "under SLA" advance (shorter than the default PT2H) would suddenly EXCEED the SLA and fire the
|
|
11
|
+
// boundary; with `PT4H` the "past SLA" advance would no longer reach it. Either way the suite fails
|
|
12
|
+
// for a reason that has nothing to do with the code under test — a non-deterministic,
|
|
13
|
+
// ambient-config-driven failure (AGENTS.md: "no such thing as flaky tests").
|
|
14
|
+
//
|
|
15
|
+
// This module pins a FIXED duration BEFORE `app/agentSla.ts` can be evaluated, so the frozen const
|
|
16
|
+
// is deterministic regardless of the ambient env. `agent-sla-boundary.e2e.ts` imports it FIRST (no
|
|
17
|
+
// support module nor the engine testkit imports `app/agentSla.ts`, so this side effect lands before
|
|
18
|
+
// that module's const is computed). Both the direct-instance seeds and the advance thresholds derive
|
|
19
|
+
// from the SAME pinned duration, so they can never drift apart.
|
|
20
|
+
|
|
21
|
+
/** The fixed agent SLA this suite runs against (ISO-8601 duration), pinned into the env before any
|
|
22
|
+
* app module reads it. Kept equal to the production default `DEFAULT_AGENT_SLA_TIMEOUT` (PT2H). */
|
|
23
|
+
export const PINNED_AGENT_SLA = "PT2H";
|
|
24
|
+
|
|
25
|
+
process.env.NANO_PR_AGENT_SLA_TIMEOUT = PINNED_AGENT_SLA;
|
|
26
|
+
|
|
27
|
+
/** Parse the subset of ISO-8601 durations this suite uses (`PT#H#M#S`) to milliseconds. Throws on an
|
|
28
|
+
* unparseable value so a mistyped pin fails loudly rather than silently yielding a 0ms threshold. */
|
|
29
|
+
function isoDurationToMs(iso: string): number {
|
|
30
|
+
const match = /^PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?$/.exec(iso);
|
|
31
|
+
if (!match || (!match[1] && !match[2] && !match[3])) {
|
|
32
|
+
throw new Error(`pin-agent-sla: cannot parse pinned duration "${iso}" (expected PT#H#M#S)`);
|
|
33
|
+
}
|
|
34
|
+
const [, h, m, s] = match;
|
|
35
|
+
return ((Number(h ?? 0) * 60 + Number(m ?? 0)) * 60 + Number(s ?? 0)) * 1000;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** The pinned SLA in ms — the single source both advance thresholds derive from. */
|
|
39
|
+
export const PINNED_AGENT_SLA_MS = isoDurationToMs(PINNED_AGENT_SLA);
|
|
40
|
+
|
|
41
|
+
/** Comfortably PAST the SLA (1.5×) so the agent boundary fires, yet well under the downstream
|
|
42
|
+
* human-escalation SLA (PT24H) so that one stays dormant — isolating the agent-SLA arm. */
|
|
43
|
+
export const PAST_AGENT_SLA_MS = Math.round(PINNED_AGENT_SLA_MS * 1.5);
|
|
44
|
+
|
|
45
|
+
/** Comfortably UNDER the SLA (0.25×) so the boundary is proven genuinely armed on the seeded
|
|
46
|
+
* duration, not firing spuriously. */
|
|
47
|
+
export const UNDER_AGENT_SLA_MS = Math.round(PINNED_AGENT_SLA_MS * 0.25);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nanobpm/nano-workforce",
|
|
3
|
-
"version": "0.200.
|
|
3
|
+
"version": "0.200.9",
|
|
4
4
|
"description": "Nano Workforce — an Agent Graph Orchestration application for Agentic SDLC: durable BPMN processes that coordinate a graph of AI agents across the software delivery lifecycle.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "main.ts",
|
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
<zeebe:input source="=if (is defined(transcriptUrlBase)) then transcriptUrlBase else null" target="transcriptUrlBase" />
|
|
183
183
|
<zeebe:input source="=if (is defined(escalationAssignee)) then escalationAssignee else null" target="escalationAssignee" />
|
|
184
184
|
<zeebe:input source="=escalationSlaTimeout" target="escalationSlaTimeout" />
|
|
185
|
+
<zeebe:input source="=agentSlaTimeout" target="agentSlaTimeout" />
|
|
185
186
|
<zeebe:input source="=featureKey" target="subjectKey" />
|
|
186
187
|
<zeebe:output source="=status" target="status" />
|
|
187
188
|
<zeebe:output source="=if (is defined(summary)) then summary else null" target="summary" />
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
<nano:extend name="subjectKey" type="string" />
|
|
8
8
|
<nano:extend name="status" type="string" optional="true" />
|
|
9
9
|
<nano:extend name="question" type="string" optional="true" />
|
|
10
|
+
<nano:extend name="summary" type="string" optional="true" />
|
|
11
|
+
<nano:extend name="transcriptUrl" type="string" optional="true" />
|
|
12
|
+
<nano:extend name="pr" type="string" optional="true" />
|
|
13
|
+
<nano:extend name="deliveryVerified" type="boolean" optional="true" />
|
|
10
14
|
</nano:shape>
|
|
11
15
|
</nano:shapes>
|
|
12
16
|
</bpmn:extensionElements>
|
|
@@ -21,10 +25,11 @@
|
|
|
21
25
|
<zeebe:linkedResource resourceId="prompts/feature.md" bindingType="latest" resourceType="GenericScript" linkName="prompt" />
|
|
22
26
|
</zeebe:linkedResources>
|
|
23
27
|
<zeebe:ioMapping>
|
|
24
|
-
<zeebe:input source="=" --- " + task.prompt + (if (is defined(baseBranchBrief) and baseBranchBrief != null) then baseBranchBrief else "") + (if (is defined(blackboardBrief) and blackboardBrief != null) then blackboardBrief else "") + (if (is defined(resolvedDepsBrief) and resolvedDepsBrief != null) then resolvedDepsBrief else "") + (if (is defined(resolvedArtifacts) = false or resolvedArtifacts = null or count(resolvedArtifacts[item != null]) = 0) then "" else (" --- **Bound upstream readiness.** Build/install/clone against EXACTLY these resolved published versions (the ones first carrying the awaited capability), and bump the consumer dependency to them — never merely the newest: " + string join(resolvedArtifacts[item != null], " "))) + (if (is defined(customInstructions) = false or customInstructions = null) then "" else " --- ## Operator custom instructions The operator supplied these instructions for this run — follow them: " + customInstructions)" target="appendPrompt" />
|
|
28
|
+
<zeebe:input source="=" --- " + task.prompt + (if (is defined(baseBranchBrief) and baseBranchBrief != null) then baseBranchBrief else "") + (if (is defined(blackboardBrief) and blackboardBrief != null) then blackboardBrief else "") + (if (is defined(resolvedDepsBrief) and resolvedDepsBrief != null) then resolvedDepsBrief else "") + (if (is defined(resolvedArtifacts) = false or resolvedArtifacts = null or count(resolvedArtifacts[item != null]) = 0) then "" else (" --- **Bound upstream readiness.** Build/install/clone against EXACTLY these resolved published versions (the ones first carrying the awaited capability), and bump the consumer dependency to them — never merely the newest: " + string join(resolvedArtifacts[item != null], " "))) + (if (is defined(customInstructions) = false or customInstructions = null) then "" else " --- ## Operator custom instructions The operator supplied these instructions for this run — follow them: " + customInstructions) + (if (is defined(retryNudge) and retryNudge != null) then retryNudge else "")" target="appendPrompt" />
|
|
25
29
|
<zeebe:input source="=if (is defined(transcriptUrlBase)) then transcriptUrlBase else null" target="transcriptUrlBase" />
|
|
26
30
|
<zeebe:output source="=status" target="status" />
|
|
27
31
|
<zeebe:output source="=question" target="question" />
|
|
32
|
+
<zeebe:output source="=if (is defined(summary)) then summary else null" target="summary" />
|
|
28
33
|
<zeebe:output source="=if (is defined(transcriptUrl)) then transcriptUrl else null" target="transcriptUrl" />
|
|
29
34
|
</zeebe:ioMapping>
|
|
30
35
|
</bpmn:extensionElements>
|
|
@@ -32,6 +37,12 @@
|
|
|
32
37
|
<bpmn:incoming>ic_answerLoop</bpmn:incoming>
|
|
33
38
|
<bpmn:outgoing>ic_toGw</bpmn:outgoing>
|
|
34
39
|
</bpmn:serviceTask>
|
|
40
|
+
<bpmn:boundaryEvent id="be_implement_sla" name="Agent SLA elapsed" attachedToRef="implement-task">
|
|
41
|
+
<bpmn:outgoing>ic_sla</bpmn:outgoing>
|
|
42
|
+
<bpmn:timerEventDefinition id="ted_implement_sla">
|
|
43
|
+
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">=agentSlaTimeout</bpmn:timeDuration>
|
|
44
|
+
</bpmn:timerEventDefinition>
|
|
45
|
+
</bpmn:boundaryEvent>
|
|
35
46
|
<bpmn:exclusiveGateway id="ic_gw" name="clean terminal?" default="ic_escalate">
|
|
36
47
|
<bpmn:incoming>ic_toGw</bpmn:incoming>
|
|
37
48
|
<bpmn:outgoing>ic_escalate</bpmn:outgoing>
|
|
@@ -44,6 +55,10 @@
|
|
|
44
55
|
<zeebe:output source="=reconciled" target="reconciled" />
|
|
45
56
|
<zeebe:output source="=status" target="status" />
|
|
46
57
|
<zeebe:output source="=pr" target="pr" />
|
|
58
|
+
<zeebe:output source="=retry" target="retry" />
|
|
59
|
+
<zeebe:output source="=retryNudge" target="retryNudge" />
|
|
60
|
+
<zeebe:output source="=retried" target="implementRetried" />
|
|
61
|
+
<zeebe:output source="=deliveryVerified" target="deliveryVerified" />
|
|
47
62
|
</zeebe:ioMapping>
|
|
48
63
|
</bpmn:extensionElements>
|
|
49
64
|
<bpmn:incoming>ic_escalate</bpmn:incoming>
|
|
@@ -52,6 +67,7 @@
|
|
|
52
67
|
<bpmn:exclusiveGateway id="ic_reconcile_gw" name="reconciled?" default="ic_toRecordEscalation">
|
|
53
68
|
<bpmn:incoming>ic_toReconcileGw</bpmn:incoming>
|
|
54
69
|
<bpmn:outgoing>ic_reconciled</bpmn:outgoing>
|
|
70
|
+
<bpmn:outgoing>ic_retry</bpmn:outgoing>
|
|
55
71
|
<bpmn:outgoing>ic_toRecordEscalation</bpmn:outgoing>
|
|
56
72
|
</bpmn:exclusiveGateway>
|
|
57
73
|
<bpmn:callActivity id="escalate" name="Human escalation">
|
|
@@ -81,6 +97,20 @@
|
|
|
81
97
|
<bpmn:incoming>ic_toRecordEscalation</bpmn:incoming>
|
|
82
98
|
<bpmn:outgoing>ic_toEscalate</bpmn:outgoing>
|
|
83
99
|
</bpmn:serviceTask>
|
|
100
|
+
<bpmn:serviceTask id="record-escalation-sla" name="Record escalation (agent SLA)">
|
|
101
|
+
<bpmn:extensionElements>
|
|
102
|
+
<zeebe:taskDefinition type="pr.record-feature-escalation" />
|
|
103
|
+
<zeebe:properties>
|
|
104
|
+
<zeebe:property name="io.nanobpm.dataEnvelope.in" value="RecordEscalationIn" />
|
|
105
|
+
</zeebe:properties>
|
|
106
|
+
<zeebe:ioMapping>
|
|
107
|
+
<zeebe:input source="="The implementation agent exceeded its time budget (SLA " + agentSlaTimeout + ") without completing — it is hung or looping. Check its progress or intervene, then answer to resume (the run continues on its deterministic feat/<task.id> branch), or abandon it."" target="question" />
|
|
108
|
+
<zeebe:output source="=question" target="question" />
|
|
109
|
+
</zeebe:ioMapping>
|
|
110
|
+
</bpmn:extensionElements>
|
|
111
|
+
<bpmn:incoming>ic_sla</bpmn:incoming>
|
|
112
|
+
<bpmn:outgoing>ic_slaToEscalate</bpmn:outgoing>
|
|
113
|
+
</bpmn:serviceTask>
|
|
84
114
|
<bpmn:exclusiveGateway id="ic_gw_answer" name="answer?" default="ic_abandon">
|
|
85
115
|
<bpmn:incoming>ic_toAnswerGw</bpmn:incoming>
|
|
86
116
|
<bpmn:outgoing>ic_answerLoop</bpmn:outgoing>
|
|
@@ -92,8 +122,16 @@
|
|
|
92
122
|
<zeebe:properties>
|
|
93
123
|
<zeebe:property name="io.nanobpm.dataEnvelope.in" value="RecordFeatureImplementingIn" />
|
|
94
124
|
</zeebe:properties>
|
|
125
|
+
<zeebe:ioMapping>
|
|
126
|
+
<zeebe:output source="=null" target="status" />
|
|
127
|
+
<zeebe:output source="=null" target="question" />
|
|
128
|
+
<zeebe:output source="=null" target="summary" />
|
|
129
|
+
<zeebe:output source="=null" target="transcriptUrl" />
|
|
130
|
+
<zeebe:output source="=null" target="deliveryVerified" />
|
|
131
|
+
</zeebe:ioMapping>
|
|
95
132
|
</bpmn:extensionElements>
|
|
96
133
|
<bpmn:incoming>ic_answerLoop</bpmn:incoming>
|
|
134
|
+
<bpmn:incoming>ic_retry</bpmn:incoming>
|
|
97
135
|
<bpmn:outgoing>ic_reImplement</bpmn:outgoing>
|
|
98
136
|
</bpmn:serviceTask>
|
|
99
137
|
<bpmn:endEvent id="ic_end" name="Task done">
|
|
@@ -112,6 +150,11 @@
|
|
|
112
150
|
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=reconciled = true</bpmn:conditionExpression>
|
|
113
151
|
</bpmn:sequenceFlow>
|
|
114
152
|
<bpmn:sequenceFlow id="ic_toRecordEscalation" name="escalated" sourceRef="ic_reconcile_gw" targetRef="record-escalation" />
|
|
153
|
+
<bpmn:sequenceFlow id="ic_sla" name="agent SLA elapsed" sourceRef="be_implement_sla" targetRef="record-escalation-sla" />
|
|
154
|
+
<bpmn:sequenceFlow id="ic_slaToEscalate" sourceRef="record-escalation-sla" targetRef="escalate" />
|
|
155
|
+
<bpmn:sequenceFlow id="ic_retry" name="retry" sourceRef="ic_reconcile_gw" targetRef="record-implementing">
|
|
156
|
+
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=retry = true</bpmn:conditionExpression>
|
|
157
|
+
</bpmn:sequenceFlow>
|
|
115
158
|
<bpmn:sequenceFlow id="ic_toEscalate" sourceRef="record-escalation" targetRef="escalate" />
|
|
116
159
|
<bpmn:sequenceFlow id="ic_toAnswerGw" sourceRef="escalate" targetRef="ic_gw_answer" />
|
|
117
160
|
<bpmn:sequenceFlow id="ic_answerLoop" name="answer" sourceRef="ic_gw_answer" targetRef="record-implementing">
|
|
@@ -132,39 +175,48 @@
|
|
|
132
175
|
<dc:Bounds x="216" y="80" width="100" height="80" />
|
|
133
176
|
</bpmndi:BPMNShape>
|
|
134
177
|
<bpmndi:BPMNShape id="BPMNShape_ic_gw" bpmnElement="ic_gw" isMarkerVisible="true">
|
|
135
|
-
<dc:Bounds x="
|
|
178
|
+
<dc:Bounds x="441" y="95" width="50" height="50" />
|
|
136
179
|
<bpmndi:BPMNLabel>
|
|
137
|
-
<dc:Bounds x="
|
|
180
|
+
<dc:Bounds x="431" y="62" width="70" height="28" />
|
|
138
181
|
</bpmndi:BPMNLabel>
|
|
139
182
|
</bpmndi:BPMNShape>
|
|
140
183
|
<bpmndi:BPMNShape id="BPMNShape_reconcile-implement" bpmnElement="reconcile-implement">
|
|
141
|
-
<dc:Bounds x="
|
|
184
|
+
<dc:Bounds x="616" y="80" width="100" height="80" />
|
|
142
185
|
</bpmndi:BPMNShape>
|
|
143
186
|
<bpmndi:BPMNShape id="BPMNShape_ic_reconcile_gw" bpmnElement="ic_reconcile_gw" isMarkerVisible="true">
|
|
144
|
-
<dc:Bounds x="
|
|
187
|
+
<dc:Bounds x="816" y="95" width="50" height="50" />
|
|
145
188
|
<bpmndi:BPMNLabel>
|
|
146
|
-
<dc:Bounds x="
|
|
189
|
+
<dc:Bounds x="801" y="76" width="81" height="14" />
|
|
147
190
|
</bpmndi:BPMNLabel>
|
|
148
191
|
</bpmndi:BPMNShape>
|
|
149
192
|
<bpmndi:BPMNShape id="BPMNShape_escalate" bpmnElement="escalate">
|
|
150
|
-
<dc:Bounds x="
|
|
193
|
+
<dc:Bounds x="1166" y="80" width="100" height="80" />
|
|
151
194
|
</bpmndi:BPMNShape>
|
|
152
195
|
<bpmndi:BPMNShape id="BPMNShape_record-escalation" bpmnElement="record-escalation">
|
|
153
|
-
<dc:Bounds x="
|
|
196
|
+
<dc:Bounds x="966" y="80" width="100" height="80" />
|
|
197
|
+
</bpmndi:BPMNShape>
|
|
198
|
+
<bpmndi:BPMNShape id="BPMNShape_record-escalation-sla" bpmnElement="record-escalation-sla">
|
|
199
|
+
<dc:Bounds x="416" y="400" width="100" height="80" />
|
|
154
200
|
</bpmndi:BPMNShape>
|
|
155
201
|
<bpmndi:BPMNShape id="BPMNShape_ic_gw_answer" bpmnElement="ic_gw_answer" isMarkerVisible="true">
|
|
156
|
-
<dc:Bounds x="
|
|
202
|
+
<dc:Bounds x="1366" y="95" width="50" height="50" />
|
|
157
203
|
<bpmndi:BPMNLabel>
|
|
158
|
-
<dc:Bounds x="
|
|
204
|
+
<dc:Bounds x="1323" y="150" width="56" height="14" />
|
|
159
205
|
</bpmndi:BPMNLabel>
|
|
160
206
|
</bpmndi:BPMNShape>
|
|
161
207
|
<bpmndi:BPMNShape id="BPMNShape_record-implementing" bpmnElement="record-implementing">
|
|
162
|
-
<dc:Bounds x="
|
|
208
|
+
<dc:Bounds x="1516" y="240" width="100" height="80" />
|
|
163
209
|
</bpmndi:BPMNShape>
|
|
164
210
|
<bpmndi:BPMNShape id="BPMNShape_ic_end" bpmnElement="ic_end">
|
|
165
|
-
<dc:Bounds x="
|
|
211
|
+
<dc:Bounds x="1548" y="102" width="36" height="36" />
|
|
166
212
|
<bpmndi:BPMNLabel>
|
|
167
|
-
<dc:Bounds x="
|
|
213
|
+
<dc:Bounds x="1493" y="143" width="66" height="14" />
|
|
214
|
+
</bpmndi:BPMNLabel>
|
|
215
|
+
</bpmndi:BPMNShape>
|
|
216
|
+
<bpmndi:BPMNShape id="BPMNShape_be_implement_sla" bpmnElement="be_implement_sla">
|
|
217
|
+
<dc:Bounds x="248" y="142" width="36" height="36" />
|
|
218
|
+
<bpmndi:BPMNLabel>
|
|
219
|
+
<dc:Bounds x="170" y="183" width="72" height="28" />
|
|
168
220
|
</bpmndi:BPMNLabel>
|
|
169
221
|
</bpmndi:BPMNShape>
|
|
170
222
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_toImplement" bpmnElement="ic_toImplement">
|
|
@@ -173,72 +225,95 @@
|
|
|
173
225
|
</bpmndi:BPMNEdge>
|
|
174
226
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_toGw" bpmnElement="ic_toGw">
|
|
175
227
|
<di:waypoint x="316" y="120" />
|
|
176
|
-
<di:waypoint x="
|
|
228
|
+
<di:waypoint x="441" y="120" />
|
|
177
229
|
</bpmndi:BPMNEdge>
|
|
178
230
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_escalate" bpmnElement="ic_escalate">
|
|
179
|
-
<di:waypoint x="
|
|
180
|
-
<di:waypoint x="
|
|
231
|
+
<di:waypoint x="491" y="120" />
|
|
232
|
+
<di:waypoint x="616" y="120" />
|
|
181
233
|
<bpmndi:BPMNLabel>
|
|
182
|
-
<dc:Bounds x="
|
|
234
|
+
<dc:Bounds x="520" y="98" width="67" height="14" />
|
|
183
235
|
</bpmndi:BPMNLabel>
|
|
184
236
|
</bpmndi:BPMNEdge>
|
|
185
237
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_toReconcileGw" bpmnElement="ic_toReconcileGw">
|
|
186
|
-
<di:waypoint x="
|
|
187
|
-
<di:waypoint x="
|
|
238
|
+
<di:waypoint x="716" y="120" />
|
|
239
|
+
<di:waypoint x="816" y="120" />
|
|
188
240
|
</bpmndi:BPMNEdge>
|
|
189
241
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_toRecordEscalation" bpmnElement="ic_toRecordEscalation">
|
|
190
|
-
<di:waypoint x="
|
|
191
|
-
<di:waypoint x="
|
|
242
|
+
<di:waypoint x="866" y="120" />
|
|
243
|
+
<di:waypoint x="966" y="120" />
|
|
192
244
|
<bpmndi:BPMNLabel>
|
|
193
|
-
<dc:Bounds x="
|
|
245
|
+
<dc:Bounds x="883" y="128" width="67" height="14" />
|
|
194
246
|
</bpmndi:BPMNLabel>
|
|
195
247
|
</bpmndi:BPMNEdge>
|
|
196
248
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_toEscalate" bpmnElement="ic_toEscalate">
|
|
197
|
-
<di:waypoint x="
|
|
198
|
-
<di:waypoint x="
|
|
249
|
+
<di:waypoint x="1066" y="120" />
|
|
250
|
+
<di:waypoint x="1166" y="120" />
|
|
199
251
|
</bpmndi:BPMNEdge>
|
|
200
252
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_toAnswerGw" bpmnElement="ic_toAnswerGw">
|
|
201
|
-
<di:waypoint x="
|
|
202
|
-
<di:waypoint x="
|
|
253
|
+
<di:waypoint x="1266" y="120" />
|
|
254
|
+
<di:waypoint x="1366" y="120" />
|
|
203
255
|
</bpmndi:BPMNEdge>
|
|
204
256
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_abandon" bpmnElement="ic_abandon">
|
|
205
|
-
<di:waypoint x="
|
|
206
|
-
<di:waypoint x="
|
|
257
|
+
<di:waypoint x="1416" y="120" />
|
|
258
|
+
<di:waypoint x="1548" y="120" />
|
|
207
259
|
<bpmndi:BPMNLabel>
|
|
208
|
-
<dc:Bounds x="
|
|
260
|
+
<dc:Bounds x="1456" y="98" width="53" height="14" />
|
|
261
|
+
</bpmndi:BPMNLabel>
|
|
262
|
+
</bpmndi:BPMNEdge>
|
|
263
|
+
<bpmndi:BPMNEdge id="BPMNEdge_ic_retry" bpmnElement="ic_retry">
|
|
264
|
+
<di:waypoint x="841" y="145" />
|
|
265
|
+
<di:waypoint x="841" y="280" />
|
|
266
|
+
<di:waypoint x="1516" y="280" />
|
|
267
|
+
<bpmndi:BPMNLabel>
|
|
268
|
+
<dc:Bounds x="846" y="223" width="39" height="14" />
|
|
209
269
|
</bpmndi:BPMNLabel>
|
|
210
270
|
</bpmndi:BPMNEdge>
|
|
211
271
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_answerLoop" bpmnElement="ic_answerLoop">
|
|
212
|
-
<di:waypoint x="
|
|
213
|
-
<di:waypoint x="
|
|
214
|
-
<di:waypoint x="
|
|
272
|
+
<di:waypoint x="1391" y="145" />
|
|
273
|
+
<di:waypoint x="1391" y="280" />
|
|
274
|
+
<di:waypoint x="1516" y="280" />
|
|
215
275
|
<bpmndi:BPMNLabel>
|
|
216
|
-
<dc:Bounds x="
|
|
276
|
+
<dc:Bounds x="1396" y="206" width="49" height="14" />
|
|
217
277
|
</bpmndi:BPMNLabel>
|
|
218
278
|
</bpmndi:BPMNEdge>
|
|
219
279
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_done" bpmnElement="ic_done">
|
|
220
|
-
<di:waypoint x="
|
|
221
|
-
<di:waypoint x="
|
|
222
|
-
<di:waypoint x="
|
|
223
|
-
<di:waypoint x="
|
|
280
|
+
<di:waypoint x="466" y="145" />
|
|
281
|
+
<di:waypoint x="466" y="200" />
|
|
282
|
+
<di:waypoint x="1566" y="200" />
|
|
283
|
+
<di:waypoint x="1566" y="138" />
|
|
224
284
|
<bpmndi:BPMNLabel>
|
|
225
|
-
<dc:Bounds x="
|
|
285
|
+
<dc:Bounds x="1000" y="208" width="32" height="14" />
|
|
226
286
|
</bpmndi:BPMNLabel>
|
|
227
287
|
</bpmndi:BPMNEdge>
|
|
228
288
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_reconciled" bpmnElement="ic_reconciled">
|
|
229
|
-
<di:waypoint x="
|
|
230
|
-
<di:waypoint x="
|
|
231
|
-
<di:waypoint x="
|
|
232
|
-
<di:waypoint x="
|
|
289
|
+
<di:waypoint x="841" y="145" />
|
|
290
|
+
<di:waypoint x="841" y="180" />
|
|
291
|
+
<di:waypoint x="1566" y="180" />
|
|
292
|
+
<di:waypoint x="1566" y="138" />
|
|
293
|
+
<bpmndi:BPMNLabel>
|
|
294
|
+
<dc:Bounds x="1097" y="158" width="53" height="14" />
|
|
295
|
+
</bpmndi:BPMNLabel>
|
|
296
|
+
</bpmndi:BPMNEdge>
|
|
297
|
+
<bpmndi:BPMNEdge id="BPMNEdge_ic_slaToEscalate" bpmnElement="ic_slaToEscalate">
|
|
298
|
+
<di:waypoint x="516" y="440" />
|
|
299
|
+
<di:waypoint x="1636" y="440" />
|
|
300
|
+
<di:waypoint x="1636" y="82" />
|
|
301
|
+
<di:waypoint x="1266" y="82" />
|
|
302
|
+
</bpmndi:BPMNEdge>
|
|
303
|
+
<bpmndi:BPMNEdge id="BPMNEdge_ic_sla" bpmnElement="ic_sla">
|
|
304
|
+
<di:waypoint x="266" y="178" />
|
|
305
|
+
<di:waypoint x="266" y="440" />
|
|
306
|
+
<di:waypoint x="416" y="440" />
|
|
233
307
|
<bpmndi:BPMNLabel>
|
|
234
|
-
<dc:Bounds x="
|
|
308
|
+
<dc:Bounds x="271" y="295" width="70" height="28" />
|
|
235
309
|
</bpmndi:BPMNLabel>
|
|
236
310
|
</bpmndi:BPMNEdge>
|
|
237
311
|
<bpmndi:BPMNEdge id="BPMNEdge_ic_reImplement" bpmnElement="ic_reImplement">
|
|
238
|
-
<di:waypoint x="1516" y="
|
|
239
|
-
<di:waypoint x="
|
|
240
|
-
<di:waypoint x="
|
|
241
|
-
<di:waypoint x="266" y="
|
|
312
|
+
<di:waypoint x="1516" y="280" />
|
|
313
|
+
<di:waypoint x="60" y="280" />
|
|
314
|
+
<di:waypoint x="60" y="60" />
|
|
315
|
+
<di:waypoint x="266" y="60" />
|
|
316
|
+
<di:waypoint x="266" y="80" />
|
|
242
317
|
</bpmndi:BPMNEdge>
|
|
243
318
|
</bpmndi:BPMNPlane>
|
|
244
319
|
</bpmndi:BPMNDiagram>
|
|
@@ -24,6 +24,12 @@
|
|
|
24
24
|
<bpmn:incoming>mc_sla</bpmn:incoming>
|
|
25
25
|
<bpmn:outgoing>mc_toRecord</bpmn:outgoing>
|
|
26
26
|
</bpmn:serviceTask>
|
|
27
|
+
<bpmn:boundaryEvent id="be_trial_agent_sla" name="Agent SLA elapsed" attachedToRef="trial-merge">
|
|
28
|
+
<bpmn:outgoing>mc_agentSla</bpmn:outgoing>
|
|
29
|
+
<bpmn:timerEventDefinition id="ted_trial_agent_sla">
|
|
30
|
+
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">=agentSlaTimeout</bpmn:timeDuration>
|
|
31
|
+
</bpmn:timerEventDefinition>
|
|
32
|
+
</bpmn:boundaryEvent>
|
|
27
33
|
<bpmn:serviceTask id="record-trial-merge" name="Record trial merge">
|
|
28
34
|
<bpmn:extensionElements>
|
|
29
35
|
<zeebe:taskDefinition type="pr.record-trial-merge" />
|
|
@@ -34,8 +40,25 @@
|
|
|
34
40
|
<bpmn:incoming>mc_toRecord</bpmn:incoming>
|
|
35
41
|
<bpmn:outgoing>mc_toGwTrial</bpmn:outgoing>
|
|
36
42
|
</bpmn:serviceTask>
|
|
43
|
+
<bpmn:serviceTask id="record-trial-merge-sla" name="Record trial merge (agent SLA)">
|
|
44
|
+
<bpmn:extensionElements>
|
|
45
|
+
<zeebe:taskDefinition type="pr.record-trial-merge" />
|
|
46
|
+
<zeebe:properties>
|
|
47
|
+
<zeebe:property name="io.nanobpm.dataEnvelope.in" value="RecordTrialMergeIn" />
|
|
48
|
+
</zeebe:properties>
|
|
49
|
+
<zeebe:ioMapping>
|
|
50
|
+
<zeebe:input source="="suite-failed"" target="result" />
|
|
51
|
+
<zeebe:input source="="The trial-merge agent exceeded its time budget (SLA " + agentSlaTimeout + ") without returning a machine-readable result — it is hung or looping. Acknowledge to record the timeout and decide whether to rerun the trial merge."" target="summary" />
|
|
52
|
+
<zeebe:input source="=null" target="conflicts" />
|
|
53
|
+
<zeebe:input source="=null" target="failing" />
|
|
54
|
+
</zeebe:ioMapping>
|
|
55
|
+
</bpmn:extensionElements>
|
|
56
|
+
<bpmn:incoming>mc_agentSla</bpmn:incoming>
|
|
57
|
+
<bpmn:outgoing>mc_slaToGwTrial</bpmn:outgoing>
|
|
58
|
+
</bpmn:serviceTask>
|
|
37
59
|
<bpmn:exclusiveGateway id="gw-trial" name="trial red?" default="mc_proceed">
|
|
38
60
|
<bpmn:incoming>mc_toGwTrial</bpmn:incoming>
|
|
61
|
+
<bpmn:incoming>mc_slaToGwTrial</bpmn:incoming>
|
|
39
62
|
<bpmn:outgoing>mc_escalate</bpmn:outgoing>
|
|
40
63
|
<bpmn:outgoing>mc_proceed</bpmn:outgoing>
|
|
41
64
|
</bpmn:exclusiveGateway>
|
|
@@ -80,6 +103,7 @@
|
|
|
80
103
|
<bpmn:sequenceFlow id="mc_toTrial" sourceRef="Start" targetRef="trial-merge" />
|
|
81
104
|
<bpmn:sequenceFlow id="mc_toRecord" sourceRef="trial-merge" targetRef="record-trial-merge" />
|
|
82
105
|
<bpmn:sequenceFlow id="mc_toGwTrial" sourceRef="record-trial-merge" targetRef="gw-trial" />
|
|
106
|
+
<bpmn:sequenceFlow id="mc_slaToGwTrial" sourceRef="record-trial-merge-sla" targetRef="gw-trial" />
|
|
83
107
|
<bpmn:sequenceFlow id="mc_escalate" name="suite failed" sourceRef="gw-trial" targetRef="trial-merge-decision">
|
|
84
108
|
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=trialMergeRed</bpmn:conditionExpression>
|
|
85
109
|
</bpmn:sequenceFlow>
|
|
@@ -94,6 +118,7 @@
|
|
|
94
118
|
</bpmn:sequenceFlow>
|
|
95
119
|
<bpmn:sequenceFlow id="mc_rerun" name="rebase" sourceRef="gw-trial-answer" targetRef="trial-merge" />
|
|
96
120
|
<bpmn:sequenceFlow id="mc_sla" name="SLA auto-rerun" sourceRef="be_trial_sla" targetRef="trial-merge" />
|
|
121
|
+
<bpmn:sequenceFlow id="mc_agentSla" name="agent SLA elapsed" sourceRef="be_trial_agent_sla" targetRef="record-trial-merge-sla" />
|
|
97
122
|
</bpmn:process>
|
|
98
123
|
<bpmndi:BPMNDiagram id="BPMNDiagram_merge-cell">
|
|
99
124
|
<bpmndi:BPMNPlane id="BPMNPlane_merge-cell" bpmnElement="merge-cell">
|
|
@@ -109,6 +134,9 @@
|
|
|
109
134
|
<bpmndi:BPMNShape id="BPMNShape_record-trial-merge" bpmnElement="record-trial-merge">
|
|
110
135
|
<dc:Bounds x="416" y="80" width="100" height="80" />
|
|
111
136
|
</bpmndi:BPMNShape>
|
|
137
|
+
<bpmndi:BPMNShape id="BPMNShape_record-trial-merge-sla" bpmnElement="record-trial-merge-sla">
|
|
138
|
+
<dc:Bounds x="416" y="400" width="100" height="80" />
|
|
139
|
+
</bpmndi:BPMNShape>
|
|
112
140
|
<bpmndi:BPMNShape id="BPMNShape_gw-trial" bpmnElement="gw-trial" isMarkerVisible="true">
|
|
113
141
|
<dc:Bounds x="616" y="95" width="50" height="50" />
|
|
114
142
|
<bpmndi:BPMNLabel>
|
|
@@ -139,10 +167,16 @@
|
|
|
139
167
|
<dc:Bounds x="1300" y="463" width="69" height="14" />
|
|
140
168
|
</bpmndi:BPMNLabel>
|
|
141
169
|
</bpmndi:BPMNShape>
|
|
170
|
+
<bpmndi:BPMNShape id="BPMNShape_be_trial_agent_sla" bpmnElement="be_trial_agent_sla">
|
|
171
|
+
<dc:Bounds x="248" y="142" width="36" height="36" />
|
|
172
|
+
<bpmndi:BPMNLabel>
|
|
173
|
+
<dc:Bounds x="290" y="183" width="72" height="28" />
|
|
174
|
+
</bpmndi:BPMNLabel>
|
|
175
|
+
</bpmndi:BPMNShape>
|
|
142
176
|
<bpmndi:BPMNShape id="BPMNShape_be_trial_sla" bpmnElement="be_trial_sla">
|
|
143
177
|
<dc:Bounds x="798" y="302" width="36" height="36" />
|
|
144
178
|
<bpmndi:BPMNLabel>
|
|
145
|
-
<dc:Bounds x="
|
|
179
|
+
<dc:Bounds x="714" y="343" width="84" height="14" />
|
|
146
180
|
</bpmndi:BPMNLabel>
|
|
147
181
|
</bpmndi:BPMNShape>
|
|
148
182
|
<bpmndi:BPMNEdge id="BPMNEdge_mc_toTrial" bpmnElement="mc_toTrial">
|
|
@@ -165,12 +199,12 @@
|
|
|
165
199
|
</bpmndi:BPMNLabel>
|
|
166
200
|
</bpmndi:BPMNEdge>
|
|
167
201
|
<bpmndi:BPMNEdge id="BPMNEdge_mc_rerun" bpmnElement="mc_rerun">
|
|
168
|
-
<di:waypoint x="1191" y="
|
|
169
|
-
<di:waypoint x="1191" y="
|
|
170
|
-
<di:waypoint x="266" y="
|
|
171
|
-
<di:waypoint x="266" y="
|
|
202
|
+
<di:waypoint x="1191" y="255" />
|
|
203
|
+
<di:waypoint x="1191" y="60" />
|
|
204
|
+
<di:waypoint x="266" y="60" />
|
|
205
|
+
<di:waypoint x="266" y="80" />
|
|
172
206
|
<bpmndi:BPMNLabel>
|
|
173
|
-
<dc:Bounds x="706" y="
|
|
207
|
+
<dc:Bounds x="706" y="38" width="46" height="14" />
|
|
174
208
|
</bpmndi:BPMNLabel>
|
|
175
209
|
</bpmndi:BPMNEdge>
|
|
176
210
|
<bpmndi:BPMNEdge id="BPMNEdge_mc_escalate" bpmnElement="mc_escalate">
|
|
@@ -178,7 +212,7 @@
|
|
|
178
212
|
<di:waypoint x="641" y="280" />
|
|
179
213
|
<di:waypoint x="766" y="280" />
|
|
180
214
|
<bpmndi:BPMNLabel>
|
|
181
|
-
<dc:Bounds x="646" y="
|
|
215
|
+
<dc:Bounds x="646" y="216" width="85" height="14" />
|
|
182
216
|
</bpmndi:BPMNLabel>
|
|
183
217
|
</bpmndi:BPMNEdge>
|
|
184
218
|
<bpmndi:BPMNEdge id="BPMNEdge_mc_answerProceed" bpmnElement="mc_answerProceed">
|
|
@@ -194,9 +228,15 @@
|
|
|
194
228
|
<di:waypoint x="1191" y="440" />
|
|
195
229
|
<di:waypoint x="1316" y="440" />
|
|
196
230
|
<bpmndi:BPMNLabel>
|
|
197
|
-
<dc:Bounds x="1196" y="
|
|
231
|
+
<dc:Bounds x="1196" y="366" width="53" height="14" />
|
|
198
232
|
</bpmndi:BPMNLabel>
|
|
199
233
|
</bpmndi:BPMNEdge>
|
|
234
|
+
<bpmndi:BPMNEdge id="BPMNEdge_mc_slaToGwTrial" bpmnElement="mc_slaToGwTrial">
|
|
235
|
+
<di:waypoint x="466" y="400" />
|
|
236
|
+
<di:waypoint x="466" y="165" />
|
|
237
|
+
<di:waypoint x="641" y="165" />
|
|
238
|
+
<di:waypoint x="641" y="145" />
|
|
239
|
+
</bpmndi:BPMNEdge>
|
|
200
240
|
<bpmndi:BPMNEdge id="BPMNEdge_mc_toResolve" bpmnElement="mc_toResolve">
|
|
201
241
|
<di:waypoint x="866" y="280" />
|
|
202
242
|
<di:waypoint x="966" y="280" />
|
|
@@ -205,13 +245,21 @@
|
|
|
205
245
|
<di:waypoint x="1066" y="280" />
|
|
206
246
|
<di:waypoint x="1166" y="280" />
|
|
207
247
|
</bpmndi:BPMNEdge>
|
|
248
|
+
<bpmndi:BPMNEdge id="BPMNEdge_mc_agentSla" bpmnElement="mc_agentSla">
|
|
249
|
+
<di:waypoint x="266" y="178" />
|
|
250
|
+
<di:waypoint x="266" y="440" />
|
|
251
|
+
<di:waypoint x="416" y="440" />
|
|
252
|
+
<bpmndi:BPMNLabel>
|
|
253
|
+
<dc:Bounds x="271" y="295" width="70" height="28" />
|
|
254
|
+
</bpmndi:BPMNLabel>
|
|
255
|
+
</bpmndi:BPMNEdge>
|
|
208
256
|
<bpmndi:BPMNEdge id="BPMNEdge_mc_sla" bpmnElement="mc_sla">
|
|
209
257
|
<di:waypoint x="816" y="338" />
|
|
210
|
-
<di:waypoint x="816" y="
|
|
211
|
-
<di:waypoint x="
|
|
212
|
-
<di:waypoint x="
|
|
258
|
+
<di:waypoint x="816" y="498" />
|
|
259
|
+
<di:waypoint x="241" y="498" />
|
|
260
|
+
<di:waypoint x="241" y="160" />
|
|
213
261
|
<bpmndi:BPMNLabel>
|
|
214
|
-
<dc:Bounds x="
|
|
262
|
+
<dc:Bounds x="492" y="503" width="74" height="28" />
|
|
215
263
|
</bpmndi:BPMNLabel>
|
|
216
264
|
</bpmndi:BPMNEdge>
|
|
217
265
|
</bpmndi:BPMNPlane>
|