|
34 | 34 | "bridge_adapters": { |
35 | 35 | "workflow_type": "parity.v1.bridge", |
36 | 36 | "empty_blob": "wwHioz3/VYAiNwwA", |
37 | | - "published_defects": { |
38 | | - "update_skips_external_admission": { |
39 | | - "issue": "https://github.com/durable-workflow/server/issues/747", |
40 | | - "summary": "BridgeAdapterController::updateWorkflow calls WorkflowControlPlane::update directly and skips ExternalWorkflowUpdateAdmission, which WorkflowController::update tries first, so a bridge update to a workflow served by an SDK worker is rejected workflow_definition_unavailable and recorded as UpdateRejected, and its replay is rejected again.", |
41 | | - "published": { |
42 | | - "update": { |
43 | | - "status": 422, |
44 | | - "response": { |
45 | | - "schema": "durable-workflow.v2.bridge-adapter-outcome.contract", |
46 | | - "version": 1, |
47 | | - "adapter": "acme.crm:v1", |
48 | | - "action": "update_workflow", |
49 | | - "accepted": false, |
50 | | - "outcome": "rejected", |
51 | | - "reason": "workflow_definition_unavailable", |
52 | | - "idempotency_key": "u-2", |
53 | | - "target": { |
54 | | - "workflow_id": "{id}-bra-order", |
55 | | - "update_name": "bump" |
56 | | - }, |
57 | | - "workflow_id": "{id}-bra-order", |
58 | | - "run_id": "run-2", |
59 | | - "control_plane_outcome": "rejected_workflow_definition_unavailable" |
60 | | - } |
61 | | - }, |
62 | | - "update_again": { |
63 | | - "status": 422, |
64 | | - "response": { |
65 | | - "schema": "durable-workflow.v2.bridge-adapter-outcome.contract", |
66 | | - "version": 1, |
67 | | - "adapter": "acme.crm:v1", |
68 | | - "action": "update_workflow", |
69 | | - "accepted": false, |
70 | | - "outcome": "rejected", |
71 | | - "reason": "workflow_definition_unavailable", |
72 | | - "idempotency_key": "u-2", |
73 | | - "target": { |
74 | | - "workflow_id": "{id}-bra-order", |
75 | | - "update_name": "bump" |
76 | | - }, |
77 | | - "workflow_id": "{id}-bra-order", |
78 | | - "run_id": "run-2", |
79 | | - "control_plane_outcome": "rejected_workflow_definition_unavailable" |
80 | | - } |
81 | | - }, |
82 | | - "history_event_types": [ |
83 | | - "StartAccepted", |
84 | | - "WorkflowStarted", |
85 | | - "StartAccepted", |
86 | | - "StartRejected", |
87 | | - "SignalWaitOpened", |
88 | | - "SignalReceived", |
89 | | - "SignalReceived", |
90 | | - "UpdateRejected", |
91 | | - "UpdateRejected", |
92 | | - "UpdateRejected" |
93 | | - ] |
94 | | - } |
95 | | - }, |
96 | | - "foreign_instance_names_type": { |
97 | | - "issue": "https://github.com/durable-workflow/server/issues/777", |
98 | | - "summary": "DefaultWorkflowControlPlane::reserveInstance checks a reserved instance's type before its namespace, so a bridge start for an id another namespace holds is refused with that namespace's durable type named, and with a different-namespace message when the types match. Native checks the namespace first and refuses a foreign instance as unavailable, naming neither.", |
99 | | - "published": { |
100 | | - "start_other_type": { |
101 | | - "status": 422, |
102 | | - "response": { |
103 | | - "schema": "durable-workflow.v2.bridge-adapter-outcome.contract", |
104 | | - "version": 1, |
105 | | - "adapter": "acme.crm:v1", |
106 | | - "action": "start_workflow", |
107 | | - "accepted": false, |
108 | | - "outcome": "rejected", |
109 | | - "reason": "unknown_target", |
110 | | - "idempotency_key": "k-6", |
111 | | - "message": "Workflow instance [{id}] is reserved for durable type [parity.v1.echo] and cannot be reused for [parity.v1.bridge].", |
112 | | - "target": { |
113 | | - "workflow_id": "{id}", |
114 | | - "workflow_type": "parity.v1.bridge", |
115 | | - "task_queue": "{id}-bra-queue" |
116 | | - } |
117 | | - } |
118 | | - }, |
119 | | - "start_other_namespace": { |
120 | | - "status": 422, |
121 | | - "response": { |
122 | | - "schema": "durable-workflow.v2.bridge-adapter-outcome.contract", |
123 | | - "version": 1, |
124 | | - "adapter": "acme.crm:v1", |
125 | | - "action": "start_workflow", |
126 | | - "accepted": false, |
127 | | - "outcome": "rejected", |
128 | | - "reason": "unknown_target", |
129 | | - "idempotency_key": "k-7", |
130 | | - "message": "Workflow instance [{id}] cannot be reused with a different namespace.", |
131 | | - "target": { |
132 | | - "workflow_id": "{id}", |
133 | | - "workflow_type": "parity.v1.echo", |
134 | | - "task_queue": "{id}-bra-queue" |
135 | | - } |
136 | | - } |
137 | | - } |
138 | | - } |
139 | | - }, |
140 | | - "foreign_instance_names_namespace": { |
141 | | - "issue": "https://github.com/durable-workflow/server/issues/777", |
142 | | - "summary": "Published 2.11.5's Core 2.15.1 checks a reserved instance's namespace before its type, but its BridgeAdapterController still echoes the control plane's message, so a bridge start for an id another namespace holds is refused with a different-namespace message whatever its type. Server #811 (after 2.11.5) refuses it as unavailable, naming neither the type nor the namespace.", |
143 | | - "published": { |
144 | | - "start_other_type": { |
145 | | - "status": 422, |
146 | | - "response": { |
147 | | - "schema": "durable-workflow.v2.bridge-adapter-outcome.contract", |
148 | | - "version": 1, |
149 | | - "adapter": "acme.crm:v1", |
150 | | - "action": "start_workflow", |
151 | | - "accepted": false, |
152 | | - "outcome": "rejected", |
153 | | - "reason": "unknown_target", |
154 | | - "idempotency_key": "k-6", |
155 | | - "message": "Workflow instance [{id}] cannot be reused with a different namespace.", |
156 | | - "target": { |
157 | | - "workflow_id": "{id}", |
158 | | - "workflow_type": "parity.v1.bridge", |
159 | | - "task_queue": "{id}-bra-queue" |
160 | | - } |
161 | | - } |
162 | | - }, |
163 | | - "start_other_namespace": { |
164 | | - "status": 422, |
165 | | - "response": { |
166 | | - "schema": "durable-workflow.v2.bridge-adapter-outcome.contract", |
167 | | - "version": 1, |
168 | | - "adapter": "acme.crm:v1", |
169 | | - "action": "start_workflow", |
170 | | - "accepted": false, |
171 | | - "outcome": "rejected", |
172 | | - "reason": "unknown_target", |
173 | | - "idempotency_key": "k-7", |
174 | | - "message": "Workflow instance [{id}] cannot be reused with a different namespace.", |
175 | | - "target": { |
176 | | - "workflow_id": "{id}", |
177 | | - "workflow_type": "parity.v1.echo", |
178 | | - "task_queue": "{id}-bra-queue" |
179 | | - } |
180 | | - } |
181 | | - } |
182 | | - } |
183 | | - } |
184 | | - }, |
185 | 37 | "expected": { |
186 | 38 | "applicable": true, |
187 | 39 | "namespace": "{id}-bra", |
|
628 | 480 | ] |
629 | 481 | } |
630 | 482 | }, |
631 | | - "contract": "Bridge adapter webhooks (BridgeAdapterController) as published Server 2.11.1 serves them, in their own namespace: the adapter name, payload and action refusals (422, the target redacted to its routing fields); start_workflow accepted (202), returned as a duplicate (200) under the default policy, rejected under reject_duplicate (422), with a workflow ID derived from the adapter and the idempotency key when none is given, and on the default queue for an unconfigured type; signal_workflow and update_workflow refused for an unknown workflow or a malformed target, accepted (202), and deduplicated (200) by adapter, action, idempotency key and target name. Run IDs are labels in order of first appearance and derived workflow IDs are checked against PHP's derivation. Two published defects are bounded: a bridge update to an SDK-worker workflow skips external update admission and is rejected workflow_definition_unavailable, and a start for an id another namespace holds names that namespace's type (published 2.11.1 to 2.11.4) or the namespace difference (2.11.5); for each, the published answers or the intended ones (acceptance and deduplication; a foreign instance refused as unavailable) are accepted. Embedded applications have no HTTP bridge adapters." |
| 483 | + "contract": "Bridge adapter webhooks (BridgeAdapterController) as published Server 2.11.7 serves them, in their own namespace: the adapter name, payload and action refusals (422, the target redacted to its routing fields); start_workflow accepted (202), returned as a duplicate (200) under the default policy, rejected under reject_duplicate (422), with a workflow ID derived from the adapter and the idempotency key when none is given, and on the default queue for an unconfigured type; signal_workflow and update_workflow refused for an unknown workflow or a malformed target, accepted (202), and deduplicated (200) by adapter, action, idempotency key and target name. Run IDs are labels in order of first appearance and derived workflow IDs are checked against PHP's derivation. A bridge update to an SDK-worker workflow passes external update admission like the regular update route, so it is accepted and deduplicated, and a start for an id another namespace holds is refused as unavailable, naming neither its type nor its namespace (#747 and #777; published 2.11.1 to 2.11.5 answered both otherwise). Every step compares exactly. Embedded applications have no HTTP bridge adapters." |
632 | 484 | } |
0 commit comments