Set Assignee when Task is completed

For audit purposes we need to know who completed a task.
What is the best way to enforce that a task has an assignee before it is completed?

I have tried using a TaskListener to set the assignee - triggered when the task is completed, but the assignee is null when I retrieve the HistoricTaskInstance. I wonder if the instance is completed before the listener updates the assignee? Shouldn’t all the listeners need to run before the flow is moved on?

If you used a task listener, did you remember to call save() on the task?

No I didn’t - but it working well now.
Thanks.