Depends on how it died. Two cases, and from the queue they look nothing alike.
Killed, connection closed. The server process was waiting for the next command, sees the connection go, and rolls back the open transaction. The row lock goes with it. status is still 'queued', and the next poll from any worker takes the row. One job, two runs.
Hung, connection still up. The session sits idle in transaction, the row stays locked, and every other worker's SKIP LOCKED walks around it on every poll for as long as the session lives. That's one job parked and invisible, and with N hung workers it's N jobs. idle_in_transaction_session_timeout exists for this and is off by default.
So count on a job running more than once. Its external effect has to survive the repeat.