@nanobpm/nano-workforce 0.70.1 → 0.70.2

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 CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.70.2](https://github.com/nanobpm/nano-workforce/compare/v0.70.1...v0.70.2) (2026-08-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **merge-loop:** add agent-task liveness SLA backstop for rebase/fix-ci ([#237](https://github.com/nanobpm/nano-workforce/issues/237)) ([c77cdca](https://github.com/nanobpm/nano-workforce/commit/c77cdca974a1e53ef2f9757cc5cedf95068713f1))
7
+
1
8
  ## [0.70.1](https://github.com/nanobpm/nano-workforce/compare/v0.70.0...v0.70.1) (2026-08-15)
2
9
 
3
10
 
@@ -0,0 +1,39 @@
1
+ // Unit coverage for the agent-task liveness SLA duration policy. The value is baked into every
2
+ // merge-loop instance's `agentSlaTimeout` process variable and evaluated by the rebase / fix-ci
3
+ // agent tasks' interrupting timer boundary, so a malformed operator env must never deploy an
4
+ // uninterpretable `<bpmn:timeDuration>` — it falls back to the default instead. Run with
5
+ // `node --test`.
6
+
7
+ import assert from "node:assert/strict";
8
+ import { test } from "node:test";
9
+ import { agentSlaTimeout, DEFAULT_AGENT_SLA_TIMEOUT } from "./agentSla.ts";
10
+
11
+ test("agentSlaTimeout: blank / absent / malformed → default", () => {
12
+ assert.equal(agentSlaTimeout(undefined), DEFAULT_AGENT_SLA_TIMEOUT);
13
+ assert.equal(agentSlaTimeout(""), DEFAULT_AGENT_SLA_TIMEOUT);
14
+ assert.equal(agentSlaTimeout(" "), DEFAULT_AGENT_SLA_TIMEOUT);
15
+ assert.equal(agentSlaTimeout("2h"), DEFAULT_AGENT_SLA_TIMEOUT); // missing leading P/T
16
+ assert.equal(agentSlaTimeout("P"), DEFAULT_AGENT_SLA_TIMEOUT); // no component
17
+ assert.equal(agentSlaTimeout("PT"), DEFAULT_AGENT_SLA_TIMEOUT); // T with no time part
18
+ assert.equal(agentSlaTimeout("garbage"), DEFAULT_AGENT_SLA_TIMEOUT);
19
+ });
20
+
21
+ test("agentSlaTimeout: a valid ISO-8601 duration is honoured and upper-cased", () => {
22
+ assert.equal(agentSlaTimeout("PT30M"), "PT30M");
23
+ assert.equal(agentSlaTimeout("pt4h"), "PT4H");
24
+ assert.equal(agentSlaTimeout("P1D"), "P1D");
25
+ assert.equal(agentSlaTimeout(" pt90m "), "PT90M");
26
+ });
27
+
28
+ test("agentSlaTimeout: an explicit fallback is honoured for a bad value", () => {
29
+ assert.equal(agentSlaTimeout("nope", "PT10M"), "PT10M");
30
+ assert.equal(agentSlaTimeout("PT45M", "PT10M"), "PT45M");
31
+ });
32
+
33
+ test("the default is itself a well-formed ISO-8601 duration (never an uninterpretable timer)", () => {
34
+ // Validate the default against the grammar with a *distinct* fallback: if the default were
35
+ // malformed it would fall through to the sentinel, so equality to itself proves it parses.
36
+ const sentinel = "PT1S";
37
+ assert.notEqual(DEFAULT_AGENT_SLA_TIMEOUT, sentinel);
38
+ assert.equal(agentSlaTimeout(DEFAULT_AGENT_SLA_TIMEOUT, sentinel), DEFAULT_AGENT_SLA_TIMEOUT);
39
+ });
@@ -0,0 +1,33 @@
1
+ // Agent-task liveness SLA policy — kept as a pure module (no env, no I/O) so it is trivially
2
+ // testable, mirroring app/escalationSla.ts. `app/service.ts` seeds the validated `agentSlaTimeout`
3
+ // process variable when it starts the merge-loop; the merge-loop's AGENT service tasks (rebase,
4
+ // fix-ci) carry an interrupting timer boundary whose `<bpmn:timeDuration>=agentSlaTimeout` evaluates
5
+ // it at timer creation (FEEL-expression timer durations, engine-native).
6
+ //
7
+ // This closes the agent-task liveness gap: unlike an escalation *user* task (whose SLA the
8
+ // escalationSla policy already bounds), an AGENT service task has no human in the loop — if no
9
+ // worker holds its capability, or the agent hangs/crashes without failing the job, the token parks
10
+ // on the task forever (no incident, no escalation). The boundary timer makes that impossible: when
11
+ // the SLA elapses the boundary fires, cancels the stuck job, and routes the token to the existing
12
+ // merge escalation so a human is pulled in. It is a durable, in-process backstop — no external
13
+ // watchdog required.
14
+
15
+ import { isoDuration } from "./reviewWait.ts";
16
+
17
+ /** Default agent-task SLA (ISO-8601 duration): how long a merge-loop agent service task (rebase /
18
+ * fix-ci) may sit without completing before its interrupting timer boundary fires and the process
19
+ * escalates for human attention. Deliberately much shorter than the human-decision escalation SLA
20
+ * (PT24H): an agent that has not even started (unstaffed capability) or is stuck should surface to a
21
+ * human quickly, while still being generous enough not to interrupt a legitimately long rebase. */
22
+ export const DEFAULT_AGENT_SLA_TIMEOUT = "PT2H";
23
+
24
+ /** Validate the operator-supplied agent SLA (env `NANO_PR_AGENT_SLA_TIMEOUT`, ISO-8601 duration),
25
+ * falling back to {@link DEFAULT_AGENT_SLA_TIMEOUT} when absent, blank, or malformed — a bad env
26
+ * value must never deploy an uninterpretable timer expression. Derives its validation from the
27
+ * single canonical {@link isoDuration}. */
28
+ export function agentSlaTimeout(
29
+ raw: string | undefined,
30
+ def: string = DEFAULT_AGENT_SLA_TIMEOUT,
31
+ ): string {
32
+ return isoDuration(raw, def);
33
+ }
package/app/service.ts CHANGED
@@ -9,6 +9,7 @@
9
9
  // `Table<T>` surface), not hand-written SQL. Row shapes are declared inline here.
10
10
  import type { DataLayer, EngineClient } from "@nanobpm/urban";
11
11
  import { abandonUrl, mintAbandonToken, renderAbandonBrief } from "./abandon.ts";
12
+ import { agentSlaTimeout } from "./agentSla.ts";
12
13
  import { deriveFeatureBlockedPatch, deriveFeatureDelivery, deriveFeatureEscalationPatch, FEATURE_BLOCKED_ELEMENT, FEATURE_ESCALATION_ELEMENT, type FeatureRun, featureRuns } from "./feature.ts";
13
14
  import {
14
15
  classifyMergeability,
@@ -58,6 +59,14 @@ export const MAX_CI_FIX_ROUNDS = clampCiFixBudget(process.env.NANO_PR_MAX_CI_FIX
58
59
  * immediately). Reuses the CI-fix budget clamp (allows 0 = disable, ceiling-capped). */
59
60
  export const MAX_REBASE_ROUNDS = clampCiFixBudget(process.env.NANO_PR_MAX_REBASE_ROUNDS, 3);
60
61
 
62
+ /** How long a merge-loop AGENT service task (rebase / fix-ci) may sit without completing before its
63
+ * interrupting timer boundary fires and the PR escalates for human attention. Seeded as the
64
+ * `agentSlaTimeout` process variable at merge start and evaluated by those tasks' boundary timers.
65
+ * Unlike a human-decision escalation (PT24H), an agent task has no human in the loop — if its
66
+ * capability is unstaffed or the agent hangs/crashes without failing the job, the token would
67
+ * otherwise park forever. Override with `NANO_PR_AGENT_SLA_TIMEOUT` (ISO-8601 duration). */
68
+ export const AGENT_SLA_TIMEOUT = agentSlaTimeout(process.env.NANO_PR_AGENT_SLA_TIMEOUT);
69
+
61
70
  /** How long the convergence loop waits for a fresh review before escalating to a human. Seeded as
62
71
  * the `reviewWaitTimeout` process variable at submit and evaluated by the process's
63
72
  * `wait-review-timeout` timer catch (the timer arm of the event-based-gateway race against
@@ -531,6 +540,7 @@ export async function startMerge(
531
540
  ciFixMax: MAX_CI_FIX_ROUNDS,
532
541
  rebaseRound: 0,
533
542
  rebaseMax: MAX_REBASE_ROUNDS,
543
+ agentSlaTimeout: AGENT_SLA_TIMEOUT,
534
544
  abandonUrl: abUrl,
535
545
  abandonBrief: renderAbandonBrief(abUrl),
536
546
  // Host-git provisioning (c8ctl): same repository envelope as the convergence loop, so the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanobpm/nano-workforce",
3
- "version": "0.70.1",
3
+ "version": "0.70.2",
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",
@@ -189,6 +189,7 @@
189
189
  <bpmn:incoming>f_m_mBlocked</bpmn:incoming>
190
190
  <bpmn:incoming>f_ci_giveup</bpmn:incoming>
191
191
  <bpmn:incoming>f_reb_giveup</bpmn:incoming>
192
+ <bpmn:incoming>f_reb_sla</bpmn:incoming>
192
193
  <bpmn:outgoing>f_m_escC</bpmn:outgoing>
193
194
  </bpmn:serviceTask>
194
195
  <bpmn:serviceTask id="merge-esc-attempt" name="Escalate: merge blocked">
@@ -202,6 +203,7 @@
202
203
  <bpmn:incoming>f_m_gBlocked</bpmn:incoming>
203
204
  <bpmn:incoming>f_ci_blocked</bpmn:incoming>
204
205
  <bpmn:incoming>f_reb_blocked</bpmn:incoming>
206
+ <bpmn:incoming>f_ci_sla</bpmn:incoming>
205
207
  <bpmn:outgoing>f_m_escA</bpmn:outgoing>
206
208
  </bpmn:serviceTask>
207
209
  <bpmn:intermediateCatchEvent id="wait-merge-answer" name="Wait: escalation answered">
@@ -233,6 +235,12 @@
233
235
  <bpmn:incoming>f_ci_go</bpmn:incoming>
234
236
  <bpmn:outgoing>f_ci_done</bpmn:outgoing>
235
237
  </bpmn:serviceTask>
238
+ <bpmn:boundaryEvent id="be_fixci_sla" name="SLA elapsed" attachedToRef="fix-ci">
239
+ <bpmn:outgoing>f_ci_sla</bpmn:outgoing>
240
+ <bpmn:timerEventDefinition id="ted_fixci_sla">
241
+ <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">=agentSlaTimeout</bpmn:timeDuration>
242
+ </bpmn:timerEventDefinition>
243
+ </bpmn:boundaryEvent>
236
244
  <bpmn:exclusiveGateway id="gw-ci-result" name="fixed?" default="f_ci_reconcile">
237
245
  <bpmn:incoming>f_ci_done</bpmn:incoming>
238
246
  <bpmn:outgoing>f_ci_fixed</bpmn:outgoing>
@@ -263,6 +271,12 @@
263
271
  <bpmn:incoming>f_reb_go</bpmn:incoming>
264
272
  <bpmn:outgoing>f_reb_done</bpmn:outgoing>
265
273
  </bpmn:serviceTask>
274
+ <bpmn:boundaryEvent id="be_rebase_sla" name="SLA elapsed" attachedToRef="rebase">
275
+ <bpmn:outgoing>f_reb_sla</bpmn:outgoing>
276
+ <bpmn:timerEventDefinition id="ted_rebase_sla">
277
+ <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">=agentSlaTimeout</bpmn:timeDuration>
278
+ </bpmn:timerEventDefinition>
279
+ </bpmn:boundaryEvent>
266
280
  <bpmn:exclusiveGateway id="gw-rebase-result" name="rebased?" default="f_reb_reconcile">
267
281
  <bpmn:incoming>f_reb_done</bpmn:incoming>
268
282
  <bpmn:outgoing>f_reb_rebased</bpmn:outgoing>
@@ -342,6 +356,8 @@
342
356
  <bpmn:sequenceFlow id="f_m_escC" sourceRef="merge-esc-conflict" targetRef="wait-merge-answer" />
343
357
  <bpmn:sequenceFlow id="f_m_escA" sourceRef="merge-esc-attempt" targetRef="wait-merge-answer" />
344
358
  <bpmn:sequenceFlow id="f_m_answer" sourceRef="wait-merge-answer" targetRef="arm-merge" />
359
+ <bpmn:sequenceFlow id="f_reb_sla" name="agent SLA elapsed" sourceRef="be_rebase_sla" targetRef="merge-esc-conflict" />
360
+ <bpmn:sequenceFlow id="f_ci_sla" name="agent SLA elapsed" sourceRef="be_fixci_sla" targetRef="merge-esc-attempt" />
345
361
  </bpmn:process>
346
362
  <bpmndi:BPMNDiagram id="BPMNDiagram_merge-loop">
347
363
  <bpmndi:BPMNPlane id="BPMNPlane_merge-loop" bpmnElement="merge-loop">
@@ -382,57 +398,57 @@
382
398
  </bpmndi:BPMNLabel>
383
399
  </bpmndi:BPMNShape>
384
400
  <bpmndi:BPMNShape id="BPMNShape_eg-landed" bpmnElement="eg-landed" isMarkerVisible="true">
385
- <dc:Bounds x="1238" y="255" width="50" height="50" />
401
+ <dc:Bounds x="1263" y="255" width="50" height="50" />
386
402
  <bpmndi:BPMNLabel>
387
- <dc:Bounds x="1231" y="222" width="64" height="28" />
403
+ <dc:Bounds x="1256" y="222" width="64" height="28" />
388
404
  </bpmndi:BPMNLabel>
389
405
  </bpmndi:BPMNShape>
390
406
  <bpmndi:BPMNShape id="BPMNShape_wait-landed" bpmnElement="wait-landed">
391
- <dc:Bounds x="1420" y="262" width="36" height="36" />
407
+ <dc:Bounds x="1470" y="262" width="36" height="36" />
392
408
  <bpmndi:BPMNLabel>
393
- <dc:Bounds x="1396" y="229" width="85" height="28" />
409
+ <dc:Bounds x="1446" y="229" width="85" height="28" />
394
410
  </bpmndi:BPMNLabel>
395
411
  </bpmndi:BPMNShape>
396
412
  <bpmndi:BPMNShape id="BPMNShape_wait-evicted" bpmnElement="wait-evicted">
397
- <dc:Bounds x="1420" y="422" width="36" height="36" />
413
+ <dc:Bounds x="1470" y="422" width="36" height="36" />
398
414
  <bpmndi:BPMNLabel>
399
- <dc:Bounds x="1394" y="375" width="88" height="42" />
415
+ <dc:Bounds x="1444" y="375" width="88" height="42" />
400
416
  </bpmndi:BPMNLabel>
401
417
  </bpmndi:BPMNShape>
402
418
  <bpmndi:BPMNShape id="BPMNShape_mark-merged" bpmnElement="mark-merged">
403
- <dc:Bounds x="1588" y="80" width="100" height="80" />
419
+ <dc:Bounds x="1638" y="80" width="100" height="80" />
404
420
  </bpmndi:BPMNShape>
405
421
  <bpmndi:BPMNShape id="BPMNShape_MergeEnd" bpmnElement="MergeEnd">
406
- <dc:Bounds x="1788" y="102" width="36" height="36" />
422
+ <dc:Bounds x="1838" y="102" width="36" height="36" />
407
423
  <bpmndi:BPMNLabel>
408
- <dc:Bounds x="1781" y="143" width="50" height="14" />
424
+ <dc:Bounds x="1831" y="143" width="50" height="14" />
409
425
  </bpmndi:BPMNLabel>
410
426
  </bpmndi:BPMNShape>
411
427
  <bpmndi:BPMNShape id="BPMNShape_merge-esc-conflict" bpmnElement="merge-esc-conflict">
412
- <dc:Bounds x="1038" y="720" width="100" height="80" />
428
+ <dc:Bounds x="1238" y="1520" width="100" height="80" />
413
429
  </bpmndi:BPMNShape>
414
430
  <bpmndi:BPMNShape id="BPMNShape_merge-esc-attempt" bpmnElement="merge-esc-attempt">
415
- <dc:Bounds x="1388" y="560" width="100" height="80" />
431
+ <dc:Bounds x="1438" y="1040" width="100" height="80" />
416
432
  </bpmndi:BPMNShape>
417
433
  <bpmndi:BPMNShape id="BPMNShape_wait-merge-answer" bpmnElement="wait-merge-answer">
418
- <dc:Bounds x="1620" y="582" width="36" height="36" />
434
+ <dc:Bounds x="1670" y="1062" width="36" height="36" />
419
435
  <bpmndi:BPMNLabel>
420
- <dc:Bounds x="1541" y="683" width="74" height="42" />
436
+ <dc:Bounds x="1731" y="1103" width="74" height="42" />
421
437
  </bpmndi:BPMNLabel>
422
438
  </bpmndi:BPMNShape>
423
439
  <bpmndi:BPMNShape id="BPMNShape_gw-ci-fix" bpmnElement="gw-ci-fix" isMarkerVisible="true">
424
- <dc:Bounds x="863" y="735" width="50" height="50" />
440
+ <dc:Bounds x="863" y="1535" width="50" height="50" />
425
441
  <bpmndi:BPMNLabel>
426
- <dc:Bounds x="844" y="716" width="89" height="14" />
442
+ <dc:Bounds x="769" y="1553" width="89" height="14" />
427
443
  </bpmndi:BPMNLabel>
428
444
  </bpmndi:BPMNShape>
429
445
  <bpmndi:BPMNShape id="BPMNShape_fix-ci" bpmnElement="fix-ci">
430
- <dc:Bounds x="1038" y="880" width="100" height="80" />
446
+ <dc:Bounds x="1038" y="560" width="100" height="80" />
431
447
  </bpmndi:BPMNShape>
432
448
  <bpmndi:BPMNShape id="BPMNShape_gw-ci-result" bpmnElement="gw-ci-result" isMarkerVisible="true">
433
- <dc:Bounds x="1238" y="895" width="50" height="50" />
449
+ <dc:Bounds x="1263" y="575" width="50" height="50" />
434
450
  <bpmndi:BPMNLabel>
435
- <dc:Bounds x="1240" y="876" width="46" height="14" />
451
+ <dc:Bounds x="1225" y="630" width="46" height="14" />
436
452
  </bpmndi:BPMNLabel>
437
453
  </bpmndi:BPMNShape>
438
454
  <bpmndi:BPMNShape id="BPMNShape_gw-rebase" bpmnElement="gw-rebase" isMarkerVisible="true">
@@ -442,16 +458,28 @@
442
458
  </bpmndi:BPMNLabel>
443
459
  </bpmndi:BPMNShape>
444
460
  <bpmndi:BPMNShape id="BPMNShape_rebase" bpmnElement="rebase">
445
- <dc:Bounds x="1038" y="1200" width="100" height="80" />
461
+ <dc:Bounds x="1038" y="880" width="100" height="80" />
446
462
  </bpmndi:BPMNShape>
447
463
  <bpmndi:BPMNShape id="BPMNShape_gw-rebase-result" bpmnElement="gw-rebase-result" isMarkerVisible="true">
448
- <dc:Bounds x="1238" y="1215" width="50" height="50" />
464
+ <dc:Bounds x="1263" y="895" width="50" height="50" />
449
465
  <bpmndi:BPMNLabel>
450
- <dc:Bounds x="1193" y="1270" width="60" height="14" />
466
+ <dc:Bounds x="1218" y="950" width="60" height="14" />
451
467
  </bpmndi:BPMNLabel>
452
468
  </bpmndi:BPMNShape>
453
469
  <bpmndi:BPMNShape id="BPMNShape_record-merge-dep" bpmnElement="record-merge-dep">
454
- <dc:Bounds x="1388" y="1040" width="100" height="80" />
470
+ <dc:Bounds x="1438" y="720" width="100" height="80" />
471
+ </bpmndi:BPMNShape>
472
+ <bpmndi:BPMNShape id="BPMNShape_be_fixci_sla" bpmnElement="be_fixci_sla">
473
+ <dc:Bounds x="1070" y="622" width="36" height="36" />
474
+ <bpmndi:BPMNLabel>
475
+ <dc:Bounds x="1046" y="703" width="84" height="14" />
476
+ </bpmndi:BPMNLabel>
477
+ </bpmndi:BPMNShape>
478
+ <bpmndi:BPMNShape id="BPMNShape_be_rebase_sla" bpmnElement="be_rebase_sla">
479
+ <dc:Bounds x="1070" y="942" width="36" height="36" />
480
+ <bpmndi:BPMNLabel>
481
+ <dc:Bounds x="1046" y="1043" width="84" height="14" />
482
+ </bpmndi:BPMNLabel>
455
483
  </bpmndi:BPMNShape>
456
484
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_start" bpmnElement="f_m_start">
457
485
  <di:waypoint x="116" y="120" />
@@ -482,74 +510,83 @@
482
510
  </bpmndi:BPMNEdge>
483
511
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_gMerged" bpmnElement="f_m_gMerged">
484
512
  <di:waypoint x="1113" y="120" />
485
- <di:waypoint x="1588" y="120" />
513
+ <di:waypoint x="1638" y="120" />
486
514
  <bpmndi:BPMNLabel>
487
- <dc:Bounds x="1326" y="98" width="49" height="14" />
515
+ <dc:Bounds x="1351" y="98" width="49" height="14" />
488
516
  </bpmndi:BPMNLabel>
489
517
  </bpmndi:BPMNEdge>
490
518
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_done" bpmnElement="f_m_done">
491
- <di:waypoint x="1688" y="120" />
492
- <di:waypoint x="1788" y="120" />
519
+ <di:waypoint x="1738" y="120" />
520
+ <di:waypoint x="1838" y="120" />
493
521
  </bpmndi:BPMNEdge>
494
522
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_giveup" bpmnElement="f_ci_giveup">
495
- <di:waypoint x="913" y="760" />
496
- <di:waypoint x="1038" y="760" />
523
+ <di:waypoint x="913" y="1560" />
524
+ <di:waypoint x="1238" y="1560" />
497
525
  <bpmndi:BPMNLabel>
498
- <dc:Bounds x="942" y="765" width="67" height="28" />
526
+ <dc:Bounds x="1032" y="1527" width="67" height="28" />
499
527
  </bpmndi:BPMNLabel>
500
528
  </bpmndi:BPMNEdge>
501
529
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_reconcile" bpmnElement="f_ci_reconcile">
502
- <di:waypoint x="1263" y="945" />
503
- <di:waypoint x="1263" y="980" />
504
- <di:waypoint x="402" y="980" />
530
+ <di:waypoint x="1288" y="625" />
531
+ <di:waypoint x="1288" y="680" />
532
+ <di:waypoint x="402" y="680" />
505
533
  <di:waypoint x="402" y="160" />
506
534
  <bpmndi:BPMNLabel>
507
- <dc:Bounds x="792" y="919" width="82" height="56" />
535
+ <dc:Bounds x="804" y="619" width="82" height="56" />
508
536
  </bpmndi:BPMNLabel>
509
537
  </bpmndi:BPMNEdge>
510
538
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_giveup" bpmnElement="f_reb_giveup">
511
539
  <di:waypoint x="913" y="280" />
512
- <di:waypoint x="1088" y="280" />
513
- <di:waypoint x="1088" y="720" />
540
+ <di:waypoint x="933" y="280" />
541
+ <di:waypoint x="933" y="305" />
542
+ <di:waypoint x="1333" y="305" />
543
+ <di:waypoint x="1333" y="1500" />
544
+ <di:waypoint x="1288" y="1500" />
545
+ <di:waypoint x="1288" y="1520" />
514
546
  <bpmndi:BPMNLabel>
515
- <dc:Bounds x="977" y="247" width="67" height="28" />
547
+ <dc:Bounds x="1338" y="1246" width="67" height="28" />
516
548
  </bpmndi:BPMNLabel>
517
549
  </bpmndi:BPMNEdge>
518
550
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_reconcile" bpmnElement="f_reb_reconcile">
519
- <di:waypoint x="1263" y="1265" />
520
- <di:waypoint x="1263" y="1300" />
521
- <di:waypoint x="402" y="1300" />
551
+ <di:waypoint x="1288" y="945" />
552
+ <di:waypoint x="1288" y="1000" />
553
+ <di:waypoint x="402" y="1000" />
522
554
  <di:waypoint x="402" y="160" />
523
555
  <bpmndi:BPMNLabel>
524
- <dc:Bounds x="792" y="1239" width="82" height="56" />
556
+ <dc:Bounds x="804" y="939" width="82" height="56" />
525
557
  </bpmndi:BPMNLabel>
526
558
  </bpmndi:BPMNEdge>
527
559
  <bpmndi:BPMNEdge id="BPMNEdge_f_eg_landed" bpmnElement="f_eg_landed">
528
- <di:waypoint x="1288" y="280" />
529
- <di:waypoint x="1420" y="280" />
560
+ <di:waypoint x="1313" y="280" />
561
+ <di:waypoint x="1470" y="280" />
530
562
  </bpmndi:BPMNEdge>
531
563
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_landed" bpmnElement="f_m_landed">
532
- <di:waypoint x="1456" y="280" />
533
- <di:waypoint x="1638" y="280" />
534
- <di:waypoint x="1638" y="160" />
564
+ <di:waypoint x="1506" y="280" />
565
+ <di:waypoint x="1688" y="280" />
566
+ <di:waypoint x="1688" y="160" />
535
567
  </bpmndi:BPMNEdge>
536
568
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_escC" bpmnElement="f_m_escC">
537
- <di:waypoint x="1138" y="760" />
538
- <di:waypoint x="1638" y="760" />
539
- <di:waypoint x="1638" y="618" />
569
+ <di:waypoint x="1338" y="1560" />
570
+ <di:waypoint x="1688" y="1560" />
571
+ <di:waypoint x="1688" y="1098" />
540
572
  </bpmndi:BPMNEdge>
541
573
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_answer" bpmnElement="f_m_answer">
542
- <di:waypoint x="1638" y="618" />
543
- <di:waypoint x="1638" y="660" />
544
- <di:waypoint x="402" y="660" />
574
+ <di:waypoint x="1688" y="1098" />
575
+ <di:waypoint x="1688" y="1140" />
576
+ <di:waypoint x="402" y="1140" />
545
577
  <di:waypoint x="402" y="160" />
546
578
  </bpmndi:BPMNEdge>
547
579
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_mCiFix" bpmnElement="f_m_mCiFix">
548
580
  <di:waypoint x="713" y="145" />
549
- <di:waypoint x="713" y="760" />
550
- <di:waypoint x="863" y="760" />
581
+ <di:waypoint x="713" y="318" />
582
+ <di:waypoint x="1358" y="318" />
583
+ <di:waypoint x="1358" y="1020" />
584
+ <di:waypoint x="863" y="1020" />
585
+ <di:waypoint x="863" y="1515" />
586
+ <di:waypoint x="888" y="1515" />
587
+ <di:waypoint x="888" y="1535" />
551
588
  <bpmndi:BPMNLabel>
552
- <dc:Bounds x="718" y="518" width="60" height="42" />
589
+ <dc:Bounds x="971" y="1025" width="60" height="42" />
553
590
  </bpmndi:BPMNLabel>
554
591
  </bpmndi:BPMNEdge>
555
592
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_mRebase" bpmnElement="f_m_mRebase">
@@ -563,137 +600,162 @@
563
600
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_mBlocked" bpmnElement="f_m_mBlocked">
564
601
  <di:waypoint x="713" y="145" />
565
602
  <di:waypoint x="713" y="318" />
566
- <di:waypoint x="1018" y="318" />
567
- <di:waypoint x="1018" y="740" />
568
- <di:waypoint x="1038" y="740" />
603
+ <di:waypoint x="1333" y="318" />
604
+ <di:waypoint x="1333" y="1020" />
605
+ <di:waypoint x="1218" y="1020" />
606
+ <di:waypoint x="1218" y="1540" />
607
+ <di:waypoint x="1238" y="1540" />
569
608
  <bpmndi:BPMNLabel>
570
- <dc:Bounds x="823" y="326" width="85" height="14" />
609
+ <dc:Bounds x="1243" y="702" width="85" height="14" />
571
610
  </bpmndi:BPMNLabel>
572
611
  </bpmndi:BPMNEdge>
573
612
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_go" bpmnElement="f_ci_go">
574
- <di:waypoint x="888" y="785" />
575
- <di:waypoint x="888" y="920" />
576
- <di:waypoint x="1038" y="920" />
613
+ <di:waypoint x="888" y="1585" />
614
+ <di:waypoint x="888" y="1605" />
615
+ <di:waypoint x="1726" y="1605" />
616
+ <di:waypoint x="1726" y="555" />
617
+ <di:waypoint x="1018" y="555" />
618
+ <di:waypoint x="1018" y="580" />
619
+ <di:waypoint x="1038" y="580" />
577
620
  <bpmndi:BPMNLabel>
578
- <dc:Bounds x="893" y="839" width="49" height="28" />
621
+ <dc:Bounds x="1731" y="1046" width="49" height="28" />
579
622
  </bpmndi:BPMNLabel>
580
623
  </bpmndi:BPMNEdge>
581
624
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_blocked" bpmnElement="f_ci_blocked">
582
- <di:waypoint x="1288" y="920" />
583
- <di:waypoint x="1308" y="920" />
584
- <di:waypoint x="1308" y="895" />
585
- <di:waypoint x="1676" y="895" />
586
- <di:waypoint x="1676" y="562" />
587
- <di:waypoint x="1488" y="562" />
625
+ <di:waypoint x="1313" y="600" />
626
+ <di:waypoint x="1418" y="600" />
627
+ <di:waypoint x="1418" y="1080" />
628
+ <di:waypoint x="1438" y="1080" />
588
629
  <bpmndi:BPMNLabel>
589
- <dc:Bounds x="1448" y="873" width="89" height="14" />
630
+ <dc:Bounds x="1423" y="863" width="89" height="14" />
590
631
  </bpmndi:BPMNLabel>
591
632
  </bpmndi:BPMNEdge>
592
633
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_wait" bpmnElement="f_ci_wait">
593
- <di:waypoint x="1263" y="945" />
594
- <di:waypoint x="1263" y="1080" />
595
- <di:waypoint x="1388" y="1080" />
634
+ <di:waypoint x="1313" y="600" />
635
+ <di:waypoint x="1488" y="600" />
636
+ <di:waypoint x="1488" y="720" />
596
637
  <bpmndi:BPMNLabel>
597
- <dc:Bounds x="1268" y="1016" width="75" height="28" />
638
+ <dc:Bounds x="1416" y="567" width="75" height="28" />
598
639
  </bpmndi:BPMNLabel>
599
640
  </bpmndi:BPMNEdge>
600
641
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_go" bpmnElement="f_reb_go">
601
642
  <di:waypoint x="913" y="280" />
602
643
  <di:waypoint x="933" y="280" />
603
644
  <di:waypoint x="933" y="305" />
604
- <di:waypoint x="1708" y="305" />
605
- <di:waypoint x="1708" y="1140" />
606
- <di:waypoint x="1018" y="1140" />
607
- <di:waypoint x="1018" y="1220" />
608
- <di:waypoint x="1038" y="1220" />
645
+ <di:waypoint x="1558" y="305" />
646
+ <di:waypoint x="1558" y="1500" />
647
+ <di:waypoint x="1418" y="1500" />
648
+ <di:waypoint x="1418" y="875" />
649
+ <di:waypoint x="1018" y="875" />
650
+ <di:waypoint x="1018" y="900" />
651
+ <di:waypoint x="1038" y="900" />
609
652
  <bpmndi:BPMNLabel>
610
- <dc:Bounds x="1713" y="709" width="49" height="28" />
653
+ <dc:Bounds x="1464" y="1467" width="49" height="28" />
611
654
  </bpmndi:BPMNLabel>
612
655
  </bpmndi:BPMNEdge>
613
656
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_blocked" bpmnElement="f_reb_blocked">
614
- <di:waypoint x="1288" y="1240" />
615
- <di:waypoint x="1308" y="1240" />
616
- <di:waypoint x="1308" y="1215" />
617
- <di:waypoint x="1676" y="1215" />
618
- <di:waypoint x="1676" y="562" />
619
- <di:waypoint x="1488" y="562" />
657
+ <di:waypoint x="1313" y="920" />
658
+ <di:waypoint x="1488" y="920" />
659
+ <di:waypoint x="1488" y="1040" />
620
660
  <bpmndi:BPMNLabel>
621
- <dc:Bounds x="1460" y="1182" width="64" height="28" />
661
+ <dc:Bounds x="1429" y="887" width="64" height="28" />
622
662
  </bpmndi:BPMNLabel>
623
663
  </bpmndi:BPMNEdge>
624
664
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_wait" bpmnElement="f_reb_wait">
625
- <di:waypoint x="1263" y="1215" />
626
- <di:waypoint x="1263" y="1140" />
627
- <di:waypoint x="1438" y="1140" />
628
- <di:waypoint x="1438" y="1120" />
665
+ <di:waypoint x="1288" y="895" />
666
+ <di:waypoint x="1288" y="760" />
667
+ <di:waypoint x="1438" y="760" />
629
668
  <bpmndi:BPMNLabel>
630
- <dc:Bounds x="1268" y="1164" width="75" height="28" />
669
+ <dc:Bounds x="1208" y="834" width="75" height="28" />
631
670
  </bpmndi:BPMNLabel>
632
671
  </bpmndi:BPMNEdge>
633
672
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_gQueued" bpmnElement="f_m_gQueued">
634
673
  <di:waypoint x="1088" y="145" />
635
674
  <di:waypoint x="1088" y="280" />
636
- <di:waypoint x="1238" y="280" />
675
+ <di:waypoint x="1263" y="280" />
637
676
  <bpmndi:BPMNLabel>
638
677
  <dc:Bounds x="1093" y="206" width="46" height="14" />
639
678
  </bpmndi:BPMNLabel>
640
679
  </bpmndi:BPMNEdge>
641
680
  <bpmndi:BPMNEdge id="BPMNEdge_f_eg_evicted" bpmnElement="f_eg_evicted">
642
- <di:waypoint x="1263" y="305" />
643
- <di:waypoint x="1263" y="440" />
644
- <di:waypoint x="1420" y="440" />
681
+ <di:waypoint x="1288" y="305" />
682
+ <di:waypoint x="1288" y="440" />
683
+ <di:waypoint x="1470" y="440" />
645
684
  </bpmndi:BPMNEdge>
646
685
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_gBlocked" bpmnElement="f_m_gBlocked">
647
686
  <di:waypoint x="1088" y="95" />
648
687
  <di:waypoint x="1088" y="75" />
649
- <di:waypoint x="1844" y="75" />
650
- <di:waypoint x="1844" y="478" />
651
- <di:waypoint x="1368" y="478" />
652
- <di:waypoint x="1368" y="580" />
653
- <di:waypoint x="1388" y="580" />
688
+ <di:waypoint x="1894" y="75" />
689
+ <di:waypoint x="1894" y="820" />
690
+ <di:waypoint x="1418" y="820" />
691
+ <di:waypoint x="1418" y="1060" />
692
+ <di:waypoint x="1438" y="1060" />
654
693
  <bpmndi:BPMNLabel>
655
- <dc:Bounds x="1849" y="270" width="53" height="14" />
694
+ <dc:Bounds x="1899" y="441" width="53" height="14" />
656
695
  </bpmndi:BPMNLabel>
657
696
  </bpmndi:BPMNEdge>
658
697
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_done" bpmnElement="f_ci_done">
659
- <di:waypoint x="1138" y="920" />
660
- <di:waypoint x="1238" y="920" />
698
+ <di:waypoint x="1138" y="600" />
699
+ <di:waypoint x="1263" y="600" />
661
700
  </bpmndi:BPMNEdge>
662
701
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_done" bpmnElement="f_reb_done">
663
- <di:waypoint x="1138" y="1240" />
664
- <di:waypoint x="1238" y="1240" />
702
+ <di:waypoint x="1138" y="920" />
703
+ <di:waypoint x="1263" y="920" />
665
704
  </bpmndi:BPMNEdge>
666
705
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_escA" bpmnElement="f_m_escA">
667
- <di:waypoint x="1488" y="600" />
668
- <di:waypoint x="1620" y="600" />
706
+ <di:waypoint x="1538" y="1080" />
707
+ <di:waypoint x="1670" y="1080" />
708
+ </bpmndi:BPMNEdge>
709
+ <bpmndi:BPMNEdge id="BPMNEdge_f_reb_sla" bpmnElement="f_reb_sla">
710
+ <di:waypoint x="1088" y="978" />
711
+ <di:waypoint x="1088" y="998" />
712
+ <di:waypoint x="1218" y="998" />
713
+ <di:waypoint x="1218" y="1560" />
714
+ <di:waypoint x="1238" y="1560" />
715
+ <bpmndi:BPMNLabel>
716
+ <dc:Bounds x="1118" y="965" width="70" height="28" />
717
+ </bpmndi:BPMNLabel>
718
+ </bpmndi:BPMNEdge>
719
+ <bpmndi:BPMNEdge id="BPMNEdge_f_ci_sla" bpmnElement="f_ci_sla">
720
+ <di:waypoint x="1088" y="658" />
721
+ <di:waypoint x="1088" y="678" />
722
+ <di:waypoint x="1018" y="678" />
723
+ <di:waypoint x="1018" y="540" />
724
+ <di:waypoint x="1618" y="540" />
725
+ <di:waypoint x="1618" y="820" />
726
+ <di:waypoint x="1526" y="820" />
727
+ <di:waypoint x="1526" y="1040" />
728
+ <bpmndi:BPMNLabel>
729
+ <dc:Bounds x="1243" y="507" width="70" height="28" />
730
+ </bpmndi:BPMNLabel>
669
731
  </bpmndi:BPMNEdge>
670
732
  <bpmndi:BPMNEdge id="BPMNEdge_f_ci_fixed" bpmnElement="f_ci_fixed">
671
- <di:waypoint x="1263" y="945" />
672
- <di:waypoint x="1263" y="980" />
673
- <di:waypoint x="402" y="980" />
733
+ <di:waypoint x="1288" y="625" />
734
+ <di:waypoint x="1288" y="680" />
735
+ <di:waypoint x="402" y="680" />
674
736
  <di:waypoint x="402" y="160" />
675
737
  <bpmndi:BPMNLabel>
676
- <dc:Bounds x="813" y="988" width="39" height="14" />
738
+ <dc:Bounds x="826" y="688" width="39" height="14" />
677
739
  </bpmndi:BPMNLabel>
678
740
  </bpmndi:BPMNEdge>
679
741
  <bpmndi:BPMNEdge id="BPMNEdge_f_reb_rebased" bpmnElement="f_reb_rebased">
680
- <di:waypoint x="1263" y="1265" />
681
- <di:waypoint x="1263" y="1300" />
682
- <di:waypoint x="402" y="1300" />
742
+ <di:waypoint x="1288" y="945" />
743
+ <di:waypoint x="1288" y="1000" />
744
+ <di:waypoint x="402" y="1000" />
683
745
  <di:waypoint x="402" y="160" />
684
746
  <bpmndi:BPMNLabel>
685
- <dc:Bounds x="806" y="1308" width="53" height="14" />
747
+ <dc:Bounds x="799" y="1008" width="53" height="14" />
686
748
  </bpmndi:BPMNLabel>
687
749
  </bpmndi:BPMNEdge>
688
750
  <bpmndi:BPMNEdge id="BPMNEdge_f_dep_rewait" bpmnElement="f_dep_rewait">
689
- <di:waypoint x="1438" y="1120" />
690
- <di:waypoint x="1438" y="1140" />
691
- <di:waypoint x="234" y="1140" />
751
+ <di:waypoint x="1488" y="800" />
752
+ <di:waypoint x="1488" y="820" />
753
+ <di:waypoint x="234" y="820" />
692
754
  <di:waypoint x="234" y="138" />
693
755
  </bpmndi:BPMNEdge>
694
756
  <bpmndi:BPMNEdge id="BPMNEdge_f_m_evicted" bpmnElement="f_m_evicted">
695
- <di:waypoint x="1438" y="458" />
696
- <di:waypoint x="1438" y="478" />
757
+ <di:waypoint x="1488" y="458" />
758
+ <di:waypoint x="1488" y="478" />
697
759
  <di:waypoint x="402" y="478" />
698
760
  <di:waypoint x="402" y="160" />
699
761
  </bpmndi:BPMNEdge>