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_task TaskType — parks and creates a work item like a user task (reusing assignment, outcomes, the inbox via HumanTaskConfigTrait).
  • AssignmentResumer / AssignmentGateway — the identity doorway: completes the work item under userCanAct() (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): InteractionResumerInterface split from the gateway, resume() generalized to mixed.

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.

Merge request reports

Loading