ba65ce668a
Two review follow-ups on request_review's artifact staging. Staging copies files into attachments/<tid>/ inside the write txn, but the copy is a filesystem side effect the rollback cannot undo. When a later step in the same txn raised (anything other than ArtifactPreservationError, e.g. run bookkeeping), the task correctly stayed `running` but the copy leaked, so the retry staged `a_1.txt` beside an orphan `a.txt`. _stage_completion_artifacts now returns the copies and request_review discards them on any exception around the txn, reusing the same unlink/rmdir logic the staging helper already had. complete_task is left alone: its txn has a different shape (the early-return paths and acceptance recording) and its cleanup runs the scratch workspace anyway, so it was not the identical one-line change. The notifier unions payload['artifacts'] with paths parsed from the summary prose and dedupes by full path only. For `review_requested` the scratch original still exists (the reviewer's completion is what deletes it), so a summary naming the original uploaded the file twice: staged copy and original. Prose-parsed paths whose basename matches a staged artifact are now skipped; `completed` delivery is unaffected in practice because there the original is already gone by delivery time.