Replace fragile constraint-name string match in isDuplicateDocumentViolation() with a check on PSQLException.getSQLState() == "23505" (unique_violation), so constraint renames can never silently break the 409 response. Update and extend JourneyItemServiceTest to use real PSQLException wrapping in all DIVE scenarios. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>