The first time a ticket comes back from QA, the cause is almost always the ticket. The second time the same ticket comes back, the cause is the PM. There is no third category.
The first bounce is a writing problem the PM can fix by rewriting the AC. The second bounce is the PM deciding to argue with QA instead — re-explaining, clarifying in chat, adding a comment. The ticket itself never gets rewritten, the contract stays ambiguous, and the work bounces again for the same reason.
Pyloq surfaces the second bounce as a flag, not a notification. After the second return, the instruction is not "tell the developer again." It is "rewrite the acceptance criteria, or pull the ticket." The fix, by then, is no longer to the code.