Phase B: interaction task (render an interaction as a task body)
Phase B of #3607035 (the interaction-gateway plan): the interaction_task type, so an interaction plugin can be the work of a human task.
Stacks on Phase A (!245) — until !245 merges this MR's diff includes it; merge !245 first for a clean Phase B diff.
New orchestra_task_interaction bridge submodule (parallel to orchestra_content's entity_form):
interaction_taskTaskType — parks and creates a work item like a user task (reusing assignment, outcomes, the inbox viaHumanTaskConfigTrait).AssignmentResumer/AssignmentGateway— the identity doorway: completes the work item underuserCanAct()(assignment is the authorization, never a bearer token), with task-route URLs for the interaction context.InteractionTaskForm+ route — renders the node's interaction plugin as the task body under the assignment gateway, with outcome buttons that complete the work item.- Interface refinement (carried from the foundation commit):
InteractionResumerInterfacesplit from the gateway,resume()generalized tomixed.
Verified:
- Kernel
InteractionTaskTest— parks + creates the work item, the assignee completes (outcome to the result variable, token advances), a non-assignee is refused. - Functional
InteractionTaskFormTest— over real HTTP, the assignee opens the task, the message interaction renders as the body, submitting the outcome completes the task; a non-candidate sees the generic refusal and no buttons.
Scope note: render-array interactions (message) render in the task today. Interactions that hand off via a redirect (webform, external redirect) need the continuation-handle work (the planned Phase C) to complete under identity; the form embeds render-array responses for now.
phpcs, phpstan and cspell clean.