According to The TeXbook, the rule for end-of-lines is as follows
If TeX sees an end-of-line character (category 5), it throws away
any other information that might remain on the current line. Then if
TeX is in state N (new line), the end-of-line character is
converted to the control sequence token \par
(end of
paragraph); if TeX is in state M (mid-line), the end-of-line
character is converted to a token for character 32 ( ) of
category 10 (space); and if TeX is in state S (skipping
blanks), the end-of-line character is simply dropped.
Here, it's important to note that the TeX inserts the \par
token, and not the \par
primitive. That means that \par
has to be defined under all circumstances. Knuth illustrates this point when discussing commands which force horizontal mode:
The appearance of a <vertical command> in restricted horizontal mode
is forbidden, but in regular horizontal mode it causes TeX to insert
the token \par
into the input; after reading and expanding this
\par
token, TeX will see the <vertical command> token again.
(The current meaning of the control sequence \par
will be used;
\par
might no longer stand for TeX's \par
primitive.)
Now, what does not seem to be mentioned anywhere is what happens at the end of internal vertical mode. Clearly, the rules above do not allow for the insertion of a \par
token as there are no end-of-line markers to deal with. (You do get a \par
inserted if there is a blank line between the last material in the \vbox
and the end of the box.)
Reading the trace output, there is no mention of the \par
primitive at the end of the box, but the shipout does show
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
and of course there is clearly a paragraph built. So my conclusion is that the end of internal vertical mode implicitly inserts a \par
primitive, and thus inserts the usual end-of-paragraph material and then runs the paragraph builder.