The review-participant recovery writer left the queued run's responsible
user unresolved. Give this writer the same shape as the sibling
immediate-recovery writer: the application layer resolves the responsible
user before it calls the port, and it fails the recovery explicitly when
no value resolves, instead of queuing an unowned run.
- Build the review-participant context snapshot in the application layer,
resolve the responsible user against it, and throw a
WakeQueueApplicationError with code responsible_user_unresolved when the
value does not resolve.
- Require contextSnapshot and responsibleUserId on the
queueReviewParticipantRecoveryRun port input.
- Persist the caller-resolved value on the heartbeatRuns insert. The
adapter still derives the two stage fields it alone can compute, and
merges them onto the same context snapshot object the caller resolved
against, so a marker the resolver stamped on that object survives onto
the persisted row.
- Remove the code comment that explained and accepted the null value; the
writer no longer produces one.
- Add focused tests: the resolve-before-queue order, the throw with no
queue call, the same-object identity between the resolve call and the
queue call, and the resolver's marker surviving the persisted row.
Co-authored-by: Paperclip <noreply@paperclip.ing>