@nanobpm/nano-workforce 0.166.0 → 0.167.1
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/.github/workflows/mirror-install-dispatch.yml +54 -0
- package/CHANGELOG.md +13 -0
- package/app/backfillAcknowledgedAt.test.ts +121 -0
- package/app/contracts.ts +17 -1
- package/app/delivery.ts +15 -13
- package/app/deliveryGraphReadModel.test.ts +44 -8
- package/app/deliveryGraphReadModel.ts +19 -2
- package/app/deliveryGraphRun.ts +5 -0
- package/app/epicBucket.test.ts +9 -3
- package/app/featureReadModel.ts +7 -11
- package/app/listBucket.ts +86 -0
- package/app/planReadModel.test.ts +29 -19
- package/app/planReadModel.ts +32 -26
- package/app/pollUserTasks.test.ts +165 -0
- package/app/pullRequestReadModel.test.ts +208 -0
- package/app/pullRequestReadModel.ts +76 -0
- package/app/service.ts +52 -0
- package/db/migrations/093_pull_requests_acknowledged_at.sql +30 -0
- package/db/migrations/094_pull_requests_read_model.sql +65 -0
- package/db/migrations/095_delivery_graph_acknowledged_at.sql +24 -0
- package/db/migrations/096_delivery_graph_read_model_list_bucket.sql +63 -0
- package/db/migrations/097_plan_read_model_terminal_dismiss.sql +65 -0
- package/db/migrations/098_delivery_graph_units_acknowledged_at.sql +63 -0
- package/e2e/feature-preflight.e2e.ts +3 -2
- package/e2e/feature-run.e2e.ts +60 -5
- package/nano.app.json +4 -0
- package/openapi.yaml +98 -0
- package/operations/acknowledgeDeliveryGraph.test.ts +93 -0
- package/operations/acknowledgeDeliveryGraph.ts +58 -0
- package/operations/acknowledgePr.test.ts +94 -0
- package/operations/acknowledgePr.ts +62 -0
- package/package.json +2 -2
- package/pages/delivery-graphs/library.mount.js +59 -2
- package/pages/delivery-graphs/mount.js +88 -2
- package/pages/delivery-graphs.page.json +12 -3
- package/pages/home.page.json +18 -27
- package/pages/overview.page.json +26 -17
- package/resources/processes/feature.bpmn +90 -69
- package/scripts/pages-contract.test.ts +80 -18
- package/test/delivery-graphs-ack-or-timeout.test.ts +280 -0
- package/test/delivery-graphs-library-embed.test.ts +1 -1
- package/workers/record-feature-implementing/worker.test.ts +57 -0
- package/workers/record-feature-implementing/worker.ts +31 -0
- package/workers/record-results/worker.test.ts +5 -3
|
@@ -50,6 +50,32 @@ const DEFAULT_IMPORT_URL = new URL("../app/api/actions/delivery-graph/library/im
|
|
|
50
50
|
// routes through the single `fillComposer()` seam below; keep new fill sources going through it.
|
|
51
51
|
export const DG_COMPOSE_FILL_MESSAGE = "nano-delivery-graph-compose-fill";
|
|
52
52
|
|
|
53
|
+
// The ACK half of the reuse-fill bridge (issue #645). An optimistic "✓ Loaded…" toast printed
|
|
54
|
+
// synchronously after the Library posts the fill can never reflect the cross-frame OUTCOME — the fill
|
|
55
|
+
// message is relayed across App-Views (nano-ide #518) and could still be dropped (no relay, wrong
|
|
56
|
+
// origin, a compose view that isn't mounted), yet the toast claimed success regardless (the #645
|
|
57
|
+
// defect). So the delivery is now ACKNOWLEDGED: when THIS compose mount actually fills from a fill
|
|
58
|
+
// message, it posts this ack back UP to the host (relayed across to the Library sibling), echoing the
|
|
59
|
+
// producer's correlation `token`. The Library shows "✓ Loaded…" ONLY on that ack and a clear error on a
|
|
60
|
+
// short timeout — the success is earned, not assumed. The `type` is exported ONCE here as the single
|
|
61
|
+
// source of truth; the Library consumer imports it rather than re-declaring a synonym.
|
|
62
|
+
export const DG_COMPOSE_FILL_ACK_MESSAGE = "nano-delivery-graph-compose-fill-ack";
|
|
63
|
+
|
|
64
|
+
// The host acknowledgment of a `nano-navigate` (issue #645). "Preview generated DI" posts nano-navigate
|
|
65
|
+
// UP to the console; nano-ide #518 forwards it to the host explorer, but the host does not synchronously
|
|
66
|
+
// confirm, so an optimistic "✓ Opening…" toast printed right after the post claimed success even when the
|
|
67
|
+
// message was dropped (standalone, no relay, a console that never navigated). The compose view now treats
|
|
68
|
+
// Preview as fire-to-host with a bounded budget: it shows a NEUTRAL in-progress status, and only earns a
|
|
69
|
+
// "✓" when the host echoes this ack for the same `target`; if no host ack is observed within the budget it
|
|
70
|
+
// surfaces "Couldn't reach the console explorer" instead. Same-origin, from the parent (the console).
|
|
71
|
+
export const NANO_NAVIGATE_ACK_MESSAGE = "nano-navigate-ack";
|
|
72
|
+
|
|
73
|
+
// The bounded budget within which a cross-frame delivery (compose-fill relay, or a nano-navigate to the
|
|
74
|
+
// host) must be acknowledged before the producer surfaces an honest "couldn't reach …" error (#645). A
|
|
75
|
+
// couple of seconds is long enough for the App-View relay round-trip yet short enough that a dropped
|
|
76
|
+
// message fails fast instead of leaving a misleading toast up. Overridable via config for tests.
|
|
77
|
+
const ACK_TIMEOUT_MS = 2000;
|
|
78
|
+
|
|
53
79
|
// A bounded timeout for every door request. Without it a hung endpoint leaves the fetch promise pending
|
|
54
80
|
// forever, so the busy() lock never clears and the UI is stranded (buttons disabled, status stuck) with
|
|
55
81
|
// no way to retry. On timeout the AbortController rejects the fetch, which surfaces as an error banner
|
|
@@ -230,6 +256,8 @@ export function mountDeliveryGraphs(host, config = {}) {
|
|
|
230
256
|
const previewUrl = config.previewUrl ?? DEFAULT_PREVIEW_URL;
|
|
231
257
|
const stageUrl = config.stageUrl ?? DEFAULT_STAGE_URL;
|
|
232
258
|
const importUrl = config.importUrl ?? DEFAULT_IMPORT_URL;
|
|
259
|
+
const ackTimeoutMs =
|
|
260
|
+
typeof config.ackTimeoutMs === "number" && config.ackTimeoutMs > 0 ? config.ackTimeoutMs : ACK_TIMEOUT_MS;
|
|
233
261
|
const headers = (url) => ({
|
|
234
262
|
"content-type": "application/json",
|
|
235
263
|
...(config.hookSecret && isSameOrigin(url) ? { "x-hook-secret": config.hookSecret } : {}),
|
|
@@ -324,7 +352,23 @@ export function mountDeliveryGraphs(host, config = {}) {
|
|
|
324
352
|
if (embedded && ev.source !== window.parent) return;
|
|
325
353
|
const data = ev.data;
|
|
326
354
|
if (!data || data.type !== DG_COMPOSE_FILL_MESSAGE || typeof data.graphJson !== "string") return;
|
|
327
|
-
fillComposer(data.graphJson, { status: "Reused a saved graph \u2014 Preview or Stage it." });
|
|
355
|
+
const filled = fillComposer(data.graphJson, { status: "Reused a saved graph \u2014 Preview or Stage it." });
|
|
356
|
+
// ACK the fill back to the producer (issue #645): the Library shows "✓ Loaded…" ONLY on this ack,
|
|
357
|
+
// never optimistically. Post UP to the host, which nano-ide #518 relays across to the Library
|
|
358
|
+
// sibling App-View; echo the correlation `token` so a stale ack from a prior Reuse can't complete a
|
|
359
|
+
// newer one. Only when actually embedded (there is a parent to relay through) and only when the fill
|
|
360
|
+
// truly happened — a blank/bad payload earns no ack.
|
|
361
|
+
if (
|
|
362
|
+
filled &&
|
|
363
|
+
embedded &&
|
|
364
|
+
window.parent &&
|
|
365
|
+
typeof window.parent.postMessage === "function"
|
|
366
|
+
) {
|
|
367
|
+
window.parent.postMessage(
|
|
368
|
+
{ type: DG_COMPOSE_FILL_ACK_MESSAGE, token: typeof data.token === "string" ? data.token : null },
|
|
369
|
+
window.location.origin,
|
|
370
|
+
);
|
|
371
|
+
}
|
|
328
372
|
}
|
|
329
373
|
if (typeof window !== "undefined" && typeof window.addEventListener === "function") {
|
|
330
374
|
window.addEventListener("message", onFillMessage);
|
|
@@ -446,6 +490,17 @@ export function mountDeliveryGraphs(host, config = {}) {
|
|
|
446
490
|
// the path. Standalone (not embedded) there is no host explorer to drive, so we say so instead of
|
|
447
491
|
// failing silently.
|
|
448
492
|
const isEmbedded = typeof window !== "undefined" && window.parent && window.parent !== window;
|
|
493
|
+
// A single in-flight Preview→host handshake (issue #645). Posting nano-navigate is fire-to-host: the
|
|
494
|
+
// console does not synchronously confirm it navigated, so we must not claim success up front. We hold
|
|
495
|
+
// the pending target + its timeout timer here; a host ack for that target resolves it to "✓ Opened…",
|
|
496
|
+
// and the timeout resolves it to an honest "Couldn't reach the console explorer". A fresh Preview
|
|
497
|
+
// supersedes any pending one (its timer is cleared) so only the latest attempt is ever resolved.
|
|
498
|
+
const DEFINITION_PREVIEW_TARGET = "definitionPreview";
|
|
499
|
+
let pendingPreview = null;
|
|
500
|
+
function clearPendingPreview() {
|
|
501
|
+
if (pendingPreview && pendingPreview.timer) clearTimeout(pendingPreview.timer);
|
|
502
|
+
pendingPreview = null;
|
|
503
|
+
}
|
|
449
504
|
function doPreviewDi() {
|
|
450
505
|
if (lastBpmn.trim() === "") {
|
|
451
506
|
setStatus("Preview a graph first — the laid-out BPMN comes from the preview.", "err");
|
|
@@ -455,11 +510,40 @@ export function mountDeliveryGraphs(host, config = {}) {
|
|
|
455
510
|
setStatus("Open this page inside the console cockpit to preview the generated DI.", "err");
|
|
456
511
|
return;
|
|
457
512
|
}
|
|
513
|
+
clearPendingPreview();
|
|
458
514
|
window.parent.postMessage(
|
|
459
515
|
{ type: "nano-navigate", target: "definitionPreview", params: { xml: lastBpmn } },
|
|
460
516
|
window.location.origin,
|
|
461
517
|
);
|
|
462
|
-
|
|
518
|
+
// NEUTRAL in-progress status (no "✓") — the success is only earned on the host ack below (#645).
|
|
519
|
+
setStatus("Opening the generated DI in the process explorer…", "");
|
|
520
|
+
const timer = setTimeout(() => {
|
|
521
|
+
if (!pendingPreview || pendingPreview.target !== DEFINITION_PREVIEW_TARGET) return;
|
|
522
|
+
pendingPreview = null;
|
|
523
|
+
setStatus("Couldn't reach the console explorer — is this page open inside the console?", "err");
|
|
524
|
+
}, ackTimeoutMs);
|
|
525
|
+
pendingPreview = { target: DEFINITION_PREVIEW_TARGET, timer };
|
|
526
|
+
}
|
|
527
|
+
// The host's acknowledgment of a Preview nano-navigate (#645): a same-origin `nano-navigate-ack` from
|
|
528
|
+
// the parent (the console) for the target we're awaiting resolves the pending Preview to success. A
|
|
529
|
+
// foreign origin, a non-parent source, or an ack for a different/absent target is ignored — an
|
|
530
|
+
// unrelated page can't forge a success toast.
|
|
531
|
+
function onNavAck(ev) {
|
|
532
|
+
if (!ev || typeof window === "undefined") return;
|
|
533
|
+
if (ev.origin !== window.location.origin) return;
|
|
534
|
+
if (ev.source !== window.parent) return;
|
|
535
|
+
const data = ev.data;
|
|
536
|
+
if (!data || data.type !== NANO_NAVIGATE_ACK_MESSAGE) return;
|
|
537
|
+
// Require a string `target` that exactly matches the pending preview. A target-less (or
|
|
538
|
+
// mismatched) ack must NOT resolve the Preview — otherwise any same-origin parent ack could
|
|
539
|
+
// forge a "✓ Opened…" toast the target never actually rendered (#645).
|
|
540
|
+
if (!pendingPreview || typeof data.target !== "string" || data.target !== pendingPreview.target)
|
|
541
|
+
return;
|
|
542
|
+
clearPendingPreview();
|
|
543
|
+
setStatus("\u2713 Opened the generated DI in the process explorer.", "ok");
|
|
544
|
+
}
|
|
545
|
+
if (isEmbedded && typeof window !== "undefined" && typeof window.addEventListener === "function") {
|
|
546
|
+
window.addEventListener("message", onNavAck);
|
|
463
547
|
}
|
|
464
548
|
outputEl.addEventListener("click", (ev) => {
|
|
465
549
|
const btn = ev.target && ev.target.closest ? ev.target.closest("[data-preview-di]") : null;
|
|
@@ -469,8 +553,10 @@ export function mountDeliveryGraphs(host, config = {}) {
|
|
|
469
553
|
});
|
|
470
554
|
|
|
471
555
|
return () => {
|
|
556
|
+
clearPendingPreview();
|
|
472
557
|
if (typeof window !== "undefined" && typeof window.removeEventListener === "function") {
|
|
473
558
|
window.removeEventListener("message", onFillMessage);
|
|
559
|
+
window.removeEventListener("message", onNavAck);
|
|
474
560
|
}
|
|
475
561
|
root.innerHTML = "";
|
|
476
562
|
};
|
|
@@ -120,11 +120,11 @@
|
|
|
120
120
|
"source": "app",
|
|
121
121
|
"table": "delivery_graph_read_model",
|
|
122
122
|
"orderBy": { "field": "updated_at", "dir": "desc" },
|
|
123
|
-
"filter": [{ "field": "
|
|
123
|
+
"filter": [{ "field": "list_bucket", "in": ["active"] }]
|
|
124
124
|
},
|
|
125
125
|
"tabs": [
|
|
126
|
-
{ "label": "In-flight", "filter": [{ "field": "
|
|
127
|
-
{ "label": "History", "filter": [{ "field": "
|
|
126
|
+
{ "label": "In-flight", "filter": [{ "field": "list_bucket", "in": ["active"] }] },
|
|
127
|
+
{ "label": "History", "filter": [{ "field": "list_bucket", "in": ["history"] }] },
|
|
128
128
|
{ "label": "All", "filter": [] }
|
|
129
129
|
],
|
|
130
130
|
"columns": [
|
|
@@ -171,6 +171,15 @@
|
|
|
171
171
|
"path": "/app/api/actions/delivery-graph/library/save",
|
|
172
172
|
"body": { "name": "{{row.title}}", "digest": "{{row.digest}}" }
|
|
173
173
|
}
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"label": "Dismiss",
|
|
177
|
+
"confirm": "Dismiss this finished delivery graph? It acknowledges the terminal run and files it under History.",
|
|
178
|
+
"showWhenField": "ack_open",
|
|
179
|
+
"action": {
|
|
180
|
+
"path": "/app/api/actions/acknowledge-delivery-graph",
|
|
181
|
+
"body": { "run_key": "{{row.run_key}}" }
|
|
182
|
+
}
|
|
174
183
|
}
|
|
175
184
|
]
|
|
176
185
|
}
|
package/pages/home.page.json
CHANGED
|
@@ -119,23 +119,15 @@
|
|
|
119
119
|
"data": {
|
|
120
120
|
"kind": "datasource",
|
|
121
121
|
"source": "app",
|
|
122
|
-
"table": "
|
|
122
|
+
"table": "pull_requests_read_model",
|
|
123
123
|
"orderBy": {
|
|
124
124
|
"field": "updated_at",
|
|
125
125
|
"dir": "desc"
|
|
126
126
|
},
|
|
127
127
|
"filter": [
|
|
128
128
|
{
|
|
129
|
-
"field": "
|
|
130
|
-
"in": [
|
|
131
|
-
"converging",
|
|
132
|
-
"waiting_review",
|
|
133
|
-
"escalated",
|
|
134
|
-
"waiting_deps",
|
|
135
|
-
"waiting_merge",
|
|
136
|
-
"queued",
|
|
137
|
-
"merging"
|
|
138
|
-
]
|
|
129
|
+
"field": "list_bucket",
|
|
130
|
+
"in": ["active"]
|
|
139
131
|
}
|
|
140
132
|
]
|
|
141
133
|
},
|
|
@@ -144,16 +136,8 @@
|
|
|
144
136
|
"label": "Active",
|
|
145
137
|
"filter": [
|
|
146
138
|
{
|
|
147
|
-
"field": "
|
|
148
|
-
"in": [
|
|
149
|
-
"converging",
|
|
150
|
-
"waiting_review",
|
|
151
|
-
"escalated",
|
|
152
|
-
"waiting_deps",
|
|
153
|
-
"waiting_merge",
|
|
154
|
-
"queued",
|
|
155
|
-
"merging"
|
|
156
|
-
]
|
|
139
|
+
"field": "list_bucket",
|
|
140
|
+
"in": ["active"]
|
|
157
141
|
}
|
|
158
142
|
]
|
|
159
143
|
},
|
|
@@ -161,12 +145,8 @@
|
|
|
161
145
|
"label": "History",
|
|
162
146
|
"filter": [
|
|
163
147
|
{
|
|
164
|
-
"field": "
|
|
165
|
-
"in": [
|
|
166
|
-
"converged",
|
|
167
|
-
"merged",
|
|
168
|
-
"abandoned"
|
|
169
|
-
]
|
|
148
|
+
"field": "list_bucket",
|
|
149
|
+
"in": ["history"]
|
|
170
150
|
}
|
|
171
151
|
]
|
|
172
152
|
}
|
|
@@ -224,6 +204,17 @@
|
|
|
224
204
|
"processInstanceKey": "{{row.process_key}}"
|
|
225
205
|
}
|
|
226
206
|
}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"label": "Dismiss",
|
|
210
|
+
"confirm": "Dismiss this finished PR? It acknowledges the terminal pull request and files it under History.",
|
|
211
|
+
"showWhenField": "ack_open",
|
|
212
|
+
"action": {
|
|
213
|
+
"path": "/app/api/actions/acknowledge-pr",
|
|
214
|
+
"body": {
|
|
215
|
+
"pr_key": "{{row.pr_key}}"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
227
218
|
}
|
|
228
219
|
],
|
|
229
220
|
"detail": {
|
package/pages/overview.page.json
CHANGED
|
@@ -101,22 +101,9 @@
|
|
|
101
101
|
"data": {
|
|
102
102
|
"kind": "datasource",
|
|
103
103
|
"source": "app",
|
|
104
|
-
"table": "
|
|
104
|
+
"table": "pull_requests_read_model",
|
|
105
105
|
"orderBy": { "field": "updated_at", "dir": "desc" },
|
|
106
|
-
"filter": [
|
|
107
|
-
{
|
|
108
|
-
"field": "status",
|
|
109
|
-
"in": [
|
|
110
|
-
"converging",
|
|
111
|
-
"waiting_review",
|
|
112
|
-
"escalated",
|
|
113
|
-
"waiting_deps",
|
|
114
|
-
"waiting_merge",
|
|
115
|
-
"queued",
|
|
116
|
-
"merging"
|
|
117
|
-
]
|
|
118
|
-
}
|
|
119
|
-
]
|
|
106
|
+
"filter": [{ "field": "list_bucket", "in": ["active"] }]
|
|
120
107
|
},
|
|
121
108
|
"columns": [
|
|
122
109
|
{ "field": "title", "template": "{{title}}", "header": "Item", "subtitleField": "pr_key", "truncate": true, "width": "36%", "link": { "kind": "page", "page": "home", "keyField": "pr_key" } },
|
|
@@ -124,6 +111,17 @@
|
|
|
124
111
|
{ "field": "incident_message", "header": "Incident", "truncate": true, "badge": { "tone": "danger", "label": "1" } },
|
|
125
112
|
{ "field": "current_round", "template": "{{current_round}} · {{active_worker}}", "header": "Round · Agent" },
|
|
126
113
|
{ "field": "updated_at", "header": "Updated", "width": "9rem", "format": "datetime" }
|
|
114
|
+
],
|
|
115
|
+
"rowActions": [
|
|
116
|
+
{
|
|
117
|
+
"label": "Dismiss",
|
|
118
|
+
"confirm": "Dismiss this finished PR? It acknowledges the terminal pull request and files it under History.",
|
|
119
|
+
"showWhenField": "ack_open",
|
|
120
|
+
"action": {
|
|
121
|
+
"path": "/app/api/actions/acknowledge-pr",
|
|
122
|
+
"body": { "pr_key": "{{row.pr_key}}" }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
127
125
|
]
|
|
128
126
|
}
|
|
129
127
|
},
|
|
@@ -220,7 +218,7 @@
|
|
|
220
218
|
"source": "app",
|
|
221
219
|
"table": "delivery_graph_read_model",
|
|
222
220
|
"orderBy": { "field": "updated_at", "dir": "desc" },
|
|
223
|
-
"filter": [{ "field": "
|
|
221
|
+
"filter": [{ "field": "list_bucket", "in": ["active"] }]
|
|
224
222
|
},
|
|
225
223
|
"columns": [
|
|
226
224
|
{ "field": "title", "template": "{{title}}", "header": "Item", "subtitleField": "run_key", "truncate": true, "width": "30%", "link": { "kind": "page", "page": "delivery-graph-detail", "keyField": "run_key" } },
|
|
@@ -252,7 +250,18 @@
|
|
|
252
250
|
{ "field": "human_node_count", "label": "Human nodes" },
|
|
253
251
|
{ "field": "side_effect_count", "label": "Side effects" }
|
|
254
252
|
]
|
|
255
|
-
}
|
|
253
|
+
},
|
|
254
|
+
"rowActions": [
|
|
255
|
+
{
|
|
256
|
+
"label": "Dismiss",
|
|
257
|
+
"confirm": "Dismiss this finished delivery graph? It acknowledges the terminal run and files it under History.",
|
|
258
|
+
"showWhenField": "ack_open",
|
|
259
|
+
"action": {
|
|
260
|
+
"path": "/app/api/actions/acknowledge-delivery-graph",
|
|
261
|
+
"body": { "run_key": "{{row.run_key}}" }
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
]
|
|
256
265
|
}
|
|
257
266
|
}
|
|
258
267
|
]
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
<nano:extend name="featureKey" type="string" />
|
|
14
14
|
<nano:extend name="question" type="string" optional="true" />
|
|
15
15
|
</nano:shape>
|
|
16
|
+
<nano:shape id="RecordFeatureImplementingIn" name="Record feature implementing — input">
|
|
17
|
+
<nano:extend name="featureKey" type="string" />
|
|
18
|
+
</nano:shape>
|
|
16
19
|
<nano:shape id="ConvergeFeatureIn" name="Converge feature PR — input">
|
|
17
20
|
<nano:extend name="featureKey" type="string" />
|
|
18
21
|
<nano:extend name="prKey" type="string" optional="true" />
|
|
@@ -183,9 +186,19 @@
|
|
|
183
186
|
<zeebe:output source="=if (is defined(transcriptUrl)) then transcriptUrl else null" target="transcriptUrl" />
|
|
184
187
|
</zeebe:ioMapping>
|
|
185
188
|
</bpmn:extensionElements>
|
|
189
|
+
<bpmn:incoming>f_implementing</bpmn:incoming>
|
|
190
|
+
<bpmn:outgoing>w_toGw</bpmn:outgoing>
|
|
191
|
+
</bpmn:serviceTask>
|
|
192
|
+
<bpmn:serviceTask id="record-feature-implementing" name="Record implementing">
|
|
193
|
+
<bpmn:extensionElements>
|
|
194
|
+
<zeebe:taskDefinition type="pr.record-feature-implementing" />
|
|
195
|
+
<zeebe:properties>
|
|
196
|
+
<zeebe:property name="io.nanobpm.dataEnvelope.in" value="RecordFeatureImplementingIn" />
|
|
197
|
+
</zeebe:properties>
|
|
198
|
+
</bpmn:extensionElements>
|
|
186
199
|
<bpmn:incoming>f_toImplement</bpmn:incoming>
|
|
187
200
|
<bpmn:incoming>w_answerLoop</bpmn:incoming>
|
|
188
|
-
<bpmn:outgoing>
|
|
201
|
+
<bpmn:outgoing>f_implementing</bpmn:outgoing>
|
|
189
202
|
</bpmn:serviceTask>
|
|
190
203
|
<bpmn:exclusiveGateway id="w_gw" name="escalated?" default="w_done">
|
|
191
204
|
<bpmn:incoming>w_toGw</bpmn:incoming>
|
|
@@ -287,7 +300,8 @@
|
|
|
287
300
|
</bpmn:sequenceFlow>
|
|
288
301
|
<bpmn:sequenceFlow id="f_readiness_skip" name="no gate" sourceRef="gw-readiness" targetRef="ensure-base-branch" />
|
|
289
302
|
<bpmn:sequenceFlow id="f_readiness_done" sourceRef="readiness-preflight" targetRef="ensure-base-branch" />
|
|
290
|
-
<bpmn:sequenceFlow id="f_toImplement" sourceRef="ensure-base-branch" targetRef="
|
|
303
|
+
<bpmn:sequenceFlow id="f_toImplement" sourceRef="ensure-base-branch" targetRef="record-feature-implementing" />
|
|
304
|
+
<bpmn:sequenceFlow id="f_implementing" sourceRef="record-feature-implementing" targetRef="implement-task" />
|
|
291
305
|
<bpmn:sequenceFlow id="w_toGw" sourceRef="implement-task" targetRef="w_gw" />
|
|
292
306
|
<bpmn:sequenceFlow id="w_escalate" name="escalated" sourceRef="w_gw" targetRef="record-feature-escalation">
|
|
293
307
|
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=status = "escalated" and question != null and trim(question) != ""</bpmn:conditionExpression>
|
|
@@ -295,7 +309,7 @@
|
|
|
295
309
|
<bpmn:sequenceFlow id="w_toEscalationTask" sourceRef="record-feature-escalation" targetRef="feature-escalation" />
|
|
296
310
|
<bpmn:sequenceFlow id="w_done" name="done" sourceRef="w_gw" targetRef="record-feature" />
|
|
297
311
|
<bpmn:sequenceFlow id="w_toAnswerGw" sourceRef="feature-escalation" targetRef="w_gw_answer" />
|
|
298
|
-
<bpmn:sequenceFlow id="w_answerLoop" name="answer" sourceRef="w_gw_answer" targetRef="
|
|
312
|
+
<bpmn:sequenceFlow id="w_answerLoop" name="answer" sourceRef="w_gw_answer" targetRef="record-feature-implementing">
|
|
299
313
|
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=resolution = "answer"</bpmn:conditionExpression>
|
|
300
314
|
</bpmn:sequenceFlow>
|
|
301
315
|
<bpmn:sequenceFlow id="w_abandon" name="abandon" sourceRef="w_gw_answer" targetRef="record-feature" />
|
|
@@ -334,60 +348,63 @@
|
|
|
334
348
|
<dc:Bounds x="566" y="80" width="100" height="80" />
|
|
335
349
|
</bpmndi:BPMNShape>
|
|
336
350
|
<bpmndi:BPMNShape id="BPMNShape_implement-task" bpmnElement="implement-task">
|
|
351
|
+
<dc:Bounds x="966" y="80" width="100" height="80" />
|
|
352
|
+
</bpmndi:BPMNShape>
|
|
353
|
+
<bpmndi:BPMNShape id="BPMNShape_record-feature-implementing" bpmnElement="record-feature-implementing">
|
|
337
354
|
<dc:Bounds x="766" y="80" width="100" height="80" />
|
|
338
355
|
</bpmndi:BPMNShape>
|
|
339
356
|
<bpmndi:BPMNShape id="BPMNShape_w_gw" bpmnElement="w_gw" isMarkerVisible="true">
|
|
340
|
-
<dc:Bounds x="
|
|
357
|
+
<dc:Bounds x="1166" y="95" width="50" height="50" />
|
|
341
358
|
<bpmndi:BPMNLabel>
|
|
342
|
-
<dc:Bounds x="
|
|
359
|
+
<dc:Bounds x="1154" y="76" width="74" height="14" />
|
|
343
360
|
</bpmndi:BPMNLabel>
|
|
344
361
|
</bpmndi:BPMNShape>
|
|
345
362
|
<bpmndi:BPMNShape id="BPMNShape_record-feature-escalation" bpmnElement="record-feature-escalation">
|
|
346
|
-
<dc:Bounds x="
|
|
363
|
+
<dc:Bounds x="1316" y="240" width="100" height="80" />
|
|
347
364
|
</bpmndi:BPMNShape>
|
|
348
365
|
<bpmndi:BPMNShape id="BPMNShape_feature-escalation" bpmnElement="feature-escalation">
|
|
349
|
-
<dc:Bounds x="
|
|
366
|
+
<dc:Bounds x="1516" y="240" width="100" height="80" />
|
|
350
367
|
</bpmndi:BPMNShape>
|
|
351
368
|
<bpmndi:BPMNShape id="BPMNShape_w_gw_answer" bpmnElement="w_gw_answer" isMarkerVisible="true">
|
|
352
|
-
<dc:Bounds x="
|
|
369
|
+
<dc:Bounds x="1716" y="255" width="50" height="50" />
|
|
353
370
|
<bpmndi:BPMNLabel>
|
|
354
|
-
<dc:Bounds x="
|
|
371
|
+
<dc:Bounds x="1713" y="236" width="56" height="14" />
|
|
355
372
|
</bpmndi:BPMNLabel>
|
|
356
373
|
</bpmndi:BPMNShape>
|
|
357
374
|
<bpmndi:BPMNShape id="BPMNShape_record-feature" bpmnElement="record-feature">
|
|
358
|
-
<dc:Bounds x="
|
|
375
|
+
<dc:Bounds x="1866" y="80" width="100" height="80" />
|
|
359
376
|
</bpmndi:BPMNShape>
|
|
360
377
|
<bpmndi:BPMNShape id="BPMNShape_gw-blocked" bpmnElement="gw-blocked" isMarkerVisible="true">
|
|
361
|
-
<dc:Bounds x="
|
|
378
|
+
<dc:Bounds x="2066" y="95" width="50" height="50" />
|
|
362
379
|
<bpmndi:BPMNLabel>
|
|
363
|
-
<dc:Bounds x="
|
|
380
|
+
<dc:Bounds x="2061" y="76" width="60" height="14" />
|
|
364
381
|
</bpmndi:BPMNLabel>
|
|
365
382
|
</bpmndi:BPMNShape>
|
|
366
383
|
<bpmndi:BPMNShape id="BPMNShape_feature-blocked" bpmnElement="feature-blocked">
|
|
367
|
-
<dc:Bounds x="
|
|
384
|
+
<dc:Bounds x="2216" y="400" width="100" height="80" />
|
|
368
385
|
</bpmndi:BPMNShape>
|
|
369
386
|
<bpmndi:BPMNShape id="BPMNShape_record-blocked-ack" bpmnElement="record-blocked-ack">
|
|
370
|
-
<dc:Bounds x="
|
|
387
|
+
<dc:Bounds x="2416" y="400" width="100" height="80" />
|
|
371
388
|
</bpmndi:BPMNShape>
|
|
372
389
|
<bpmndi:BPMNShape id="BPMNShape_gw-converge" bpmnElement="gw-converge" isMarkerVisible="true">
|
|
373
|
-
<dc:Bounds x="
|
|
390
|
+
<dc:Bounds x="2241" y="95" width="50" height="50" />
|
|
374
391
|
<bpmndi:BPMNLabel>
|
|
375
|
-
<dc:Bounds x="
|
|
392
|
+
<dc:Bounds x="2233" y="76" width="67" height="14" />
|
|
376
393
|
</bpmndi:BPMNLabel>
|
|
377
394
|
</bpmndi:BPMNShape>
|
|
378
395
|
<bpmndi:BPMNShape id="BPMNShape_converge" bpmnElement="converge">
|
|
379
|
-
<dc:Bounds x="
|
|
396
|
+
<dc:Bounds x="2416" y="240" width="100" height="80" />
|
|
380
397
|
</bpmndi:BPMNShape>
|
|
381
398
|
<bpmndi:BPMNShape id="BPMNShape_End" bpmnElement="End">
|
|
382
|
-
<dc:Bounds x="
|
|
399
|
+
<dc:Bounds x="2616" y="102" width="36" height="36" />
|
|
383
400
|
<bpmndi:BPMNLabel>
|
|
384
|
-
<dc:Bounds x="
|
|
401
|
+
<dc:Bounds x="2617" y="83" width="34" height="14" />
|
|
385
402
|
</bpmndi:BPMNLabel>
|
|
386
403
|
</bpmndi:BPMNShape>
|
|
387
404
|
<bpmndi:BPMNShape id="BPMNShape_be_feature_sla" bpmnElement="be_feature_sla">
|
|
388
|
-
<dc:Bounds x="
|
|
405
|
+
<dc:Bounds x="1548" y="302" width="36" height="36" />
|
|
389
406
|
<bpmndi:BPMNLabel>
|
|
390
|
-
<dc:Bounds x="
|
|
407
|
+
<dc:Bounds x="1524" y="383" width="84" height="14" />
|
|
391
408
|
</bpmndi:BPMNLabel>
|
|
392
409
|
</bpmndi:BPMNShape>
|
|
393
410
|
<bpmndi:BPMNEdge id="BPMNEdge_f_toReadinessGw" bpmnElement="f_toReadinessGw">
|
|
@@ -405,41 +422,45 @@
|
|
|
405
422
|
<di:waypoint x="666" y="120" />
|
|
406
423
|
<di:waypoint x="766" y="120" />
|
|
407
424
|
</bpmndi:BPMNEdge>
|
|
408
|
-
<bpmndi:BPMNEdge id="
|
|
425
|
+
<bpmndi:BPMNEdge id="BPMNEdge_f_implementing" bpmnElement="f_implementing">
|
|
409
426
|
<di:waypoint x="866" y="120" />
|
|
410
427
|
<di:waypoint x="966" y="120" />
|
|
411
428
|
</bpmndi:BPMNEdge>
|
|
429
|
+
<bpmndi:BPMNEdge id="BPMNEdge_w_toGw" bpmnElement="w_toGw">
|
|
430
|
+
<di:waypoint x="1066" y="120" />
|
|
431
|
+
<di:waypoint x="1166" y="120" />
|
|
432
|
+
</bpmndi:BPMNEdge>
|
|
412
433
|
<bpmndi:BPMNEdge id="BPMNEdge_w_done" bpmnElement="w_done">
|
|
413
|
-
<di:waypoint x="
|
|
414
|
-
<di:waypoint x="
|
|
434
|
+
<di:waypoint x="1216" y="120" />
|
|
435
|
+
<di:waypoint x="1866" y="120" />
|
|
415
436
|
<bpmndi:BPMNLabel>
|
|
416
|
-
<dc:Bounds x="
|
|
437
|
+
<dc:Bounds x="1525" y="98" width="32" height="14" />
|
|
417
438
|
</bpmndi:BPMNLabel>
|
|
418
439
|
</bpmndi:BPMNEdge>
|
|
419
440
|
<bpmndi:BPMNEdge id="BPMNEdge_f_toBlockedGw" bpmnElement="f_toBlockedGw">
|
|
420
|
-
<di:waypoint x="
|
|
421
|
-
<di:waypoint x="
|
|
441
|
+
<di:waypoint x="1966" y="120" />
|
|
442
|
+
<di:waypoint x="2066" y="120" />
|
|
422
443
|
</bpmndi:BPMNEdge>
|
|
423
444
|
<bpmndi:BPMNEdge id="BPMNEdge_f_notBlocked" bpmnElement="f_notBlocked">
|
|
424
|
-
<di:waypoint x="
|
|
425
|
-
<di:waypoint x="
|
|
445
|
+
<di:waypoint x="2116" y="120" />
|
|
446
|
+
<di:waypoint x="2241" y="120" />
|
|
426
447
|
<bpmndi:BPMNLabel>
|
|
427
|
-
<dc:Bounds x="
|
|
448
|
+
<dc:Bounds x="2140" y="98" width="78" height="14" />
|
|
428
449
|
</bpmndi:BPMNLabel>
|
|
429
450
|
</bpmndi:BPMNEdge>
|
|
430
451
|
<bpmndi:BPMNEdge id="BPMNEdge_f_noConverge" bpmnElement="f_noConverge">
|
|
431
|
-
<di:waypoint x="
|
|
432
|
-
<di:waypoint x="
|
|
452
|
+
<di:waypoint x="2291" y="120" />
|
|
453
|
+
<di:waypoint x="2616" y="120" />
|
|
433
454
|
<bpmndi:BPMNLabel>
|
|
434
|
-
<dc:Bounds x="
|
|
455
|
+
<dc:Bounds x="2418" y="98" width="71" height="14" />
|
|
435
456
|
</bpmndi:BPMNLabel>
|
|
436
457
|
</bpmndi:BPMNEdge>
|
|
437
458
|
<bpmndi:BPMNEdge id="BPMNEdge_w_abandon" bpmnElement="w_abandon">
|
|
438
|
-
<di:waypoint x="
|
|
439
|
-
<di:waypoint x="
|
|
440
|
-
<di:waypoint x="
|
|
459
|
+
<di:waypoint x="1766" y="280" />
|
|
460
|
+
<di:waypoint x="1916" y="280" />
|
|
461
|
+
<di:waypoint x="1916" y="160" />
|
|
441
462
|
<bpmndi:BPMNLabel>
|
|
442
|
-
<dc:Bounds x="
|
|
463
|
+
<dc:Bounds x="1815" y="258" width="53" height="14" />
|
|
443
464
|
</bpmndi:BPMNLabel>
|
|
444
465
|
</bpmndi:BPMNEdge>
|
|
445
466
|
<bpmndi:BPMNEdge id="BPMNEdge_f_readiness_gate" bpmnElement="f_readiness_gate">
|
|
@@ -451,27 +472,27 @@
|
|
|
451
472
|
</bpmndi:BPMNLabel>
|
|
452
473
|
</bpmndi:BPMNEdge>
|
|
453
474
|
<bpmndi:BPMNEdge id="BPMNEdge_w_escalate" bpmnElement="w_escalate">
|
|
454
|
-
<di:waypoint x="
|
|
455
|
-
<di:waypoint x="
|
|
456
|
-
<di:waypoint x="
|
|
475
|
+
<di:waypoint x="1191" y="145" />
|
|
476
|
+
<di:waypoint x="1191" y="280" />
|
|
477
|
+
<di:waypoint x="1316" y="280" />
|
|
457
478
|
<bpmndi:BPMNLabel>
|
|
458
|
-
<dc:Bounds x="
|
|
479
|
+
<dc:Bounds x="1196" y="206" width="67" height="14" />
|
|
459
480
|
</bpmndi:BPMNLabel>
|
|
460
481
|
</bpmndi:BPMNEdge>
|
|
461
482
|
<bpmndi:BPMNEdge id="BPMNEdge_f_blocked" bpmnElement="f_blocked">
|
|
462
|
-
<di:waypoint x="
|
|
463
|
-
<di:waypoint x="
|
|
464
|
-
<di:waypoint x="
|
|
483
|
+
<di:waypoint x="2091" y="145" />
|
|
484
|
+
<di:waypoint x="2091" y="440" />
|
|
485
|
+
<di:waypoint x="2216" y="440" />
|
|
465
486
|
<bpmndi:BPMNLabel>
|
|
466
|
-
<dc:Bounds x="
|
|
487
|
+
<dc:Bounds x="2096" y="286" width="53" height="14" />
|
|
467
488
|
</bpmndi:BPMNLabel>
|
|
468
489
|
</bpmndi:BPMNEdge>
|
|
469
490
|
<bpmndi:BPMNEdge id="BPMNEdge_f_converge" bpmnElement="f_converge">
|
|
470
|
-
<di:waypoint x="
|
|
471
|
-
<di:waypoint x="
|
|
472
|
-
<di:waypoint x="
|
|
491
|
+
<di:waypoint x="2266" y="145" />
|
|
492
|
+
<di:waypoint x="2266" y="280" />
|
|
493
|
+
<di:waypoint x="2416" y="280" />
|
|
473
494
|
<bpmndi:BPMNLabel>
|
|
474
|
-
<dc:Bounds x="
|
|
495
|
+
<dc:Bounds x="2271" y="206" width="60" height="14" />
|
|
475
496
|
</bpmndi:BPMNLabel>
|
|
476
497
|
</bpmndi:BPMNEdge>
|
|
477
498
|
<bpmndi:BPMNEdge id="BPMNEdge_f_readiness_done" bpmnElement="f_readiness_done">
|
|
@@ -480,43 +501,43 @@
|
|
|
480
501
|
<di:waypoint x="616" y="160" />
|
|
481
502
|
</bpmndi:BPMNEdge>
|
|
482
503
|
<bpmndi:BPMNEdge id="BPMNEdge_w_toEscalationTask" bpmnElement="w_toEscalationTask">
|
|
483
|
-
<di:waypoint x="1216" y="280" />
|
|
484
|
-
<di:waypoint x="1316" y="280" />
|
|
485
|
-
</bpmndi:BPMNEdge>
|
|
486
|
-
<bpmndi:BPMNEdge id="BPMNEdge_w_toAnswerGw" bpmnElement="w_toAnswerGw">
|
|
487
504
|
<di:waypoint x="1416" y="280" />
|
|
488
505
|
<di:waypoint x="1516" y="280" />
|
|
489
506
|
</bpmndi:BPMNEdge>
|
|
507
|
+
<bpmndi:BPMNEdge id="BPMNEdge_w_toAnswerGw" bpmnElement="w_toAnswerGw">
|
|
508
|
+
<di:waypoint x="1616" y="280" />
|
|
509
|
+
<di:waypoint x="1716" y="280" />
|
|
510
|
+
</bpmndi:BPMNEdge>
|
|
490
511
|
<bpmndi:BPMNEdge id="BPMNEdge_f_toBlockedAck" bpmnElement="f_toBlockedAck">
|
|
491
|
-
<di:waypoint x="
|
|
492
|
-
<di:waypoint x="
|
|
512
|
+
<di:waypoint x="2316" y="440" />
|
|
513
|
+
<di:waypoint x="2416" y="440" />
|
|
493
514
|
</bpmndi:BPMNEdge>
|
|
494
515
|
<bpmndi:BPMNEdge id="BPMNEdge_f_blockedEnd" bpmnElement="f_blockedEnd">
|
|
495
|
-
<di:waypoint x="
|
|
496
|
-
<di:waypoint x="
|
|
497
|
-
<di:waypoint x="
|
|
516
|
+
<di:waypoint x="2516" y="440" />
|
|
517
|
+
<di:waypoint x="2634" y="440" />
|
|
518
|
+
<di:waypoint x="2634" y="138" />
|
|
498
519
|
</bpmndi:BPMNEdge>
|
|
499
520
|
<bpmndi:BPMNEdge id="BPMNEdge_f_toEndConverged" bpmnElement="f_toEndConverged">
|
|
500
|
-
<di:waypoint x="
|
|
501
|
-
<di:waypoint x="
|
|
502
|
-
<di:waypoint x="
|
|
521
|
+
<di:waypoint x="2516" y="280" />
|
|
522
|
+
<di:waypoint x="2634" y="280" />
|
|
523
|
+
<di:waypoint x="2634" y="138" />
|
|
503
524
|
</bpmndi:BPMNEdge>
|
|
504
525
|
<bpmndi:BPMNEdge id="BPMNEdge_w_sla" bpmnElement="w_sla">
|
|
505
|
-
<di:waypoint x="
|
|
506
|
-
<di:waypoint x="
|
|
507
|
-
<di:waypoint x="
|
|
508
|
-
<di:waypoint x="
|
|
526
|
+
<di:waypoint x="1566" y="338" />
|
|
527
|
+
<di:waypoint x="1566" y="358" />
|
|
528
|
+
<di:waypoint x="1916" y="358" />
|
|
529
|
+
<di:waypoint x="1916" y="160" />
|
|
509
530
|
<bpmndi:BPMNLabel>
|
|
510
|
-
<dc:Bounds x="
|
|
531
|
+
<dc:Bounds x="1757" y="325" width="88" height="28" />
|
|
511
532
|
</bpmndi:BPMNLabel>
|
|
512
533
|
</bpmndi:BPMNEdge>
|
|
513
534
|
<bpmndi:BPMNEdge id="BPMNEdge_w_answerLoop" bpmnElement="w_answerLoop">
|
|
514
|
-
<di:waypoint x="
|
|
515
|
-
<di:waypoint x="
|
|
535
|
+
<di:waypoint x="1741" y="305" />
|
|
536
|
+
<di:waypoint x="1741" y="360" />
|
|
516
537
|
<di:waypoint x="816" y="360" />
|
|
517
538
|
<di:waypoint x="816" y="160" />
|
|
518
539
|
<bpmndi:BPMNLabel>
|
|
519
|
-
<dc:Bounds x="
|
|
540
|
+
<dc:Bounds x="1254" y="338" width="49" height="14" />
|
|
520
541
|
</bpmndi:BPMNLabel>
|
|
521
542
|
</bpmndi:BPMNEdge>
|
|
522
543
|
</bpmndi:BPMNPlane>
|