@nanobpm/nano-workforce 0.187.5 → 0.188.0

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.
@@ -65,6 +65,8 @@
65
65
  <nano:shape id="PrConvergeGateOut" name="Converge gate — result">
66
66
  <nano:extend name="convergeBlocked" type="boolean" />
67
67
  <nano:extend name="convergeBlockReason" type="string" optional="true" />
68
+ <nano:extend name="convergeAckOnly" type="boolean" optional="true" />
69
+ <nano:extend name="reviewStale" type="boolean" optional="true" />
68
70
  </nano:shape>
69
71
  <nano:shape id="EscalationIn" name="Record escalation — input">
70
72
  <nano:extend name="prKey" type="string" />
@@ -144,6 +146,7 @@
144
146
  <bpmn:incoming>f_reviewLoop</bpmn:incoming>
145
147
  <bpmn:incoming>f_answerLoop</bpmn:incoming>
146
148
  <bpmn:incoming>f_huskRetry</bpmn:incoming>
149
+ <bpmn:incoming>f_ackRetry</bpmn:incoming>
147
150
  <bpmn:outgoing>f_capture</bpmn:outgoing>
148
151
  </bpmn:serviceTask>
149
152
  <bpmn:exclusiveGateway id="gw-status" name="status?" default="f_addressed">
@@ -168,6 +171,7 @@
168
171
  <bpmn:incoming>f_addressed</bpmn:incoming>
169
172
  <bpmn:incoming>f_waiting</bpmn:incoming>
170
173
  <bpmn:incoming>f_escReenter</bpmn:incoming>
174
+ <bpmn:incoming>f_convergeStale</bpmn:incoming>
171
175
  <bpmn:outgoing>f_roundWait</bpmn:outgoing>
172
176
  </bpmn:serviceTask>
173
177
  <bpmn:serviceTask id="check-progress" name="Check progress">
@@ -216,6 +220,7 @@
216
220
  <bpmn:extensionElements>
217
221
  <zeebe:ioMapping>
218
222
  <zeebe:output source="=round + 1" target="round" />
223
+ <zeebe:output source="=false" target="reviewStale" />
219
224
  </zeebe:ioMapping>
220
225
  </bpmn:extensionElements>
221
226
  <bpmn:incoming>f_toReviewWait</bpmn:incoming>
@@ -305,6 +310,7 @@
305
310
  <zeebe:input source="=answer" target="answer" />
306
311
  <zeebe:output source="=(if scopePending = true then answer else scopeAnswer)" target="scopeAnswer" />
307
312
  <zeebe:output source="=0" target="huskRetries" />
313
+ <zeebe:output source="=false" target="reviewStale" />
308
314
  </zeebe:ioMapping>
309
315
  </bpmn:extensionElements>
310
316
  <bpmn:incoming>f_answerRecord</bpmn:incoming>
@@ -327,6 +333,9 @@
327
333
  <zeebe:property name="io.nanobpm.dataEnvelope.in" value="PrConvergeGateIn" />
328
334
  <zeebe:property name="io.nanobpm.dataEnvelope.out" value="PrConvergeGateOut" />
329
335
  </zeebe:properties>
336
+ <zeebe:ioMapping>
337
+ <zeebe:output source="=if convergeBlocked = true and convergeAckOnly = true then ackRetryRound + 1 else ackRetryRound" target="ackRetryRound" />
338
+ </zeebe:ioMapping>
330
339
  </bpmn:extensionElements>
331
340
  <bpmn:incoming>f_converged</bpmn:incoming>
332
341
  <bpmn:outgoing>f_toConvergeGate</bpmn:outgoing>
@@ -334,8 +343,14 @@
334
343
  <bpmn:exclusiveGateway id="gw-converge-gate" name="comments addressed?" default="f_convergeOk">
335
344
  <bpmn:incoming>f_toConvergeGate</bpmn:incoming>
336
345
  <bpmn:outgoing>f_convergeBlocked</bpmn:outgoing>
346
+ <bpmn:outgoing>f_convergeStale</bpmn:outgoing>
337
347
  <bpmn:outgoing>f_convergeOk</bpmn:outgoing>
338
348
  </bpmn:exclusiveGateway>
349
+ <bpmn:exclusiveGateway id="gw-ack-retry" name="auto-ack within budget?" default="f_ackEscalate">
350
+ <bpmn:incoming>f_convergeBlocked</bpmn:incoming>
351
+ <bpmn:outgoing>f_ackRetry</bpmn:outgoing>
352
+ <bpmn:outgoing>f_ackEscalate</bpmn:outgoing>
353
+ </bpmn:exclusiveGateway>
339
354
  <bpmn:serviceTask id="persist-escalation-blockedcomments" name="Escalate: unaddressed comments">
340
355
  <bpmn:extensionElements>
341
356
  <zeebe:taskDefinition type="pr.persist-escalation" />
@@ -349,7 +364,7 @@
349
364
  <zeebe:input source="=convergeBlockReason" target="question" />
350
365
  </zeebe:ioMapping>
351
366
  </bpmn:extensionElements>
352
- <bpmn:incoming>f_convergeBlocked</bpmn:incoming>
367
+ <bpmn:incoming>f_ackEscalate</bpmn:incoming>
353
368
  <bpmn:outgoing>f_blockedGate</bpmn:outgoing>
354
369
  </bpmn:serviceTask>
355
370
  <bpmn:serviceTask id="classify-scope" name="Scope classifier (agent)">
@@ -402,9 +417,16 @@
402
417
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=status = "converged"</bpmn:conditionExpression>
403
418
  </bpmn:sequenceFlow>
404
419
  <bpmn:sequenceFlow id="f_toConvergeGate" sourceRef="check-converge" targetRef="gw-converge-gate" />
405
- <bpmn:sequenceFlow id="f_convergeBlocked" name="unaddressed comments" sourceRef="gw-converge-gate" targetRef="persist-escalation-blockedcomments">
420
+ <bpmn:sequenceFlow id="f_convergeBlocked" name="unaddressed comments" sourceRef="gw-converge-gate" targetRef="gw-ack-retry">
406
421
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=convergeBlocked = true</bpmn:conditionExpression>
407
422
  </bpmn:sequenceFlow>
423
+ <bpmn:sequenceFlow id="f_ackRetry" name="ack-only within budget" sourceRef="gw-ack-retry" targetRef="capture-head">
424
+ <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=convergeAckOnly = true and ackRetryRound &lt;= ackRetryMax</bpmn:conditionExpression>
425
+ </bpmn:sequenceFlow>
426
+ <bpmn:sequenceFlow id="f_ackEscalate" name="threads / budget exhausted" sourceRef="gw-ack-retry" targetRef="persist-escalation-blockedcomments" />
427
+ <bpmn:sequenceFlow id="f_convergeStale" name="review stale" sourceRef="gw-converge-gate" targetRef="persist-round">
428
+ <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=reviewStale = true</bpmn:conditionExpression>
429
+ </bpmn:sequenceFlow>
408
430
  <bpmn:sequenceFlow id="f_convergeOk" name="addressed / default" sourceRef="gw-converge-gate" targetRef="classify-scope" />
409
431
  <bpmn:sequenceFlow id="f_toScopeGate" sourceRef="classify-scope" targetRef="gw-scope-gate" />
410
432
  <bpmn:sequenceFlow id="f_scopeBlocked" name="scope under-delivered" sourceRef="gw-scope-gate" targetRef="persist-escalation-scope">
@@ -421,7 +443,7 @@
421
443
  <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=(status = "needs_input" or status = "blocked") and question != null and trim(question) != ""</bpmn:conditionExpression>
422
444
  </bpmn:sequenceFlow>
423
445
  <bpmn:sequenceFlow id="f_guardMax" name="max rounds" sourceRef="gw-guard" targetRef="persist-escalation-maxrounds">
424
- <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=round &gt;= maxRounds</bpmn:conditionExpression>
446
+ <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=round &gt;= maxRounds and reviewStale != true</bpmn:conditionExpression>
425
447
  </bpmn:sequenceFlow>
426
448
  <bpmn:sequenceFlow id="f_guardOk" name="continue" sourceRef="gw-guard" targetRef="gw-review-wait" />
427
449
  <bpmn:sequenceFlow id="f_roundWait" sourceRef="persist-round" targetRef="check-progress" />
@@ -471,70 +493,70 @@
471
493
  </bpmndi:BPMNLabel>
472
494
  </bpmndi:BPMNShape>
473
495
  <bpmndi:BPMNShape id="BPMNShape_gw-guard" bpmnElement="gw-guard" isMarkerVisible="true">
474
- <dc:Bounds x="1366" y="575" width="50" height="50" />
496
+ <dc:Bounds x="1716" y="575" width="50" height="50" />
475
497
  <bpmndi:BPMNLabel>
476
- <dc:Bounds x="1349" y="556" width="85" height="14" />
498
+ <dc:Bounds x="1699" y="556" width="85" height="14" />
477
499
  </bpmndi:BPMNLabel>
478
500
  </bpmndi:BPMNShape>
479
501
  <bpmndi:BPMNShape id="BPMNShape_persist-round" bpmnElement="persist-round">
480
- <dc:Bounds x="766" y="560" width="100" height="80" />
502
+ <dc:Bounds x="1116" y="560" width="100" height="80" />
481
503
  </bpmndi:BPMNShape>
482
504
  <bpmndi:BPMNShape id="BPMNShape_check-progress" bpmnElement="check-progress">
483
- <dc:Bounds x="966" y="560" width="100" height="80" />
505
+ <dc:Bounds x="1316" y="560" width="100" height="80" />
484
506
  </bpmndi:BPMNShape>
485
507
  <bpmndi:BPMNShape id="BPMNShape_gw-progress" bpmnElement="gw-progress" isMarkerVisible="true">
486
- <dc:Bounds x="1191" y="575" width="50" height="50" />
508
+ <dc:Bounds x="1541" y="575" width="50" height="50" />
487
509
  <bpmndi:BPMNLabel>
488
- <dc:Bounds x="1186" y="542" width="60" height="28" />
510
+ <dc:Bounds x="1536" y="542" width="60" height="28" />
489
511
  </bpmndi:BPMNLabel>
490
512
  </bpmndi:BPMNShape>
491
513
  <bpmndi:BPMNShape id="BPMNShape_gw-husk" bpmnElement="gw-husk" isMarkerVisible="true">
492
- <dc:Bounds x="1366" y="1055" width="50" height="50" />
514
+ <dc:Bounds x="1716" y="1055" width="50" height="50" />
493
515
  <bpmndi:BPMNLabel>
494
- <dc:Bounds x="1351" y="1022" width="81" height="28" />
516
+ <dc:Bounds x="1701" y="1022" width="81" height="28" />
495
517
  </bpmndi:BPMNLabel>
496
518
  </bpmndi:BPMNShape>
497
519
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-noprogress" bpmnElement="persist-escalation-noprogress">
498
- <dc:Bounds x="1516" y="1040" width="100" height="80" />
520
+ <dc:Bounds x="1866" y="1040" width="100" height="80" />
499
521
  </bpmndi:BPMNShape>
500
522
  <bpmndi:BPMNShape id="BPMNShape_gw-review-wait" bpmnElement="gw-review-wait" isMarkerVisible="true">
501
- <dc:Bounds x="1541" y="575" width="50" height="50" />
523
+ <dc:Bounds x="1891" y="575" width="50" height="50" />
502
524
  <bpmndi:BPMNLabel>
503
- <dc:Bounds x="1522" y="542" width="88" height="28" />
525
+ <dc:Bounds x="1872" y="542" width="88" height="28" />
504
526
  </bpmndi:BPMNLabel>
505
527
  </bpmndi:BPMNShape>
506
528
  <bpmndi:BPMNShape id="BPMNShape_wait-review" bpmnElement="wait-review">
507
- <dc:Bounds x="1716" y="582" width="36" height="36" />
529
+ <dc:Bounds x="2066" y="582" width="36" height="36" />
508
530
  <bpmndi:BPMNLabel>
509
- <dc:Bounds x="1690" y="549" width="88" height="28" />
531
+ <dc:Bounds x="2040" y="549" width="88" height="28" />
510
532
  </bpmndi:BPMNLabel>
511
533
  </bpmndi:BPMNShape>
512
534
  <bpmndi:BPMNShape id="BPMNShape_wait-review-timeout" bpmnElement="wait-review-timeout">
513
- <dc:Bounds x="1716" y="742" width="36" height="36" />
535
+ <dc:Bounds x="2066" y="742" width="36" height="36" />
514
536
  <bpmndi:BPMNLabel>
515
- <dc:Bounds x="1706" y="783" width="56" height="42" />
537
+ <dc:Bounds x="2056" y="783" width="56" height="42" />
516
538
  </bpmndi:BPMNLabel>
517
539
  </bpmndi:BPMNShape>
518
540
  <bpmndi:BPMNShape id="BPMNShape_persist-review-stalled" bpmnElement="persist-review-stalled">
519
- <dc:Bounds x="1852" y="720" width="100" height="80" />
541
+ <dc:Bounds x="2202" y="720" width="100" height="80" />
520
542
  </bpmndi:BPMNShape>
521
543
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation" bpmnElement="persist-escalation">
522
544
  <dc:Bounds x="766" y="1200" width="100" height="80" />
523
545
  </bpmndi:BPMNShape>
524
546
  <bpmndi:BPMNShape id="BPMNShape_gw-escalated" bpmnElement="gw-escalated" isMarkerVisible="true">
525
- <dc:Bounds x="2052" y="255" width="50" height="50" />
547
+ <dc:Bounds x="2402" y="255" width="50" height="50" />
526
548
  <bpmndi:BPMNLabel>
527
- <dc:Bounds x="1960" y="290" width="74" height="28" />
549
+ <dc:Bounds x="2390" y="222" width="74" height="28" />
528
550
  </bpmndi:BPMNLabel>
529
551
  </bpmndi:BPMNShape>
530
552
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-maxrounds" bpmnElement="persist-escalation-maxrounds">
531
- <dc:Bounds x="1516" y="880" width="100" height="80" />
553
+ <dc:Bounds x="1866" y="880" width="100" height="80" />
532
554
  </bpmndi:BPMNShape>
533
555
  <bpmndi:BPMNShape id="BPMNShape_wait-answer" bpmnElement="wait-answer">
534
- <dc:Bounds x="2202" y="240" width="100" height="80" />
556
+ <dc:Bounds x="2552" y="240" width="100" height="80" />
535
557
  </bpmndi:BPMNShape>
536
558
  <bpmndi:BPMNShape id="BPMNShape_record-answer" bpmnElement="record-answer">
537
- <dc:Bounds x="2402" y="240" width="100" height="80" />
559
+ <dc:Bounds x="2752" y="240" width="100" height="80" />
538
560
  </bpmndi:BPMNShape>
539
561
  <bpmndi:BPMNShape id="BPMNShape_persist-converged" bpmnElement="persist-converged">
540
562
  <dc:Bounds x="1516" y="80" width="100" height="80" />
@@ -543,30 +565,36 @@
543
565
  <dc:Bounds x="766" y="80" width="100" height="80" />
544
566
  </bpmndi:BPMNShape>
545
567
  <bpmndi:BPMNShape id="BPMNShape_gw-converge-gate" bpmnElement="gw-converge-gate" isMarkerVisible="true">
546
- <dc:Bounds x="991" y="95" width="50" height="50" />
568
+ <dc:Bounds x="966" y="95" width="50" height="50" />
569
+ <bpmndi:BPMNLabel>
570
+ <dc:Bounds x="954" y="62" width="74" height="28" />
571
+ </bpmndi:BPMNLabel>
572
+ </bpmndi:BPMNShape>
573
+ <bpmndi:BPMNShape id="BPMNShape_gw-ack-retry" bpmnElement="gw-ack-retry" isMarkerVisible="true">
574
+ <dc:Bounds x="1141" y="415" width="50" height="50" />
547
575
  <bpmndi:BPMNLabel>
548
- <dc:Bounds x="979" y="150" width="74" height="28" />
576
+ <dc:Bounds x="1136" y="368" width="60" height="42" />
549
577
  </bpmndi:BPMNLabel>
550
578
  </bpmndi:BPMNShape>
551
579
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-blockedcomments" bpmnElement="persist-escalation-blockedcomments">
552
- <dc:Bounds x="1166" y="400" width="100" height="80" />
580
+ <dc:Bounds x="1316" y="400" width="100" height="80" />
553
581
  </bpmndi:BPMNShape>
554
582
  <bpmndi:BPMNShape id="BPMNShape_classify-scope" bpmnElement="classify-scope">
555
- <dc:Bounds x="1166" y="80" width="100" height="80" />
583
+ <dc:Bounds x="1116" y="80" width="100" height="80" />
556
584
  </bpmndi:BPMNShape>
557
585
  <bpmndi:BPMNShape id="BPMNShape_gw-scope-gate" bpmnElement="gw-scope-gate" isMarkerVisible="true">
558
- <dc:Bounds x="1366" y="95" width="50" height="50" />
586
+ <dc:Bounds x="1341" y="95" width="50" height="50" />
559
587
  <bpmndi:BPMNLabel>
560
- <dc:Bounds x="1354" y="62" width="74" height="28" />
588
+ <dc:Bounds x="1329" y="62" width="74" height="28" />
561
589
  </bpmndi:BPMNLabel>
562
590
  </bpmndi:BPMNShape>
563
591
  <bpmndi:BPMNShape id="BPMNShape_persist-escalation-scope" bpmnElement="persist-escalation-scope">
564
592
  <dc:Bounds x="1516" y="240" width="100" height="80" />
565
593
  </bpmndi:BPMNShape>
566
594
  <bpmndi:BPMNShape id="BPMNShape_End" bpmnElement="End">
567
- <dc:Bounds x="1716" y="102" width="36" height="36" />
595
+ <dc:Bounds x="1723" y="102" width="36" height="36" />
568
596
  <bpmndi:BPMNLabel>
569
- <dc:Bounds x="1700" y="143" width="69" height="14" />
597
+ <dc:Bounds x="1707" y="143" width="69" height="14" />
570
598
  </bpmndi:BPMNLabel>
571
599
  </bpmndi:BPMNShape>
572
600
  <bpmndi:BPMNEdge id="BPMNEdge_f_start" bpmnElement="f_start">
@@ -585,110 +613,128 @@
585
613
  <di:waypoint x="666" y="120" />
586
614
  <di:waypoint x="766" y="120" />
587
615
  <bpmndi:BPMNLabel>
588
- <dc:Bounds x="673" y="128" width="67" height="14" />
616
+ <dc:Bounds x="683" y="98" width="67" height="14" />
589
617
  </bpmndi:BPMNLabel>
590
618
  </bpmndi:BPMNEdge>
591
619
  <bpmndi:BPMNEdge id="BPMNEdge_f_toConvergeGate" bpmnElement="f_toConvergeGate">
592
620
  <di:waypoint x="866" y="120" />
593
- <di:waypoint x="991" y="120" />
621
+ <di:waypoint x="966" y="120" />
594
622
  </bpmndi:BPMNEdge>
595
623
  <bpmndi:BPMNEdge id="BPMNEdge_f_convergeOk" bpmnElement="f_convergeOk">
596
- <di:waypoint x="1041" y="120" />
597
- <di:waypoint x="1166" y="120" />
624
+ <di:waypoint x="1016" y="120" />
625
+ <di:waypoint x="1116" y="120" />
598
626
  <bpmndi:BPMNLabel>
599
- <dc:Bounds x="1055" y="87" width="78" height="28" />
627
+ <dc:Bounds x="1027" y="125" width="78" height="28" />
600
628
  </bpmndi:BPMNLabel>
601
629
  </bpmndi:BPMNEdge>
602
630
  <bpmndi:BPMNEdge id="BPMNEdge_f_toScopeGate" bpmnElement="f_toScopeGate">
603
- <di:waypoint x="1266" y="120" />
604
- <di:waypoint x="1366" y="120" />
631
+ <di:waypoint x="1216" y="120" />
632
+ <di:waypoint x="1341" y="120" />
605
633
  </bpmndi:BPMNEdge>
606
634
  <bpmndi:BPMNEdge id="BPMNEdge_f_scopeOk" bpmnElement="f_scopeOk">
607
- <di:waypoint x="1416" y="120" />
635
+ <di:waypoint x="1391" y="120" />
608
636
  <di:waypoint x="1516" y="120" />
609
637
  <bpmndi:BPMNLabel>
610
- <dc:Bounds x="1427" y="125" width="78" height="42" />
638
+ <dc:Bounds x="1415" y="73" width="78" height="42" />
611
639
  </bpmndi:BPMNLabel>
612
640
  </bpmndi:BPMNEdge>
613
641
  <bpmndi:BPMNEdge id="BPMNEdge_f_finalize" bpmnElement="f_finalize">
614
642
  <di:waypoint x="1616" y="120" />
615
- <di:waypoint x="1716" y="120" />
643
+ <di:waypoint x="1723" y="120" />
644
+ </bpmndi:BPMNEdge>
645
+ <bpmndi:BPMNEdge id="BPMNEdge_f_ackEscalate" bpmnElement="f_ackEscalate">
646
+ <di:waypoint x="1191" y="440" />
647
+ <di:waypoint x="1316" y="440" />
648
+ <bpmndi:BPMNLabel>
649
+ <dc:Bounds x="1220" y="393" width="67" height="42" />
650
+ </bpmndi:BPMNLabel>
651
+ </bpmndi:BPMNEdge>
652
+ <bpmndi:BPMNEdge id="BPMNEdge_f_blockedGate" bpmnElement="f_blockedGate">
653
+ <di:waypoint x="1416" y="440" />
654
+ <di:waypoint x="2427" y="440" />
655
+ <di:waypoint x="2427" y="305" />
616
656
  </bpmndi:BPMNEdge>
617
657
  <bpmndi:BPMNEdge id="BPMNEdge_f_guardOk" bpmnElement="f_guardOk">
618
- <di:waypoint x="1416" y="600" />
619
- <di:waypoint x="1541" y="600" />
658
+ <di:waypoint x="1766" y="600" />
659
+ <di:waypoint x="1891" y="600" />
620
660
  <bpmndi:BPMNLabel>
621
- <dc:Bounds x="1426" y="608" width="60" height="14" />
661
+ <dc:Bounds x="1776" y="608" width="60" height="14" />
622
662
  </bpmndi:BPMNLabel>
623
663
  </bpmndi:BPMNEdge>
624
664
  <bpmndi:BPMNEdge id="BPMNEdge_f_roundWait" bpmnElement="f_roundWait">
625
- <di:waypoint x="866" y="600" />
626
- <di:waypoint x="966" y="600" />
665
+ <di:waypoint x="1216" y="600" />
666
+ <di:waypoint x="1316" y="600" />
627
667
  </bpmndi:BPMNEdge>
628
668
  <bpmndi:BPMNEdge id="BPMNEdge_f_checkGate" bpmnElement="f_checkGate">
629
- <di:waypoint x="1066" y="600" />
630
- <di:waypoint x="1191" y="600" />
669
+ <di:waypoint x="1416" y="600" />
670
+ <di:waypoint x="1541" y="600" />
631
671
  </bpmndi:BPMNEdge>
632
672
  <bpmndi:BPMNEdge id="BPMNEdge_f_huskEscalate" bpmnElement="f_huskEscalate">
633
- <di:waypoint x="1416" y="1080" />
634
- <di:waypoint x="1516" y="1080" />
673
+ <di:waypoint x="1766" y="1080" />
674
+ <di:waypoint x="1866" y="1080" />
635
675
  <bpmndi:BPMNLabel>
636
- <dc:Bounds x="1436" y="1088" width="60" height="14" />
676
+ <dc:Bounds x="1786" y="1088" width="60" height="14" />
637
677
  </bpmndi:BPMNLabel>
638
678
  </bpmndi:BPMNEdge>
639
679
  <bpmndi:BPMNEdge id="BPMNEdge_f_progressOk" bpmnElement="f_progressOk">
640
- <di:waypoint x="1241" y="600" />
641
- <di:waypoint x="1366" y="600" />
680
+ <di:waypoint x="1591" y="600" />
681
+ <di:waypoint x="1716" y="600" />
642
682
  <bpmndi:BPMNLabel>
643
- <dc:Bounds x="1258" y="567" width="71" height="28" />
683
+ <dc:Bounds x="1608" y="567" width="71" height="28" />
644
684
  </bpmndi:BPMNLabel>
645
685
  </bpmndi:BPMNEdge>
646
686
  <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" />
687
+ <di:waypoint x="1966" y="1080" />
688
+ <di:waypoint x="2427" y="1080" />
689
+ <di:waypoint x="2427" y="305" />
650
690
  </bpmndi:BPMNEdge>
651
691
  <bpmndi:BPMNEdge id="BPMNEdge_f_toReviewWait" bpmnElement="f_toReviewWait">
652
- <di:waypoint x="1591" y="600" />
653
- <di:waypoint x="1716" y="600" />
692
+ <di:waypoint x="1941" y="600" />
693
+ <di:waypoint x="2066" y="600" />
654
694
  </bpmndi:BPMNEdge>
655
695
  <bpmndi:BPMNEdge id="BPMNEdge_f_reviewLoop" bpmnElement="f_reviewLoop">
656
- <di:waypoint x="1734" y="618" />
657
- <di:waypoint x="1734" y="660" />
696
+ <di:waypoint x="2084" y="618" />
697
+ <di:waypoint x="2084" y="660" />
658
698
  <di:waypoint x="266" y="660" />
659
699
  <di:waypoint x="266" y="160" />
660
700
  </bpmndi:BPMNEdge>
661
701
  <bpmndi:BPMNEdge id="BPMNEdge_f_escReenter" bpmnElement="f_escReenter">
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" />
702
+ <di:waypoint x="2427" y="305" />
703
+ <di:waypoint x="2427" y="660" />
704
+ <di:waypoint x="1166" y="660" />
705
+ <di:waypoint x="1166" y="640" />
666
706
  <bpmndi:BPMNLabel>
667
- <dc:Bounds x="1067" y="173" width="74" height="42" />
707
+ <dc:Bounds x="2219" y="613" width="74" height="42" />
668
708
  </bpmndi:BPMNLabel>
669
709
  </bpmndi:BPMNEdge>
670
710
  <bpmndi:BPMNEdge id="BPMNEdge_f_convergeBlocked" bpmnElement="f_convergeBlocked">
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" />
711
+ <di:waypoint x="991" y="145" />
712
+ <di:waypoint x="991" y="440" />
713
+ <di:waypoint x="1141" y="440" />
675
714
  <bpmndi:BPMNLabel>
676
- <dc:Bounds x="1151" y="266" width="81" height="28" />
715
+ <dc:Bounds x="1026" y="407" width="81" height="28" />
716
+ </bpmndi:BPMNLabel>
717
+ </bpmndi:BPMNEdge>
718
+ <bpmndi:BPMNEdge id="BPMNEdge_f_convergeStale" bpmnElement="f_convergeStale">
719
+ <di:waypoint x="991" y="145" />
720
+ <di:waypoint x="991" y="600" />
721
+ <di:waypoint x="1116" y="600" />
722
+ <bpmndi:BPMNLabel>
723
+ <dc:Bounds x="996" y="513" width="88" height="14" />
677
724
  </bpmndi:BPMNLabel>
678
725
  </bpmndi:BPMNEdge>
679
726
  <bpmndi:BPMNEdge id="BPMNEdge_f_scopeBlocked" bpmnElement="f_scopeBlocked">
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" />
727
+ <di:waypoint x="1366" y="145" />
728
+ <di:waypoint x="1366" y="280" />
729
+ <di:waypoint x="1516" y="280" />
684
730
  <bpmndi:BPMNLabel>
685
- <dc:Bounds x="1298" y="162" width="88" height="42" />
731
+ <dc:Bounds x="1371" y="192" width="88" height="42" />
686
732
  </bpmndi:BPMNLabel>
687
733
  </bpmndi:BPMNEdge>
688
734
  <bpmndi:BPMNEdge id="BPMNEdge_f_addressed" bpmnElement="f_addressed">
689
735
  <di:waypoint x="641" y="145" />
690
736
  <di:waypoint x="641" y="600" />
691
- <di:waypoint x="766" y="600" />
737
+ <di:waypoint x="1116" y="600" />
692
738
  <bpmndi:BPMNLabel>
693
739
  <dc:Bounds x="646" y="359" width="78" height="28" />
694
740
  </bpmndi:BPMNLabel>
@@ -696,91 +742,100 @@
696
742
  <bpmndi:BPMNEdge id="BPMNEdge_f_waiting" bpmnElement="f_waiting">
697
743
  <di:waypoint x="641" y="145" />
698
744
  <di:waypoint x="641" y="600" />
699
- <di:waypoint x="766" y="600" />
745
+ <di:waypoint x="1116" y="600" />
700
746
  <bpmndi:BPMNLabel>
701
747
  <dc:Bounds x="580" y="366" width="56" height="14" />
702
748
  </bpmndi:BPMNLabel>
703
749
  </bpmndi:BPMNEdge>
704
750
  <bpmndi:BPMNEdge id="BPMNEdge_f_escalate" bpmnElement="f_escalate">
705
- <di:waypoint x="666" y="120" />
706
- <di:waypoint x="746" y="120" />
707
- <di:waypoint x="746" y="1240" />
751
+ <di:waypoint x="641" y="145" />
752
+ <di:waypoint x="641" y="1240" />
708
753
  <di:waypoint x="766" y="1240" />
709
754
  <bpmndi:BPMNLabel>
710
- <dc:Bounds x="751" y="666" width="81" height="28" />
755
+ <dc:Bounds x="646" y="906" width="81" height="28" />
711
756
  </bpmndi:BPMNLabel>
712
757
  </bpmndi:BPMNEdge>
713
758
  <bpmndi:BPMNEdge id="BPMNEdge_f_guardMax" bpmnElement="f_guardMax">
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" />
759
+ <di:waypoint x="1766" y="600" />
760
+ <di:waypoint x="1846" y="600" />
761
+ <di:waypoint x="1846" y="920" />
762
+ <di:waypoint x="1866" y="920" />
718
763
  <bpmndi:BPMNLabel>
719
- <dc:Bounds x="1417" y="753" width="74" height="14" />
764
+ <dc:Bounds x="1767" y="753" width="74" height="14" />
720
765
  </bpmndi:BPMNLabel>
721
766
  </bpmndi:BPMNEdge>
722
767
  <bpmndi:BPMNEdge id="BPMNEdge_f_noProgress" bpmnElement="f_noProgress">
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" />
768
+ <di:waypoint x="1591" y="600" />
769
+ <di:waypoint x="1696" y="600" />
770
+ <di:waypoint x="1696" y="1080" />
771
+ <di:waypoint x="1716" y="1080" />
727
772
  <bpmndi:BPMNLabel>
728
- <dc:Bounds x="1351" y="833" width="78" height="14" />
773
+ <dc:Bounds x="1701" y="833" width="78" height="14" />
729
774
  </bpmndi:BPMNLabel>
730
775
  </bpmndi:BPMNEdge>
731
776
  <bpmndi:BPMNEdge id="BPMNEdge_f_toReviewTimeout" bpmnElement="f_toReviewTimeout">
732
- <di:waypoint x="1566" y="625" />
733
- <di:waypoint x="1566" y="760" />
734
- <di:waypoint x="1716" y="760" />
777
+ <di:waypoint x="1916" y="625" />
778
+ <di:waypoint x="1916" y="760" />
779
+ <di:waypoint x="2066" y="760" />
735
780
  </bpmndi:BPMNEdge>
736
781
  <bpmndi:BPMNEdge id="BPMNEdge_f_scopeEscGate" bpmnElement="f_scopeEscGate">
737
782
  <di:waypoint x="1616" y="280" />
738
- <di:waypoint x="2052" y="280" />
739
- </bpmndi:BPMNEdge>
740
- <bpmndi:BPMNEdge id="BPMNEdge_f_blockedGate" bpmnElement="f_blockedGate">
741
- <di:waypoint x="1266" y="440" />
742
- <di:waypoint x="2077" y="440" />
743
- <di:waypoint x="2077" y="305" />
783
+ <di:waypoint x="2402" y="280" />
744
784
  </bpmndi:BPMNEdge>
745
785
  <bpmndi:BPMNEdge id="BPMNEdge_f_reviewStalled" bpmnElement="f_reviewStalled">
746
- <di:waypoint x="1752" y="760" />
747
- <di:waypoint x="1852" y="760" />
786
+ <di:waypoint x="2102" y="760" />
787
+ <di:waypoint x="2202" y="760" />
748
788
  </bpmndi:BPMNEdge>
749
789
  <bpmndi:BPMNEdge id="BPMNEdge_f_stalledGate" bpmnElement="f_stalledGate">
750
- <di:waypoint x="1952" y="760" />
751
- <di:waypoint x="2077" y="760" />
752
- <di:waypoint x="2077" y="305" />
790
+ <di:waypoint x="2302" y="760" />
791
+ <di:waypoint x="2472" y="760" />
792
+ <di:waypoint x="2472" y="305" />
793
+ <di:waypoint x="2472" y="280" />
794
+ <di:waypoint x="2452" y="280" />
753
795
  </bpmndi:BPMNEdge>
754
796
  <bpmndi:BPMNEdge id="BPMNEdge_f_escGate" bpmnElement="f_escGate">
755
797
  <di:waypoint x="866" y="1240" />
756
- <di:waypoint x="2077" y="1240" />
757
- <di:waypoint x="2077" y="305" />
798
+ <di:waypoint x="2472" y="1240" />
799
+ <di:waypoint x="2472" y="305" />
800
+ <di:waypoint x="2472" y="280" />
801
+ <di:waypoint x="2452" y="280" />
758
802
  </bpmndi:BPMNEdge>
759
803
  <bpmndi:BPMNEdge id="BPMNEdge_f_escWait" bpmnElement="f_escWait">
760
- <di:waypoint x="2102" y="280" />
761
- <di:waypoint x="2202" y="280" />
804
+ <di:waypoint x="2452" y="280" />
805
+ <di:waypoint x="2552" y="280" />
762
806
  </bpmndi:BPMNEdge>
763
807
  <bpmndi:BPMNEdge id="BPMNEdge_f_maxGate" bpmnElement="f_maxGate">
764
- <di:waypoint x="1616" y="920" />
765
- <di:waypoint x="2077" y="920" />
766
- <di:waypoint x="2077" y="305" />
808
+ <di:waypoint x="1966" y="920" />
809
+ <di:waypoint x="2472" y="920" />
810
+ <di:waypoint x="2472" y="305" />
811
+ <di:waypoint x="2472" y="280" />
812
+ <di:waypoint x="2452" y="280" />
767
813
  </bpmndi:BPMNEdge>
768
814
  <bpmndi:BPMNEdge id="BPMNEdge_f_answerRecord" bpmnElement="f_answerRecord">
769
- <di:waypoint x="2302" y="280" />
770
- <di:waypoint x="2402" y="280" />
815
+ <di:waypoint x="2652" y="280" />
816
+ <di:waypoint x="2752" y="280" />
817
+ </bpmndi:BPMNEdge>
818
+ <bpmndi:BPMNEdge id="BPMNEdge_f_ackRetry" bpmnElement="f_ackRetry">
819
+ <di:waypoint x="1166" y="465" />
820
+ <di:waypoint x="1166" y="485" />
821
+ <di:waypoint x="266" y="485" />
822
+ <di:waypoint x="266" y="160" />
823
+ <bpmndi:BPMNLabel>
824
+ <dc:Bounds x="686" y="438" width="60" height="42" />
825
+ </bpmndi:BPMNLabel>
771
826
  </bpmndi:BPMNEdge>
772
827
  <bpmndi:BPMNEdge id="BPMNEdge_f_huskRetry" bpmnElement="f_huskRetry">
773
- <di:waypoint x="1391" y="1105" />
774
- <di:waypoint x="1391" y="1125" />
828
+ <di:waypoint x="1741" y="1105" />
829
+ <di:waypoint x="1741" y="1125" />
775
830
  <di:waypoint x="266" y="1125" />
776
831
  <di:waypoint x="266" y="160" />
777
832
  <bpmndi:BPMNLabel>
778
- <dc:Bounds x="788" y="1092" width="82" height="28" />
833
+ <dc:Bounds x="963" y="1092" width="82" height="28" />
779
834
  </bpmndi:BPMNLabel>
780
835
  </bpmndi:BPMNEdge>
781
836
  <bpmndi:BPMNEdge id="BPMNEdge_f_answerLoop" bpmnElement="f_answerLoop">
782
- <di:waypoint x="2452" y="320" />
783
- <di:waypoint x="2452" y="340" />
837
+ <di:waypoint x="2802" y="320" />
838
+ <di:waypoint x="2802" y="340" />
784
839
  <di:waypoint x="266" y="340" />
785
840
  <di:waypoint x="266" y="160" />
786
841
  </bpmndi:BPMNEdge>
@@ -156,6 +156,16 @@ Because several agents may run on the same host at once:
156
156
  `path:line`, it is blind to the advisory's prose, so it would let a resolved ack
157
157
  for one advisory silently acknowledge a genuinely new advisory re-emitted at that
158
158
  same line. Always use the `<path> :: <text>` form.
159
+
160
+ > **Fixing an advisory in code is NOT enough — you MUST also post its resolved
161
+ > `nano-ack:` thread (issues #799 / #789).** Copilot re-lists every suppressed
162
+ > advisory in each review body, *including ones you already fixed in code*. The
163
+ > converge-gate cannot see your diff; it sees only the review body's advisory
164
+ > list and your resolved ack threads. So an advisory you **Applied** (fixed) but
165
+ > left un-acked is still an *outstanding* advisory to the gate — it re-blocks and
166
+ > re-escalates to a human every round even though the code is already correct.
167
+ > Post an `Applied. nano-ack: <path> :: <text>` thread for **every** advisory you
168
+ > fix, not only for the ones you decline.
159
169
  6. **Do NOT request, re-request, or remove the reviewer yourself.** Keeping
160
170
  Copilot attached is the **process's** job: a deterministic poller ensures a
161
171
  Copilot review is requested (idempotently) whenever this PR is waiting, and it
@@ -71,8 +71,11 @@ events` diagnostic pins this against the goldens themselves.
71
71
  sufficient_. Three golden features have no structured-builder derivation, each
72
72
  pinned by a diagnostic in `derivation-parity.test.ts`:
73
73
 
74
- 1. **Task-level back-edge merge.** The loop head `review-round` is a
75
- `serviceTask` that merges **four** back-edges directly (`in=4`). But `loop()`
74
+ 1. **Task-level back-edge merge.** The loop head `capture-head` is a
75
+ `serviceTask` that merges **five** back-edges directly (`in=5`: `f_start`,
76
+ `f_reviewLoop`, `f_answerLoop`, the #786 husk auto-retry `f_huskRetry`, and
77
+ the bounded auto-ack re-entry `f_ackRetry` added in #796); `review-round`
78
+ then takes its single `f_capture` in-edge. But `loop()`
76
79
  always inserts an exclusive-gateway loop head that absorbs the back-edge, so
77
80
  the body task stays `in=1` — empirically demonstrated by the `loop() inserts a
78
81
  gateway head` test.