Problem/Motivation
The one-click "Signal: [branch]" action on the process-instance trace drives a parked token down a chosen outgoing branch. For a node whose guard tests a structured result (a flow condition on attendance.result, validation.result, and the like), the action writes the wrong variable shape, so the token dead-ends: the instance completes with no successor and the side effects that should follow (here, marking the order completed) never run. The order is left in its pre-completion state.
Steps to reproduce
On a parked interaction task whose outgoing flows compare a structured result (the yoyaku_booking "Record attendance" node: result_variable "attendance", guards on "attendance.result"), open the instance trace and click "Signal: attended". The token is consumed, a flat variable named "attendance.result" is written, no outgoing flow matches, and the instance completes. The order stays "confirmed" instead of reaching "completed".
Root cause
OrchestraUiController::signal() writes the branch tested variable directly, as engine->signal(token, [attendance.result => attended]), that is a flat variable literally named "attendance.result". The guard resolver FlowConditionBase::resolve() reads "attendance.result" as a nested path: a variable "attendance" holding a structured result with a "result" element. A real task completion goes through OutcomeSignaler, which writes that nested shape (attendance holds the structured result), so its guard matches. The instance-page action bypasses OutcomeSignaler and writes a flat key, so the guard never matches. The other operator surfaces (UserOperationForm, OperationController) already go through OutcomeSignaler, which is why only this affordance is affected and why it escaped test coverage.
Proposed resolution
Route the branch case of OrchestraUiController::signal() through OutcomeSignaler, passing the parked node definition and the chosen outcome, and recording the current user as the completer, so the instance-page signal behaves exactly like a real completion (correct structured result, completer recorded, task-type variables folded in). Keep a nested-variable fallback for a bare comparison branch on a node with no result variable.
Remaining tasks
- Route OrchestraUiController::signal() through OutcomeSignaler.
- Add a kernel test that signals a structured-result node from the instance trace and asserts the token advances to its successor.
- Verify the yoyaku_booking attendance path completes the order.
User interface changes
None.
Issue fork orchestra-3612854
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #5
mably commented