The fish_postexec event is documented as being emitted "right after executing an interactive command" and is noted to also be executed when an invalid command is entered (e.g. command not found).
However, in implementation the event is emitted too generously, e.g.
~> <ENTER>
fish_postexec called
~>
There's already a fish_prompt that is called each time the prompt is displayed.