Instead, this seems to work:
TRAPDEBUG() { case "$WIDGET" in zle-line-finish) zle reset-prompt ;; *) ;; esac }
This updates the prompt after "enter" is pressed, but before the command is executed.