@nanobpm/nano-workforce 0.187.3 → 0.187.5

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/SPEC.md +71 -9
  4. package/app/contracts.ts +1 -0
  5. package/app/convergenceEscalationGuard.test.ts +3 -2
  6. package/app/github.test.ts +125 -1
  7. package/app/github.ts +43 -8
  8. package/app/persist-escalation.test.ts +8 -6
  9. package/app/persist-round.test.ts +178 -11
  10. package/app/pullRequestReadModel.test.ts +1 -1
  11. package/app/reviewWait.test.ts +7 -0
  12. package/app/reviewWait.ts +1 -1
  13. package/app/roundProgress.test.ts +755 -33
  14. package/app/roundProgress.ts +144 -0
  15. package/app/roundResultDefault.test.ts +10 -8
  16. package/app/service.test.ts +14 -0
  17. package/app/service.ts +35 -0
  18. package/db/migrations/102_rounds_process_instance_key.sql +28 -0
  19. package/db/migrations/103_pr_progress_idempotency.sql +29 -0
  20. package/db/migrations/104_pull_requests_read_model_progress_idempotency.sql +55 -0
  21. package/docs/agent-guide.md +1 -1
  22. package/e2e/convergence-escalation.e2e.ts +5 -4
  23. package/e2e/feature-run.e2e.ts +6 -1
  24. package/e2e/plan-fanout-sla.e2e.ts +5 -2
  25. package/e2e/plan-fanout.e2e.ts +6 -2
  26. package/e2e/support/time.ts +34 -0
  27. package/nano.app.json +4 -0
  28. package/package.json +1 -1
  29. package/resources/processes/convergence-loop.bpmn +211 -142
  30. package/test/derivation-parity/README.md +3 -3
  31. package/test/derivation-parity/derivation-parity.test.ts +9 -3
  32. package/test/derivation-parity/flows.ts +4 -4
  33. package/workers/capture-head/worker.test.ts +77 -0
  34. package/workers/capture-head/worker.ts +64 -0
  35. package/workers/persist-escalation/worker.ts +4 -0
  36. package/workers/persist-round/worker.ts +75 -9
  37. package/workers/progress-check/worker.ts +394 -35
@@ -38,9 +38,24 @@
38
38
  <nano:extend name="status" type="string" optional="true" />
39
39
  <nano:extend name="repo" type="string" optional="true" />
40
40
  <nano:extend name="prNumber" type="integer" optional="true" />
41
+ <nano:extend name="round" type="integer" optional="true" />
42
+ <nano:extend name="huskRetries" type="integer" optional="true" />
43
+ <nano:extend name="roundEntryHead" type="string" optional="true" />
44
+ </nano:shape>
45
+ <nano:shape id="PrCaptureHeadIn" name="Capture round-entry head — input">
46
+ <nano:extend name="prKey" type="string" />
47
+ <nano:extend name="repo" type="string" optional="true" />
48
+ <nano:extend name="prNumber" type="integer" optional="true" />
49
+ </nano:shape>
50
+ <nano:shape id="PrCaptureHeadOut" name="Capture round-entry head — result">
51
+ <nano:extend name="roundEntryHead" type="string" optional="true" />
41
52
  </nano:shape>
42
53
  <nano:shape id="PrProgressCheckOut" name="Check progress — result">
43
54
  <nano:extend name="progressed" type="boolean" />
55
+ <nano:extend name="huskRetries" type="integer" />
56
+ <nano:extend name="huskRetry" type="boolean" optional="true" />
57
+ <nano:extend name="noProgressReason" type="string" optional="true" />
58
+ <nano:extend name="noProgressQuestion" type="string" optional="true" />
44
59
  </nano:shape>
45
60
  <nano:shape id="PrConvergeGateIn" name="Converge gate — input">
46
61
  <nano:extend name="prKey" type="string" />
@@ -114,10 +129,22 @@
114
129
  <zeebe:output source="=false" target="scopePending" />
115
130
  </zeebe:ioMapping>
116
131
  </bpmn:extensionElements>
132
+ <bpmn:incoming>f_capture</bpmn:incoming>
133
+ <bpmn:outgoing>f_toStatus</bpmn:outgoing>
134
+ </bpmn:serviceTask>
135
+ <bpmn:serviceTask id="capture-head" name="Capture round-entry head">
136
+ <bpmn:extensionElements>
137
+ <zeebe:taskDefinition type="pr.capture-head" />
138
+ <zeebe:properties>
139
+ <zeebe:property name="io.nanobpm.dataEnvelope.in" value="PrCaptureHeadIn" />
140
+ <zeebe:property name="io.nanobpm.dataEnvelope.out" value="PrCaptureHeadOut" />
141
+ </zeebe:properties>
142
+ </bpmn:extensionElements>
117
143
  <bpmn:incoming>f_start</bpmn:incoming>
118
144
  <bpmn:incoming>f_reviewLoop</bpmn:incoming>
119
145
  <bpmn:incoming>f_answerLoop</bpmn:incoming>
120
- <bpmn:outgoing>f_toStatus</bpmn:outgoing>
146
+ <bpmn:incoming>f_huskRetry</bpmn:incoming>
147
+ <bpmn:outgoing>f_capture</bpmn:outgoing>
121
148
  </bpmn:serviceTask>
122
149
  <bpmn:exclusiveGateway id="gw-status" name="status?" default="f_addressed">
123
150
  <bpmn:incoming>f_toStatus</bpmn:incoming>
@@ -127,9 +154,7 @@
127
154
  <bpmn:outgoing>f_escalate</bpmn:outgoing>
128
155
  </bpmn:exclusiveGateway>
129
156
  <bpmn:exclusiveGateway id="gw-guard" name="rounds left?" default="f_guardOk">
130
- <bpmn:incoming>f_addressed</bpmn:incoming>
131
- <bpmn:incoming>f_waiting</bpmn:incoming>
132
- <bpmn:incoming>f_escReenter</bpmn:incoming>
157
+ <bpmn:incoming>f_progressOk</bpmn:incoming>
133
158
  <bpmn:outgoing>f_guardMax</bpmn:outgoing>
134
159
  <bpmn:outgoing>f_guardOk</bpmn:outgoing>
135
160
  </bpmn:exclusiveGateway>
@@ -140,7 +165,9 @@
140
165
  <zeebe:property name="io.nanobpm.dataEnvelope.in" value="PrPersistRoundIn" />
141
166
  </zeebe:properties>
142
167
  </bpmn:extensionElements>
143
- <bpmn:incoming>f_guardOk</bpmn:incoming>
168
+ <bpmn:incoming>f_addressed</bpmn:incoming>
169
+ <bpmn:incoming>f_waiting</bpmn:incoming>
170
+ <bpmn:incoming>f_escReenter</bpmn:incoming>
144
171
  <bpmn:outgoing>f_roundWait</bpmn:outgoing>
145
172
  </bpmn:serviceTask>
146
173
  <bpmn:serviceTask id="check-progress" name="Check progress">
@@ -159,6 +186,11 @@
159
186
  <bpmn:outgoing>f_noProgress</bpmn:outgoing>
160
187
  <bpmn:outgoing>f_progressOk</bpmn:outgoing>
161
188
  </bpmn:exclusiveGateway>
189
+ <bpmn:exclusiveGateway id="gw-husk" name="husk — auto-retry?" default="f_huskEscalate">
190
+ <bpmn:incoming>f_noProgress</bpmn:incoming>
191
+ <bpmn:outgoing>f_huskRetry</bpmn:outgoing>
192
+ <bpmn:outgoing>f_huskEscalate</bpmn:outgoing>
193
+ </bpmn:exclusiveGateway>
162
194
  <bpmn:serviceTask id="persist-escalation-noprogress" name="Escalate: no progress">
163
195
  <bpmn:extensionElements>
164
196
  <zeebe:taskDefinition type="pr.persist-escalation" />
@@ -169,14 +201,14 @@
169
201
  <zeebe:ioMapping>
170
202
  <zeebe:input source="=&#34;blocked&#34;" target="status" />
171
203
  <zeebe:input source="=false" target="recordRound" />
172
- <zeebe:input source="=&#34;Round &#34; + string(round) + &#34; reported the review comments were addressed, but the PR head did not advance (no commit was pushed), so another review round would loop on identical code. A human must decide how to proceed (reply to resume the loop).&#34;" target="question" />
204
+ <zeebe:input source="=if (noProgressQuestion != null and trim(noProgressQuestion) != &#34;&#34;) then noProgressQuestion else &#34;Round &#34; + string(round) + &#34; reported the review comments were addressed, but the PR head did not advance (no commit was pushed), so another review round would loop on identical code. A human must decide how to proceed (reply to resume the loop).&#34;" target="question" />
173
205
  </zeebe:ioMapping>
174
206
  </bpmn:extensionElements>
175
- <bpmn:incoming>f_noProgress</bpmn:incoming>
207
+ <bpmn:incoming>f_huskEscalate</bpmn:incoming>
176
208
  <bpmn:outgoing>f_noprogressGate</bpmn:outgoing>
177
209
  </bpmn:serviceTask>
178
210
  <bpmn:eventBasedGateway id="gw-review-wait" name="review ready or timeout?">
179
- <bpmn:incoming>f_progressOk</bpmn:incoming>
211
+ <bpmn:incoming>f_guardOk</bpmn:incoming>
180
212
  <bpmn:outgoing>f_toReviewWait</bpmn:outgoing>
181
213
  <bpmn:outgoing>f_toReviewTimeout</bpmn:outgoing>
182
214
  </bpmn:eventBasedGateway>
@@ -243,6 +275,7 @@
243
275
  </zeebe:properties>
244
276
  <zeebe:ioMapping>
245
277
  <zeebe:input source="=&#34;blocked&#34;" target="status" />
278
+ <zeebe:input source="=false" target="recordRound" />
246
279
  <zeebe:input source="=&#34;Not converged after &#34; + string(maxRounds) + &#34; rounds. A human must decide how to proceed.&#34;" target="question" />
247
280
  </zeebe:ioMapping>
248
281
  </bpmn:extensionElements>
@@ -271,6 +304,7 @@
271
304
  <zeebe:input source="=prKey" target="prKey" />
272
305
  <zeebe:input source="=answer" target="answer" />
273
306
  <zeebe:output source="=(if scopePending = true then answer else scopeAnswer)" target="scopeAnswer" />
307
+ <zeebe:output source="=0" target="huskRetries" />
274
308
  </zeebe:ioMapping>
275
309
  </bpmn:extensionElements>
276
310
  <bpmn:incoming>f_answerRecord</bpmn:incoming>
@@ -361,7 +395,8 @@
361
395
  <bpmn:endEvent id="End" name="Converged">
362
396
  <bpmn:incoming>f_finalize</bpmn:incoming>
363
397
  </bpmn:endEvent>
364
- <bpmn:sequenceFlow id="f_start" sourceRef="Start" targetRef="review-round" />
398
+ <bpmn:sequenceFlow id="f_start" sourceRef="Start" targetRef="capture-head" />
399
+ <bpmn:sequenceFlow id="f_capture" sourceRef="capture-head" targetRef="review-round" />
365
400
  <bpmn:sequenceFlow id="f_toStatus" sourceRef="review-round" targetRef="gw-status" />
366
401
  <bpmn:sequenceFlow id="f_converged" name="converged" sourceRef="gw-status" targetRef="check-converge">
367
402
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=status = "converged"</bpmn:conditionExpression>
@@ -378,8 +413,8 @@
378
413
  <bpmn:sequenceFlow id="f_scopeOk" name="scope delivered / default" sourceRef="gw-scope-gate" targetRef="persist-converged" />
379
414
  <bpmn:sequenceFlow id="f_scopeEscGate" sourceRef="persist-escalation-scope" targetRef="gw-escalated" />
380
415
  <bpmn:sequenceFlow id="f_blockedGate" sourceRef="persist-escalation-blockedcomments" targetRef="gw-escalated" />
381
- <bpmn:sequenceFlow id="f_addressed" name="addressed / default" sourceRef="gw-status" targetRef="gw-guard" />
382
- <bpmn:sequenceFlow id="f_waiting" name="waiting" sourceRef="gw-status" targetRef="gw-guard">
416
+ <bpmn:sequenceFlow id="f_addressed" name="addressed / default" sourceRef="gw-status" targetRef="persist-round" />
417
+ <bpmn:sequenceFlow id="f_waiting" name="waiting" sourceRef="gw-status" targetRef="persist-round">
383
418
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=status = "waiting"</bpmn:conditionExpression>
384
419
  </bpmn:sequenceFlow>
385
420
  <bpmn:sequenceFlow id="f_escalate" name="needs_input / blocked" sourceRef="gw-status" targetRef="persist-escalation">
@@ -388,27 +423,31 @@
388
423
  <bpmn:sequenceFlow id="f_guardMax" name="max rounds" sourceRef="gw-guard" targetRef="persist-escalation-maxrounds">
389
424
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=round &gt;= maxRounds</bpmn:conditionExpression>
390
425
  </bpmn:sequenceFlow>
391
- <bpmn:sequenceFlow id="f_guardOk" name="continue" sourceRef="gw-guard" targetRef="persist-round" />
426
+ <bpmn:sequenceFlow id="f_guardOk" name="continue" sourceRef="gw-guard" targetRef="gw-review-wait" />
392
427
  <bpmn:sequenceFlow id="f_roundWait" sourceRef="persist-round" targetRef="check-progress" />
393
428
  <bpmn:sequenceFlow id="f_checkGate" sourceRef="check-progress" targetRef="gw-progress" />
394
- <bpmn:sequenceFlow id="f_noProgress" name="no progress" sourceRef="gw-progress" targetRef="persist-escalation-noprogress">
429
+ <bpmn:sequenceFlow id="f_noProgress" name="no progress" sourceRef="gw-progress" targetRef="gw-husk">
395
430
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=progressed = false</bpmn:conditionExpression>
396
431
  </bpmn:sequenceFlow>
397
- <bpmn:sequenceFlow id="f_progressOk" name="progress / default" sourceRef="gw-progress" targetRef="gw-review-wait" />
432
+ <bpmn:sequenceFlow id="f_huskRetry" name="husk retry same round" sourceRef="gw-husk" targetRef="capture-head">
433
+ <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=huskRetry = true</bpmn:conditionExpression>
434
+ </bpmn:sequenceFlow>
435
+ <bpmn:sequenceFlow id="f_huskEscalate" name="escalate" sourceRef="gw-husk" targetRef="persist-escalation-noprogress" />
436
+ <bpmn:sequenceFlow id="f_progressOk" name="progress / default" sourceRef="gw-progress" targetRef="gw-guard" />
398
437
  <bpmn:sequenceFlow id="f_noprogressGate" sourceRef="persist-escalation-noprogress" targetRef="gw-escalated" />
399
438
  <bpmn:sequenceFlow id="f_toReviewWait" sourceRef="gw-review-wait" targetRef="wait-review" />
400
439
  <bpmn:sequenceFlow id="f_toReviewTimeout" sourceRef="gw-review-wait" targetRef="wait-review-timeout" />
401
- <bpmn:sequenceFlow id="f_reviewLoop" sourceRef="wait-review" targetRef="review-round" />
440
+ <bpmn:sequenceFlow id="f_reviewLoop" sourceRef="wait-review" targetRef="capture-head" />
402
441
  <bpmn:sequenceFlow id="f_reviewStalled" sourceRef="wait-review-timeout" targetRef="persist-review-stalled" />
403
442
  <bpmn:sequenceFlow id="f_stalledGate" sourceRef="persist-review-stalled" targetRef="gw-escalated" />
404
443
  <bpmn:sequenceFlow id="f_escGate" sourceRef="persist-escalation" targetRef="gw-escalated" />
405
444
  <bpmn:sequenceFlow id="f_escWait" sourceRef="gw-escalated" targetRef="wait-answer">
406
445
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=escalated = true</bpmn:conditionExpression>
407
446
  </bpmn:sequenceFlow>
408
- <bpmn:sequenceFlow id="f_escReenter" name="no escalation opened" sourceRef="gw-escalated" targetRef="gw-guard" />
447
+ <bpmn:sequenceFlow id="f_escReenter" name="no escalation opened" sourceRef="gw-escalated" targetRef="persist-round" />
409
448
  <bpmn:sequenceFlow id="f_maxGate" sourceRef="persist-escalation-maxrounds" targetRef="gw-escalated" />
410
449
  <bpmn:sequenceFlow id="f_answerRecord" sourceRef="wait-answer" targetRef="record-answer" />
411
- <bpmn:sequenceFlow id="f_answerLoop" sourceRef="record-answer" targetRef="review-round" />
450
+ <bpmn:sequenceFlow id="f_answerLoop" sourceRef="record-answer" targetRef="capture-head" />
412
451
  <bpmn:sequenceFlow id="f_finalize" sourceRef="persist-converged" targetRef="End" />
413
452
  </bpmn:process>
414
453
  <bpmndi:BPMNDiagram id="BPMNDiagram_convergence-loop">
@@ -420,18 +459,21 @@
420
459
  </bpmndi:BPMNLabel>
421
460
  </bpmndi:BPMNShape>
422
461
  <bpmndi:BPMNShape id="BPMNShape_review-round" bpmnElement="review-round">
462
+ <dc:Bounds x="416" y="80" width="100" height="80" />
463
+ </bpmndi:BPMNShape>
464
+ <bpmndi:BPMNShape id="BPMNShape_capture-head" bpmnElement="capture-head">
423
465
  <dc:Bounds x="216" y="80" width="100" height="80" />
424
466
  </bpmndi:BPMNShape>
425
467
  <bpmndi:BPMNShape id="BPMNShape_gw-status" bpmnElement="gw-status" isMarkerVisible="true">
426
- <dc:Bounds x="416" y="95" width="50" height="50" />
468
+ <dc:Bounds x="616" y="95" width="50" height="50" />
427
469
  <bpmndi:BPMNLabel>
428
- <dc:Bounds x="415" y="76" width="53" height="14" />
470
+ <dc:Bounds x="615" y="76" width="53" height="14" />
429
471
  </bpmndi:BPMNLabel>
430
472
  </bpmndi:BPMNShape>
431
473
  <bpmndi:BPMNShape id="BPMNShape_gw-guard" bpmnElement="gw-guard" isMarkerVisible="true">
432
- <dc:Bounds x="591" y="575" width="50" height="50" />
474
+ <dc:Bounds x="1366" y="575" width="50" height="50" />
433
475
  <bpmndi:BPMNLabel>
434
- <dc:Bounds x="574" y="630" width="85" height="14" />
476
+ <dc:Bounds x="1349" y="556" width="85" height="14" />
435
477
  </bpmndi:BPMNLabel>
436
478
  </bpmndi:BPMNShape>
437
479
  <bpmndi:BPMNShape id="BPMNShape_persist-round" bpmnElement="persist-round">
@@ -441,132 +483,142 @@
441
483
  <dc:Bounds x="966" y="560" width="100" height="80" />
442
484
  </bpmndi:BPMNShape>
443
485
  <bpmndi:BPMNShape id="BPMNShape_gw-progress" bpmnElement="gw-progress" isMarkerVisible="true">
444
- <dc:Bounds x="1166" y="575" width="50" height="50" />
486
+ <dc:Bounds x="1191" y="575" width="50" height="50" />
487
+ <bpmndi:BPMNLabel>
488
+ <dc:Bounds x="1186" y="542" width="60" height="28" />
489
+ </bpmndi:BPMNLabel>
490
+ </bpmndi:BPMNShape>
491
+ <bpmndi:BPMNShape id="BPMNShape_gw-husk" bpmnElement="gw-husk" isMarkerVisible="true">
492
+ <dc:Bounds x="1366" y="1055" width="50" height="50" />
445
493
  <bpmndi:BPMNLabel>
446
- <dc:Bounds x="1161" y="542" width="60" height="28" />
494
+ <dc:Bounds x="1351" y="1022" width="81" height="28" />
447
495
  </bpmndi:BPMNLabel>
448
496
  </bpmndi:BPMNShape>
449
497
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-noprogress" bpmnElement="persist-escalation-noprogress">
450
- <dc:Bounds x="1316" y="880" width="100" height="80" />
498
+ <dc:Bounds x="1516" y="1040" width="100" height="80" />
451
499
  </bpmndi:BPMNShape>
452
500
  <bpmndi:BPMNShape id="BPMNShape_gw-review-wait" bpmnElement="gw-review-wait" isMarkerVisible="true">
453
- <dc:Bounds x="1341" y="575" width="50" height="50" />
501
+ <dc:Bounds x="1541" y="575" width="50" height="50" />
454
502
  <bpmndi:BPMNLabel>
455
- <dc:Bounds x="1322" y="542" width="88" height="28" />
503
+ <dc:Bounds x="1522" y="542" width="88" height="28" />
456
504
  </bpmndi:BPMNLabel>
457
505
  </bpmndi:BPMNShape>
458
506
  <bpmndi:BPMNShape id="BPMNShape_wait-review" bpmnElement="wait-review">
459
- <dc:Bounds x="1516" y="582" width="36" height="36" />
507
+ <dc:Bounds x="1716" y="582" width="36" height="36" />
460
508
  <bpmndi:BPMNLabel>
461
- <dc:Bounds x="1490" y="549" width="88" height="28" />
509
+ <dc:Bounds x="1690" y="549" width="88" height="28" />
462
510
  </bpmndi:BPMNLabel>
463
511
  </bpmndi:BPMNShape>
464
512
  <bpmndi:BPMNShape id="BPMNShape_wait-review-timeout" bpmnElement="wait-review-timeout">
465
- <dc:Bounds x="1516" y="742" width="36" height="36" />
513
+ <dc:Bounds x="1716" y="742" width="36" height="36" />
466
514
  <bpmndi:BPMNLabel>
467
- <dc:Bounds x="1506" y="783" width="56" height="42" />
515
+ <dc:Bounds x="1706" y="783" width="56" height="42" />
468
516
  </bpmndi:BPMNLabel>
469
517
  </bpmndi:BPMNShape>
470
518
  <bpmndi:BPMNShape id="BPMNShape_persist-review-stalled" bpmnElement="persist-review-stalled">
471
- <dc:Bounds x="1652" y="720" width="100" height="80" />
519
+ <dc:Bounds x="1852" y="720" width="100" height="80" />
472
520
  </bpmndi:BPMNShape>
473
521
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation" bpmnElement="persist-escalation">
474
- <dc:Bounds x="566" y="1200" width="100" height="80" />
522
+ <dc:Bounds x="766" y="1200" width="100" height="80" />
475
523
  </bpmndi:BPMNShape>
476
524
  <bpmndi:BPMNShape id="BPMNShape_gw-escalated" bpmnElement="gw-escalated" isMarkerVisible="true">
477
- <dc:Bounds x="1852" y="255" width="50" height="50" />
525
+ <dc:Bounds x="2052" y="255" width="50" height="50" />
478
526
  <bpmndi:BPMNLabel>
479
- <dc:Bounds x="1760" y="290" width="74" height="28" />
527
+ <dc:Bounds x="1960" y="290" width="74" height="28" />
480
528
  </bpmndi:BPMNLabel>
481
529
  </bpmndi:BPMNShape>
482
530
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-maxrounds" bpmnElement="persist-escalation-maxrounds">
483
- <dc:Bounds x="766" y="1040" width="100" height="80" />
531
+ <dc:Bounds x="1516" y="880" width="100" height="80" />
484
532
  </bpmndi:BPMNShape>
485
533
  <bpmndi:BPMNShape id="BPMNShape_wait-answer" bpmnElement="wait-answer">
486
- <dc:Bounds x="2002" y="240" width="100" height="80" />
534
+ <dc:Bounds x="2202" y="240" width="100" height="80" />
487
535
  </bpmndi:BPMNShape>
488
536
  <bpmndi:BPMNShape id="BPMNShape_record-answer" bpmnElement="record-answer">
489
- <dc:Bounds x="2202" y="240" width="100" height="80" />
537
+ <dc:Bounds x="2402" y="240" width="100" height="80" />
490
538
  </bpmndi:BPMNShape>
491
539
  <bpmndi:BPMNShape id="BPMNShape_persist-converged" bpmnElement="persist-converged">
492
- <dc:Bounds x="1316" y="80" width="100" height="80" />
540
+ <dc:Bounds x="1516" y="80" width="100" height="80" />
493
541
  </bpmndi:BPMNShape>
494
542
  <bpmndi:BPMNShape id="BPMNShape_check-converge" bpmnElement="check-converge">
495
- <dc:Bounds x="566" y="80" width="100" height="80" />
543
+ <dc:Bounds x="766" y="80" width="100" height="80" />
496
544
  </bpmndi:BPMNShape>
497
545
  <bpmndi:BPMNShape id="BPMNShape_gw-converge-gate" bpmnElement="gw-converge-gate" isMarkerVisible="true">
498
- <dc:Bounds x="791" y="95" width="50" height="50" />
546
+ <dc:Bounds x="991" y="95" width="50" height="50" />
499
547
  <bpmndi:BPMNLabel>
500
- <dc:Bounds x="779" y="150" width="74" height="28" />
548
+ <dc:Bounds x="979" y="150" width="74" height="28" />
501
549
  </bpmndi:BPMNLabel>
502
550
  </bpmndi:BPMNShape>
503
551
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-blockedcomments" bpmnElement="persist-escalation-blockedcomments">
504
- <dc:Bounds x="966" y="400" width="100" height="80" />
552
+ <dc:Bounds x="1166" y="400" width="100" height="80" />
505
553
  </bpmndi:BPMNShape>
506
554
  <bpmndi:BPMNShape id="BPMNShape_classify-scope" bpmnElement="classify-scope">
507
- <dc:Bounds x="966" y="80" width="100" height="80" />
555
+ <dc:Bounds x="1166" y="80" width="100" height="80" />
508
556
  </bpmndi:BPMNShape>
509
557
  <bpmndi:BPMNShape id="BPMNShape_gw-scope-gate" bpmnElement="gw-scope-gate" isMarkerVisible="true">
510
- <dc:Bounds x="1166" y="95" width="50" height="50" />
558
+ <dc:Bounds x="1366" y="95" width="50" height="50" />
511
559
  <bpmndi:BPMNLabel>
512
- <dc:Bounds x="1154" y="62" width="74" height="28" />
560
+ <dc:Bounds x="1354" y="62" width="74" height="28" />
513
561
  </bpmndi:BPMNLabel>
514
562
  </bpmndi:BPMNShape>
515
563
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-scope" bpmnElement="persist-escalation-scope">
516
- <dc:Bounds x="1316" y="240" width="100" height="80" />
564
+ <dc:Bounds x="1516" y="240" width="100" height="80" />
517
565
  </bpmndi:BPMNShape>
518
566
  <bpmndi:BPMNShape id="BPMNShape_End" bpmnElement="End">
519
- <dc:Bounds x="1516" y="102" width="36" height="36" />
567
+ <dc:Bounds x="1716" y="102" width="36" height="36" />
520
568
  <bpmndi:BPMNLabel>
521
- <dc:Bounds x="1500" y="143" width="69" height="14" />
569
+ <dc:Bounds x="1700" y="143" width="69" height="14" />
522
570
  </bpmndi:BPMNLabel>
523
571
  </bpmndi:BPMNShape>
524
572
  <bpmndi:BPMNEdge id="BPMNEdge_f_start" bpmnElement="f_start">
525
573
  <di:waypoint x="116" y="120" />
526
574
  <di:waypoint x="216" y="120" />
527
575
  </bpmndi:BPMNEdge>
528
- <bpmndi:BPMNEdge id="BPMNEdge_f_toStatus" bpmnElement="f_toStatus">
576
+ <bpmndi:BPMNEdge id="BPMNEdge_f_capture" bpmnElement="f_capture">
529
577
  <di:waypoint x="316" y="120" />
530
578
  <di:waypoint x="416" y="120" />
531
579
  </bpmndi:BPMNEdge>
580
+ <bpmndi:BPMNEdge id="BPMNEdge_f_toStatus" bpmnElement="f_toStatus">
581
+ <di:waypoint x="516" y="120" />
582
+ <di:waypoint x="616" y="120" />
583
+ </bpmndi:BPMNEdge>
532
584
  <bpmndi:BPMNEdge id="BPMNEdge_f_converged" bpmnElement="f_converged">
533
- <di:waypoint x="466" y="120" />
534
- <di:waypoint x="566" y="120" />
585
+ <di:waypoint x="666" y="120" />
586
+ <di:waypoint x="766" y="120" />
535
587
  <bpmndi:BPMNLabel>
536
- <dc:Bounds x="483" y="98" width="67" height="14" />
588
+ <dc:Bounds x="673" y="128" width="67" height="14" />
537
589
  </bpmndi:BPMNLabel>
538
590
  </bpmndi:BPMNEdge>
539
591
  <bpmndi:BPMNEdge id="BPMNEdge_f_toConvergeGate" bpmnElement="f_toConvergeGate">
540
- <di:waypoint x="666" y="120" />
541
- <di:waypoint x="791" y="120" />
592
+ <di:waypoint x="866" y="120" />
593
+ <di:waypoint x="991" y="120" />
542
594
  </bpmndi:BPMNEdge>
543
595
  <bpmndi:BPMNEdge id="BPMNEdge_f_convergeOk" bpmnElement="f_convergeOk">
544
- <di:waypoint x="841" y="120" />
545
- <di:waypoint x="966" y="120" />
596
+ <di:waypoint x="1041" y="120" />
597
+ <di:waypoint x="1166" y="120" />
546
598
  <bpmndi:BPMNLabel>
547
- <dc:Bounds x="855" y="87" width="78" height="28" />
599
+ <dc:Bounds x="1055" y="87" width="78" height="28" />
548
600
  </bpmndi:BPMNLabel>
549
601
  </bpmndi:BPMNEdge>
550
602
  <bpmndi:BPMNEdge id="BPMNEdge_f_toScopeGate" bpmnElement="f_toScopeGate">
551
- <di:waypoint x="1066" y="120" />
552
- <di:waypoint x="1166" y="120" />
603
+ <di:waypoint x="1266" y="120" />
604
+ <di:waypoint x="1366" y="120" />
553
605
  </bpmndi:BPMNEdge>
554
606
  <bpmndi:BPMNEdge id="BPMNEdge_f_scopeOk" bpmnElement="f_scopeOk">
555
- <di:waypoint x="1216" y="120" />
556
- <di:waypoint x="1316" y="120" />
607
+ <di:waypoint x="1416" y="120" />
608
+ <di:waypoint x="1516" y="120" />
557
609
  <bpmndi:BPMNLabel>
558
- <dc:Bounds x="1227" y="125" width="78" height="42" />
610
+ <dc:Bounds x="1427" y="125" width="78" height="42" />
559
611
  </bpmndi:BPMNLabel>
560
612
  </bpmndi:BPMNEdge>
561
613
  <bpmndi:BPMNEdge id="BPMNEdge_f_finalize" bpmnElement="f_finalize">
562
- <di:waypoint x="1416" y="120" />
563
- <di:waypoint x="1516" y="120" />
614
+ <di:waypoint x="1616" y="120" />
615
+ <di:waypoint x="1716" y="120" />
564
616
  </bpmndi:BPMNEdge>
565
617
  <bpmndi:BPMNEdge id="BPMNEdge_f_guardOk" bpmnElement="f_guardOk">
566
- <di:waypoint x="641" y="600" />
567
- <di:waypoint x="766" y="600" />
618
+ <di:waypoint x="1416" y="600" />
619
+ <di:waypoint x="1541" y="600" />
568
620
  <bpmndi:BPMNLabel>
569
- <dc:Bounds x="664" y="578" width="60" height="14" />
621
+ <dc:Bounds x="1426" y="608" width="60" height="14" />
570
622
  </bpmndi:BPMNLabel>
571
623
  </bpmndi:BPMNEdge>
572
624
  <bpmndi:BPMNEdge id="BPMNEdge_f_roundWait" bpmnElement="f_roundWait">
@@ -575,143 +627,160 @@
575
627
  </bpmndi:BPMNEdge>
576
628
  <bpmndi:BPMNEdge id="BPMNEdge_f_checkGate" bpmnElement="f_checkGate">
577
629
  <di:waypoint x="1066" y="600" />
578
- <di:waypoint x="1166" y="600" />
630
+ <di:waypoint x="1191" y="600" />
631
+ </bpmndi:BPMNEdge>
632
+ <bpmndi:BPMNEdge id="BPMNEdge_f_huskEscalate" bpmnElement="f_huskEscalate">
633
+ <di:waypoint x="1416" y="1080" />
634
+ <di:waypoint x="1516" y="1080" />
635
+ <bpmndi:BPMNLabel>
636
+ <dc:Bounds x="1436" y="1088" width="60" height="14" />
637
+ </bpmndi:BPMNLabel>
579
638
  </bpmndi:BPMNEdge>
580
639
  <bpmndi:BPMNEdge id="BPMNEdge_f_progressOk" bpmnElement="f_progressOk">
581
- <di:waypoint x="1216" y="600" />
582
- <di:waypoint x="1341" y="600" />
640
+ <di:waypoint x="1241" y="600" />
641
+ <di:waypoint x="1366" y="600" />
583
642
  <bpmndi:BPMNLabel>
584
- <dc:Bounds x="1241" y="567" width="71" height="28" />
643
+ <dc:Bounds x="1258" y="567" width="71" height="28" />
585
644
  </bpmndi:BPMNLabel>
586
645
  </bpmndi:BPMNEdge>
646
+ <bpmndi:BPMNEdge id="BPMNEdge_f_noprogressGate" bpmnElement="f_noprogressGate">
647
+ <di:waypoint x="1616" y="1080" />
648
+ <di:waypoint x="2077" y="1080" />
649
+ <di:waypoint x="2077" y="305" />
650
+ </bpmndi:BPMNEdge>
587
651
  <bpmndi:BPMNEdge id="BPMNEdge_f_toReviewWait" bpmnElement="f_toReviewWait">
588
- <di:waypoint x="1391" y="600" />
589
- <di:waypoint x="1516" y="600" />
652
+ <di:waypoint x="1591" y="600" />
653
+ <di:waypoint x="1716" y="600" />
590
654
  </bpmndi:BPMNEdge>
591
655
  <bpmndi:BPMNEdge id="BPMNEdge_f_reviewLoop" bpmnElement="f_reviewLoop">
592
- <di:waypoint x="1534" y="618" />
593
- <di:waypoint x="1534" y="660" />
656
+ <di:waypoint x="1734" y="618" />
657
+ <di:waypoint x="1734" y="660" />
594
658
  <di:waypoint x="266" y="660" />
595
659
  <di:waypoint x="266" y="160" />
596
660
  </bpmndi:BPMNEdge>
597
661
  <bpmndi:BPMNEdge id="BPMNEdge_f_escReenter" bpmnElement="f_escReenter">
598
- <di:waypoint x="1877" y="255" />
599
- <di:waypoint x="1877" y="220" />
600
- <di:waypoint x="616" y="220" />
601
- <di:waypoint x="616" y="575" />
662
+ <di:waypoint x="2077" y="255" />
663
+ <di:waypoint x="2077" y="220" />
664
+ <di:waypoint x="816" y="220" />
665
+ <di:waypoint x="816" y="560" />
602
666
  <bpmndi:BPMNLabel>
603
- <dc:Bounds x="867" y="173" width="74" height="42" />
667
+ <dc:Bounds x="1067" y="173" width="74" height="42" />
604
668
  </bpmndi:BPMNLabel>
605
669
  </bpmndi:BPMNEdge>
606
670
  <bpmndi:BPMNEdge id="BPMNEdge_f_convergeBlocked" bpmnElement="f_convergeBlocked">
607
- <di:waypoint x="841" y="120" />
608
- <di:waypoint x="946" y="120" />
609
- <di:waypoint x="946" y="440" />
610
- <di:waypoint x="966" y="440" />
671
+ <di:waypoint x="1041" y="120" />
672
+ <di:waypoint x="1146" y="120" />
673
+ <di:waypoint x="1146" y="440" />
674
+ <di:waypoint x="1166" y="440" />
611
675
  <bpmndi:BPMNLabel>
612
- <dc:Bounds x="951" y="266" width="81" height="28" />
676
+ <dc:Bounds x="1151" y="266" width="81" height="28" />
613
677
  </bpmndi:BPMNLabel>
614
678
  </bpmndi:BPMNEdge>
615
679
  <bpmndi:BPMNEdge id="BPMNEdge_f_scopeBlocked" bpmnElement="f_scopeBlocked">
616
- <di:waypoint x="1191" y="145" />
617
- <di:waypoint x="1191" y="220" />
618
- <di:waypoint x="1366" y="220" />
619
- <di:waypoint x="1366" y="240" />
680
+ <di:waypoint x="1391" y="145" />
681
+ <di:waypoint x="1391" y="220" />
682
+ <di:waypoint x="1566" y="220" />
683
+ <di:waypoint x="1566" y="240" />
620
684
  <bpmndi:BPMNLabel>
621
- <dc:Bounds x="1098" y="162" width="88" height="42" />
685
+ <dc:Bounds x="1298" y="162" width="88" height="42" />
622
686
  </bpmndi:BPMNLabel>
623
687
  </bpmndi:BPMNEdge>
624
688
  <bpmndi:BPMNEdge id="BPMNEdge_f_addressed" bpmnElement="f_addressed">
625
- <di:waypoint x="441" y="145" />
626
- <di:waypoint x="441" y="600" />
627
- <di:waypoint x="591" y="600" />
689
+ <di:waypoint x="641" y="145" />
690
+ <di:waypoint x="641" y="600" />
691
+ <di:waypoint x="766" y="600" />
628
692
  <bpmndi:BPMNLabel>
629
- <dc:Bounds x="446" y="359" width="78" height="28" />
693
+ <dc:Bounds x="646" y="359" width="78" height="28" />
630
694
  </bpmndi:BPMNLabel>
631
695
  </bpmndi:BPMNEdge>
632
696
  <bpmndi:BPMNEdge id="BPMNEdge_f_waiting" bpmnElement="f_waiting">
633
- <di:waypoint x="441" y="145" />
634
- <di:waypoint x="441" y="600" />
635
- <di:waypoint x="591" y="600" />
697
+ <di:waypoint x="641" y="145" />
698
+ <di:waypoint x="641" y="600" />
699
+ <di:waypoint x="766" y="600" />
636
700
  <bpmndi:BPMNLabel>
637
- <dc:Bounds x="380" y="366" width="56" height="14" />
701
+ <dc:Bounds x="580" y="366" width="56" height="14" />
638
702
  </bpmndi:BPMNLabel>
639
703
  </bpmndi:BPMNEdge>
640
704
  <bpmndi:BPMNEdge id="BPMNEdge_f_escalate" bpmnElement="f_escalate">
641
- <di:waypoint x="441" y="145" />
642
- <di:waypoint x="441" y="1240" />
643
- <di:waypoint x="566" y="1240" />
705
+ <di:waypoint x="666" y="120" />
706
+ <di:waypoint x="746" y="120" />
707
+ <di:waypoint x="746" y="1240" />
708
+ <di:waypoint x="766" y="1240" />
644
709
  <bpmndi:BPMNLabel>
645
- <dc:Bounds x="446" y="906" width="81" height="28" />
710
+ <dc:Bounds x="751" y="666" width="81" height="28" />
646
711
  </bpmndi:BPMNLabel>
647
712
  </bpmndi:BPMNEdge>
648
713
  <bpmndi:BPMNEdge id="BPMNEdge_f_guardMax" bpmnElement="f_guardMax">
649
- <di:waypoint x="641" y="600" />
650
- <di:waypoint x="746" y="600" />
651
- <di:waypoint x="746" y="1080" />
652
- <di:waypoint x="766" y="1080" />
714
+ <di:waypoint x="1416" y="600" />
715
+ <di:waypoint x="1496" y="600" />
716
+ <di:waypoint x="1496" y="920" />
717
+ <di:waypoint x="1516" y="920" />
653
718
  <bpmndi:BPMNLabel>
654
- <dc:Bounds x="751" y="833" width="74" height="14" />
719
+ <dc:Bounds x="1417" y="753" width="74" height="14" />
655
720
  </bpmndi:BPMNLabel>
656
721
  </bpmndi:BPMNEdge>
657
722
  <bpmndi:BPMNEdge id="BPMNEdge_f_noProgress" bpmnElement="f_noProgress">
658
- <di:waypoint x="1216" y="600" />
659
- <di:waypoint x="1296" y="600" />
660
- <di:waypoint x="1296" y="920" />
661
- <di:waypoint x="1316" y="920" />
723
+ <di:waypoint x="1241" y="600" />
724
+ <di:waypoint x="1346" y="600" />
725
+ <di:waypoint x="1346" y="1080" />
726
+ <di:waypoint x="1366" y="1080" />
662
727
  <bpmndi:BPMNLabel>
663
- <dc:Bounds x="1213" y="753" width="78" height="14" />
728
+ <dc:Bounds x="1351" y="833" width="78" height="14" />
664
729
  </bpmndi:BPMNLabel>
665
730
  </bpmndi:BPMNEdge>
666
731
  <bpmndi:BPMNEdge id="BPMNEdge_f_toReviewTimeout" bpmnElement="f_toReviewTimeout">
667
- <di:waypoint x="1366" y="625" />
668
- <di:waypoint x="1366" y="760" />
669
- <di:waypoint x="1516" y="760" />
732
+ <di:waypoint x="1566" y="625" />
733
+ <di:waypoint x="1566" y="760" />
734
+ <di:waypoint x="1716" y="760" />
670
735
  </bpmndi:BPMNEdge>
671
736
  <bpmndi:BPMNEdge id="BPMNEdge_f_scopeEscGate" bpmnElement="f_scopeEscGate">
672
- <di:waypoint x="1416" y="280" />
673
- <di:waypoint x="1852" y="280" />
737
+ <di:waypoint x="1616" y="280" />
738
+ <di:waypoint x="2052" y="280" />
674
739
  </bpmndi:BPMNEdge>
675
740
  <bpmndi:BPMNEdge id="BPMNEdge_f_blockedGate" bpmnElement="f_blockedGate">
676
- <di:waypoint x="1066" y="440" />
677
- <di:waypoint x="1877" y="440" />
678
- <di:waypoint x="1877" y="305" />
679
- </bpmndi:BPMNEdge>
680
- <bpmndi:BPMNEdge id="BPMNEdge_f_noprogressGate" bpmnElement="f_noprogressGate">
681
- <di:waypoint x="1416" y="920" />
682
- <di:waypoint x="1877" y="920" />
683
- <di:waypoint x="1877" y="305" />
741
+ <di:waypoint x="1266" y="440" />
742
+ <di:waypoint x="2077" y="440" />
743
+ <di:waypoint x="2077" y="305" />
684
744
  </bpmndi:BPMNEdge>
685
745
  <bpmndi:BPMNEdge id="BPMNEdge_f_reviewStalled" bpmnElement="f_reviewStalled">
686
- <di:waypoint x="1552" y="760" />
687
- <di:waypoint x="1652" y="760" />
746
+ <di:waypoint x="1752" y="760" />
747
+ <di:waypoint x="1852" y="760" />
688
748
  </bpmndi:BPMNEdge>
689
749
  <bpmndi:BPMNEdge id="BPMNEdge_f_stalledGate" bpmnElement="f_stalledGate">
690
- <di:waypoint x="1752" y="760" />
691
- <di:waypoint x="1877" y="760" />
692
- <di:waypoint x="1877" y="305" />
750
+ <di:waypoint x="1952" y="760" />
751
+ <di:waypoint x="2077" y="760" />
752
+ <di:waypoint x="2077" y="305" />
693
753
  </bpmndi:BPMNEdge>
694
754
  <bpmndi:BPMNEdge id="BPMNEdge_f_escGate" bpmnElement="f_escGate">
695
- <di:waypoint x="666" y="1240" />
696
- <di:waypoint x="1877" y="1240" />
697
- <di:waypoint x="1877" y="305" />
755
+ <di:waypoint x="866" y="1240" />
756
+ <di:waypoint x="2077" y="1240" />
757
+ <di:waypoint x="2077" y="305" />
698
758
  </bpmndi:BPMNEdge>
699
759
  <bpmndi:BPMNEdge id="BPMNEdge_f_escWait" bpmnElement="f_escWait">
700
- <di:waypoint x="1902" y="280" />
701
- <di:waypoint x="2002" y="280" />
760
+ <di:waypoint x="2102" y="280" />
761
+ <di:waypoint x="2202" y="280" />
702
762
  </bpmndi:BPMNEdge>
703
763
  <bpmndi:BPMNEdge id="BPMNEdge_f_maxGate" bpmnElement="f_maxGate">
704
- <di:waypoint x="866" y="1080" />
705
- <di:waypoint x="1877" y="1080" />
706
- <di:waypoint x="1877" y="305" />
764
+ <di:waypoint x="1616" y="920" />
765
+ <di:waypoint x="2077" y="920" />
766
+ <di:waypoint x="2077" y="305" />
707
767
  </bpmndi:BPMNEdge>
708
768
  <bpmndi:BPMNEdge id="BPMNEdge_f_answerRecord" bpmnElement="f_answerRecord">
709
- <di:waypoint x="2102" y="280" />
710
- <di:waypoint x="2202" y="280" />
769
+ <di:waypoint x="2302" y="280" />
770
+ <di:waypoint x="2402" y="280" />
771
+ </bpmndi:BPMNEdge>
772
+ <bpmndi:BPMNEdge id="BPMNEdge_f_huskRetry" bpmnElement="f_huskRetry">
773
+ <di:waypoint x="1391" y="1105" />
774
+ <di:waypoint x="1391" y="1125" />
775
+ <di:waypoint x="266" y="1125" />
776
+ <di:waypoint x="266" y="160" />
777
+ <bpmndi:BPMNLabel>
778
+ <dc:Bounds x="788" y="1092" width="82" height="28" />
779
+ </bpmndi:BPMNLabel>
711
780
  </bpmndi:BPMNEdge>
712
781
  <bpmndi:BPMNEdge id="BPMNEdge_f_answerLoop" bpmnElement="f_answerLoop">
713
- <di:waypoint x="2252" y="320" />
714
- <di:waypoint x="2252" y="340" />
782
+ <di:waypoint x="2452" y="320" />
783
+ <di:waypoint x="2452" y="340" />
715
784
  <di:waypoint x="266" y="340" />
716
785
  <di:waypoint x="266" y="160" />
717
786
  </bpmndi:BPMNEdge>