Я бы сделал это так:
Добавить пользовательский логический атрибут commitState (по умолчанию true) для всех узлов в процессе.
Итак, есть 3 узла:
S1 - с commitState = true,
Отчет - с commitState = false,
S2 - с commitState = true
Когда выполнение переходит к S1 из того, что было раньше, движок фиксирует состояние в БД и показывает пользователю, что находится в S1. Затем пользователь выполняет sth, и выполнение переходит к узлу Report, показывает пользователю экран «SubmitReport», но транзакция БД все еще не зафиксирована.
Когда пользователь закрывает браузер в этот момент, в конце концов происходит тайм-аут сеанса, генерируется исключение и в состоянии db откатывается до S1.
Когда пользователь отменяет отчет, мы также можем выбросить исключение и вернуться к S1, но я предпочитаю, чтобы такие переходы были явными в графе процесса, и просто принимали этот переход.
Когда пользователь отправляет отчет, мы переходим к S2, и состояние фиксируется.
Для этого требуется, чтобы транзакция БД могла удерживаться между отображением экранов пользователю - например, в StatefulBean (в jbpm 3 была некоторая ошибка, когда она использовалась из StatefulBean, я не знаю, возможно ли это в новых версиях jbpm, чтобы сделать это).